diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 4be262df8552e3..ec344899439fa1 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -10859,7 +10859,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX struct ShadowParamVarInfo { FixedBitVect* assignGroup; // the closure set of variables whose values depend on each other - unsigned shadowCopy; // Lcl var num, valid only if not set to NO_SHADOW_COPY + unsigned shadowCopy; // Lcl var num, if not valid set to BAD_VAR_NUM static bool mayNeedShadowCopy(LclVarDsc* varDsc) { diff --git a/src/coreclr/jit/copyprop.cpp b/src/coreclr/jit/copyprop.cpp index 058eb35c8935af..ab29e9889a7287 100644 --- a/src/coreclr/jit/copyprop.cpp +++ b/src/coreclr/jit/copyprop.cpp @@ -161,7 +161,7 @@ void Compiler::optCopyProp(Statement* stmt, } if ((gsShadowVarInfo != nullptr) && newLclVarDsc->lvIsParam && - (gsShadowVarInfo[newLclNum].shadowCopy == lclNum)) + (gsShadowVarInfo[newLclNum].shadowCopy != BAD_VAR_NUM)) { continue; } @@ -172,11 +172,6 @@ void Compiler::optCopyProp(Statement* stmt, continue; } - if (newLclDefNode->TypeGet() != tree->TypeGet()) - { - continue; - } - ValueNum lclDefVN = varDsc->GetPerSsaData(tree->GetSsaNum())->m_vnPair.GetConservative(); if (newLclDefVN != lclDefVN) { @@ -226,6 +221,17 @@ void Compiler::optCopyProp(Statement* stmt, continue; } + var_types newLclType = newLclVarDsc->TypeGet(); + if (!newLclVarDsc->lvNormalizeOnLoad()) + { + newLclType = genActualType(newLclType); + } + + if (newLclType != tree->TypeGet()) + { + continue; + } + #ifdef DEBUG if (verbose) { diff --git a/src/coreclr/jit/gschecks.cpp b/src/coreclr/jit/gschecks.cpp index 7765231a87551d..60634f60cfcea8 100644 --- a/src/coreclr/jit/gschecks.cpp +++ b/src/coreclr/jit/gschecks.cpp @@ -32,8 +32,6 @@ void Compiler::gsGSChecksInitCookie() info.compCompHnd->getGSCookie(&gsGlobalSecurityCookieVal, &gsGlobalSecurityCookieAddr); } -const unsigned NO_SHADOW_COPY = UINT_MAX; - /***************************************************************************** * gsCopyShadowParams * The current function has an unsafe buffer on the stack. Search for vulnerable @@ -368,7 +366,7 @@ void Compiler::gsParamsToShadows() for (UINT lclNum = 0; lclNum < lvaOldCount; lclNum++) { LclVarDsc* varDsc = lvaGetDesc(lclNum); - gsShadowVarInfo[lclNum].shadowCopy = NO_SHADOW_COPY; + gsShadowVarInfo[lclNum].shadowCopy = BAD_VAR_NUM; // Only care about params whose values are on the stack if (!ShadowParamVarInfo::mayNeedShadowCopy(varDsc)) @@ -452,7 +450,7 @@ void Compiler::gsParamsToShadows() unsigned int lclNum = tree->AsLclVarCommon()->GetLclNum(); unsigned int shadowLclNum = m_compiler->gsShadowVarInfo[lclNum].shadowCopy; - if (shadowLclNum != NO_SHADOW_COPY) + if (shadowLclNum != BAD_VAR_NUM) { LclVarDsc* varDsc = m_compiler->lvaGetDesc(lclNum); assert(ShadowParamVarInfo::mayNeedShadowCopy(varDsc)); @@ -492,7 +490,7 @@ void Compiler::gsParamsToShadows() const LclVarDsc* varDsc = lvaGetDesc(lclNum); const unsigned shadowVarNum = gsShadowVarInfo[lclNum].shadowCopy; - if (shadowVarNum == NO_SHADOW_COPY) + if (shadowVarNum == BAD_VAR_NUM) { continue; } @@ -544,7 +542,7 @@ void Compiler::gsParamsToShadows() const LclVarDsc* varDsc = lvaGetDesc(lclNum); const unsigned shadowVarNum = gsShadowVarInfo[lclNum].shadowCopy; - if (shadowVarNum == NO_SHADOW_COPY) + if (shadowVarNum == BAD_VAR_NUM) { continue; }