Skip to content

Commit cf5c6a4

Browse files
authored
Do not enregister Return SP check (#59759)
1 parent 8dd058a commit cf5c6a4

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/coreclr/jit/compiler.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4665,7 +4665,8 @@ void Compiler::compCompile(void** methodCodePtr, uint32_t* methodCodeSize, JitFl
46654665
#if defined(DEBUG) && defined(TARGET_XARCH)
46664666
if (opts.compStackCheckOnRet)
46674667
{
4668-
lvaReturnSpCheck = lvaGrabTempWithImplicitUse(false DEBUGARG("ReturnSpCheck"));
4668+
lvaReturnSpCheck = lvaGrabTempWithImplicitUse(false DEBUGARG("ReturnSpCheck"));
4669+
lvaSetVarDoNotEnregister(lvaReturnSpCheck, DoNotEnregisterReason::ReturnSpCheck);
46694670
lvaTable[lvaReturnSpCheck].lvType = TYP_I_IMPL;
46704671
}
46714672
#endif // defined(DEBUG) && defined(TARGET_XARCH)
@@ -9825,6 +9826,10 @@ void Compiler::EnregisterStats::RecordLocal(const LclVarDsc* varDsc)
98259826
m_blockOpRet++;
98269827
break;
98279828

9829+
case DoNotEnregisterReason::ReturnSpCheck:
9830+
m_returnSpCheck++;
9831+
break;
9832+
98289833
default:
98299834
unreached();
98309835
break;
@@ -9945,6 +9950,7 @@ void Compiler::EnregisterStats::Dump(FILE* fout) const
99459950
PRINT_STATS(m_oneAsgRetyping, notEnreg);
99469951
PRINT_STATS(m_swizzleArg, notEnreg);
99479952
PRINT_STATS(m_blockOpRet, notEnreg);
9953+
PRINT_STATS(m_returnSpCheck, notEnreg);
99489954

99499955
fprintf(fout, "\nAddr exposed details:\n");
99509956
if (m_addrExposed == 0)

src/coreclr/jit/compiler.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,8 @@ enum class DoNotEnregisterReason
388388
StoreBlkSrc, // the local is used as STORE_BLK source.
389389
OneAsgRetyping, // fgMorphOneAsgBlockOp prevents this local from being enregister.
390390
SwizzleArg, // the local is passed using LCL_FLD as another type.
391-
BlockOpRet // the struct is returned and it promoted or there is a cast.
391+
BlockOpRet, // the struct is returned and it promoted or there is a cast.
392+
ReturnSpCheck // the local is used to do SP check
392393
};
393394

394395
enum class AddressExposedReason
@@ -10301,6 +10302,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1030110302
unsigned m_oneAsgRetyping;
1030210303
unsigned m_swizzleArg;
1030310304
unsigned m_blockOpRet;
10305+
unsigned m_returnSpCheck;
1030410306
unsigned m_liveInOutHndlr;
1030510307
unsigned m_depField;
1030610308
unsigned m_noRegVars;

src/coreclr/jit/lclvars.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2664,6 +2664,10 @@ void Compiler::lvaSetVarDoNotEnregister(unsigned varNum DEBUGARG(DoNotEnregister
26642664
JITDUMP("return uses a block op\n");
26652665
break;
26662666

2667+
case DoNotEnregisterReason::ReturnSpCheck:
2668+
JITDUMP("Used for SP check\n");
2669+
break;
2670+
26672671
default:
26682672
unreached();
26692673
break;

0 commit comments

Comments
 (0)