Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Copy propagation tweaking #64378

Merged
merged 4 commits into from
Feb 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
18 changes: 12 additions & 6 deletions src/coreclr/jit/copyprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down
10 changes: 4 additions & 6 deletions src/coreclr/jit/gschecks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down