Skip to content

Commit 229abfc

Browse files
[release/6.0] Port #58410: Fix zero initialization use of "initReg" (#62207)
If the only local is an enregistered must-init struct, we were setting `initReg` to its register (in this case, `xmm0`). However, `initReg` is expected to be an integer register. In the test case, with GS cookie stress, the GS cookie code asserted that `initReg` was an integer register, but it wasn't. The fix is the change the condition to use the actual register assigned to the variable (in this case, `xmm0`), not the variable type (here, `TYP_STRUCT`). No spmi asm diffs. Fixes #57911
1 parent 24a7935 commit 229abfc

File tree

4 files changed

+12
-17
lines changed

4 files changed

+12
-17
lines changed

src/coreclr/jit/codegencommon.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -486,13 +486,14 @@ regMaskTP CodeGenInterface::genGetRegMask(const LclVarDsc* varDsc)
486486

487487
assert(varDsc->lvIsInReg());
488488

489-
if (varTypeUsesFloatReg(varDsc->TypeGet()))
489+
regNumber reg = varDsc->GetRegNum();
490+
if (genIsValidFloatReg(reg))
490491
{
491-
regMask = genRegMaskFloat(varDsc->GetRegNum(), varDsc->TypeGet());
492+
regMask = genRegMaskFloat(reg, varDsc->GetRegisterType());
492493
}
493494
else
494495
{
495-
regMask = genRegMask(varDsc->GetRegNum());
496+
regMask = genRegMask(reg);
496497
}
497498
return regMask;
498499
}
@@ -7148,8 +7149,9 @@ void CodeGen::genFnProlog()
71487149

71497150
if (isInReg)
71507151
{
7151-
regMaskTP regMask = genRegMask(varDsc->GetRegNum());
7152-
if (!varDsc->IsFloatRegType())
7152+
regNumber regForVar = varDsc->GetRegNum();
7153+
regMaskTP regMask = genRegMask(regForVar);
7154+
if (!genIsValidFloatReg(regForVar))
71537155
{
71547156
initRegs |= regMask;
71557157

src/coreclr/jit/codegenlinear.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,16 @@ void CodeGen::genInitializeRegisterState()
5151
continue;
5252
}
5353

54-
// Is this a floating-point argument?
55-
if (varDsc->IsFloatRegType())
54+
if (varDsc->lvAddrExposed)
5655
{
5756
continue;
5857
}
5958

60-
noway_assert(!varTypeUsesFloatReg(varDsc->TypeGet()));
61-
6259
// Mark the register as holding the variable
63-
assert(varDsc->GetRegNum() != REG_STK);
64-
if (!varDsc->lvAddrExposed)
60+
regNumber reg = varDsc->GetRegNum();
61+
if (genIsValidIntReg(reg))
6562
{
66-
regSet.verifyRegUsed(varDsc->GetRegNum());
63+
regSet.verifyRegUsed(reg);
6764
}
6865
}
6966
}

src/coreclr/jit/compiler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2170,7 +2170,7 @@ VarName Compiler::compVarName(regNumber reg, bool isFloatReg)
21702170
/* If the variable is not in a register, or not in the register we're looking for, quit. */
21712171
/* Also, if it is a compiler generated variable (i.e. slot# > info.compVarScopesCount), don't bother. */
21722172
if ((varDsc->lvRegister != 0) && (varDsc->GetRegNum() == reg) &&
2173-
(varDsc->IsFloatRegType() || !isFloatReg) && (varDsc->lvSlotNum < info.compVarScopesCount))
2173+
(varDsc->lvSlotNum < info.compVarScopesCount))
21742174
{
21752175
/* check if variable in that register is live */
21762176
if (VarSetOps::IsMember(this, compCurLife, varDsc->lvVarIndex))

src/coreclr/jit/compiler.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -961,10 +961,6 @@ class LclVarDsc
961961
Compiler* pComp,
962962
RefCountState state = RCS_NORMAL,
963963
bool propagate = true);
964-
bool IsFloatRegType() const
965-
{
966-
return varTypeUsesFloatReg(lvType) || lvIsHfaRegArg();
967-
}
968964

969965
var_types GetHfaType() const
970966
{

0 commit comments

Comments
 (0)