From d5793f08a4b91534119a15c62aed8f4b52e75aec Mon Sep 17 00:00:00 2001 From: SingleAccretion Date: Fri, 10 Apr 2026 01:39:10 +0300 Subject: [PATCH 1/2] Remove compGeneratingProlog|Epilog --- src/coreclr/jit/codegenarm.cpp | 20 +++++++--------- src/coreclr/jit/codegenarm64.cpp | 16 +++++-------- src/coreclr/jit/codegenarmarch.cpp | 6 ++--- src/coreclr/jit/codegencommon.cpp | 11 ++++----- src/coreclr/jit/codegenloongarch64.cpp | 20 ++++++---------- src/coreclr/jit/codegenriscv64.cpp | 18 +++++---------- src/coreclr/jit/codegenwasm.cpp | 6 +---- src/coreclr/jit/codegenxarch.cpp | 32 +++++++++----------------- src/coreclr/jit/compiler.h | 2 -- src/coreclr/jit/emit.cpp | 23 +++++++++++++----- src/coreclr/jit/emitpub.h | 3 +++ src/coreclr/jit/emitriscv64.cpp | 6 ++--- src/coreclr/jit/emitxarch.cpp | 2 +- src/coreclr/jit/regset.cpp | 10 ++++---- src/coreclr/jit/scopeinfo.cpp | 4 ++-- src/coreclr/jit/unwind.cpp | 12 +++++----- src/coreclr/jit/unwindamd64.cpp | 26 ++++++++++----------- src/coreclr/jit/unwindarm64.cpp | 14 +++++------ src/coreclr/jit/unwindarmarch.cpp | 16 ++++++------- src/coreclr/jit/unwindloongarch64.cpp | 18 +++++++-------- src/coreclr/jit/unwindriscv64.cpp | 18 +++++++-------- src/coreclr/jit/unwindwasm.cpp | 8 +++---- src/coreclr/jit/unwindx86.cpp | 8 +++---- 23 files changed, 138 insertions(+), 161 deletions(-) diff --git a/src/coreclr/jit/codegenarm.cpp b/src/coreclr/jit/codegenarm.cpp index c9dd49197e1106..531456682c4962 100644 --- a/src/coreclr/jit/codegenarm.cpp +++ b/src/coreclr/jit/codegenarm.cpp @@ -1603,7 +1603,7 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -1771,7 +1771,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(arm_Valid_Imm_For_Add_SP(delta)); GetEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, REG_FPBASE, REG_SPBASE, delta); @@ -1805,7 +1805,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (frameSize == 0) { @@ -1906,7 +1906,7 @@ void CodeGen::genPopFltRegs(regMaskTP regMask) // void CodeGen::genFreeLclFrame(unsigned frameSize, /* IN OUT */ bool* pUnwindStarted) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); if (frameSize == 0) return; @@ -2015,7 +2015,7 @@ void CodeGen::genMov32RelocatableImmediate(emitAttr size, BYTE* addr, regNumber */ regMaskTP CodeGen::genStackAllocRegisterMask(unsigned frameSize, regMaskTP maskCalleeSavedFloat) { - assert(m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog() || GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); // We can't do this optimization with callee saved floating point registers because // the stack would be allocated in a wrong spot. @@ -2104,7 +2104,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) bool CodeGen::genCanUsePopToReturn(regMaskTP maskPopRegsInt, bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); if (!jmpEpilog && regSet.rsMaskPreSpillRegs(true) == RBM_NONE) return true; @@ -2114,7 +2114,7 @@ bool CodeGen::genCanUsePopToReturn(regMaskTP maskPopRegsInt, bool jmpEpilog) void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); regMaskTP maskPopRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); regMaskTP maskPopRegsFloat = maskPopRegs & RBM_ALLFLOAT; @@ -2225,8 +2225,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -2287,8 +2285,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) printf("*************** In genFuncletEpilog()\n"); #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - // Just as for the main function, we delay starting the unwind codes until we have // an instruction which we know needs an unwind code. This is to support code like // this: @@ -2422,7 +2418,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); diff --git a/src/coreclr/jit/codegenarm64.cpp b/src/coreclr/jit/codegenarm64.cpp index a74b86cd76587d..a21b035079586a 100644 --- a/src/coreclr/jit/codegenarm64.cpp +++ b/src/coreclr/jit/codegenarm64.cpp @@ -34,7 +34,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void CodeGen::genPopCalleeSavedRegistersAndFreeLclFrame(bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); regMaskTP rsRestoreRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -1387,8 +1387,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -1553,8 +1551,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) printf("*************** In genFuncletEpilog()\n"); #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - bool unwindStarted = false; if (!unwindStarted) @@ -1883,7 +1879,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); @@ -5437,7 +5433,7 @@ void CodeGen::genStoreLclTypeSimd12(GenTreeLclVarCommon* treeNode) // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -5543,7 +5539,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->compIsProfilerHookNeeded()) { @@ -5631,7 +5627,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (delta == 0) { @@ -5673,7 +5669,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (frameSize == 0) { diff --git a/src/coreclr/jit/codegenarmarch.cpp b/src/coreclr/jit/codegenarmarch.cpp index 77f4f89ed3bad1..c3d5f40c4f294d 100644 --- a/src/coreclr/jit/codegenarmarch.cpp +++ b/src/coreclr/jit/codegenarmarch.cpp @@ -580,7 +580,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -4308,7 +4308,7 @@ void CodeGen::genSIMDSplitReturn(GenTree* src, const ReturnTypeDesc* retTypeDesc // void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); #ifdef TARGET_ARM64 // Probe large frames now, if necessary, since genPushCalleeSavedRegisters() will allocate the frame. Note that @@ -4943,8 +4943,6 @@ void CodeGen::genFnEpilog(BasicBlock* block) printf("*************** In genFnEpilog()\n"); #endif // DEBUG - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index 6cc7cb9874d6c8..a6518f8602ff73 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -3577,7 +3577,7 @@ void CodeGen::genEnregisterIncomingStackArgs() // assert(!m_compiler->opts.IsOSR()); - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); unsigned varNum = 0; @@ -3685,7 +3685,7 @@ void CodeGen::genEnregisterIncomingStackArgs() */ void CodeGen::genCheckUseBlockInit() { - assert(!m_compiler->compGeneratingProlog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); unsigned initStkLclCnt = 0; // The number of int-sized stack local variables that need to be initialized (variables // larger than int count for more than 1). @@ -3909,7 +3909,7 @@ void CodeGen::genCheckUseBlockInit() */ void CodeGen::genZeroInitFltRegs(const regMaskTP& initFltRegs, const regMaskTP& initDblRegs, const regNumber& initReg) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); // The first float/double reg that is initialized to 0. So they can be used to // initialize the remaining registers. @@ -4036,7 +4036,7 @@ regNumber CodeGen::genGetZeroReg(regNumber initReg, bool* pInitRegZeroed) // 'false' if initReg was set to a non-zero value, and left unchanged if initReg was not touched. void CodeGen::genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (genUseBlockInit) { @@ -4479,7 +4479,7 @@ void CodeGen::genHomeStackPartOfSplitParameter(regNumber initReg, bool* initRegS void CodeGen::genReportGenericContextArg(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); const bool reportArg = m_compiler->lvaReportParamTypeArg(); @@ -5021,7 +5021,6 @@ void CodeGen::genFinalizeFrame() */ void CodeGen::genFnProlog() { - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); m_compiler->funSetCurrentFunc(0); diff --git a/src/coreclr/jit/codegenloongarch64.cpp b/src/coreclr/jit/codegenloongarch64.cpp index cebfdb45829f35..a6bdcac8143df8 100644 --- a/src/coreclr/jit/codegenloongarch64.cpp +++ b/src/coreclr/jit/codegenloongarch64.cpp @@ -339,7 +339,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -445,8 +445,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -522,8 +520,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - m_compiler->unwindBegEpilog(); int frameSize = genFuncletInfo.fiSpDelta; @@ -626,8 +622,6 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -4326,7 +4320,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -6151,7 +6145,7 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea) void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (delta == 0) { @@ -6184,7 +6178,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (frameSize == 0) { @@ -6536,7 +6530,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) */ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); regMaskTP rsPushRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6659,7 +6653,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); regMaskTP regsToRestoreMask = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6769,7 +6763,7 @@ void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->compIsProfilerHookNeeded()) { diff --git a/src/coreclr/jit/codegenriscv64.cpp b/src/coreclr/jit/codegenriscv64.cpp index b91240d58f3ebb..3bd5e32634070c 100644 --- a/src/coreclr/jit/codegenriscv64.cpp +++ b/src/coreclr/jit/codegenriscv64.cpp @@ -329,7 +329,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -432,8 +432,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -510,8 +508,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - m_compiler->unwindBegEpilog(); int frameSize = genFuncletInfo.fiSpDelta; @@ -613,8 +609,6 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -4131,7 +4125,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -6005,7 +5999,7 @@ void CodeGen::genCodeForSlliUw(GenTreeOp* tree) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(emitter::isValidSimm12(delta)); GetEmitter()->emitIns_R_R_I(INS_addi, EA_PTRSIZE, REG_FPBASE, REG_SPBASE, delta); @@ -6233,7 +6227,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) */ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); regMaskTP rsPushRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6360,7 +6354,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); regMaskTP regsToRestoreMask = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6470,7 +6464,7 @@ void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->compIsProfilerHookNeeded()) { diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 58136ff77820b0..56874485f443e8 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -138,7 +138,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); regNumber spReg = GetStackPointerReg(m_compiler->funCurrentFuncIdx()); if (spReg == REG_NA) { @@ -314,8 +314,6 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - #ifdef DEBUG if (m_compiler->opts.dspCode) printf("\n__epilog:\n"); @@ -408,8 +406,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) // void CodeGen::genFuncletEpilog(BasicBlock* block) { - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - if (block->IsLast() || m_compiler->bbIsFuncletBeg(block->Next())) { instGen(INS_end); diff --git a/src/coreclr/jit/codegenxarch.cpp b/src/coreclr/jit/codegenxarch.cpp index 4cc36d3133fde0..d84c0e2062e298 100644 --- a/src/coreclr/jit/codegenxarch.cpp +++ b/src/coreclr/jit/codegenxarch.cpp @@ -36,7 +36,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -2326,7 +2326,7 @@ void CodeGen::genMultiRegStoreToSIMDLocal(GenTreeLclVar* lclNode) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (delta == 0) { @@ -2360,7 +2360,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (frameSize == 0) { @@ -4097,7 +4097,7 @@ void CodeGen::genClearStackVec3ArgUpperBits() } #endif - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); unsigned varNum = 0; @@ -9508,7 +9508,7 @@ void CodeGen::genAmd64EmitterUnitTestsCTEST() // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -9651,7 +9651,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -9956,7 +9956,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -10033,7 +10033,7 @@ void CodeGen::genOSRSaveRemainingCalleeSavedRegisters() { // We should be generating the prolog of an OSR root frame. // - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -10115,7 +10115,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); #if DEBUG // OSR root frames must handle this differently. See @@ -10259,7 +10259,7 @@ void CodeGen::genPushCalleeSavedRegistersFromMaskAPX(regMaskTP rsPushRegs) void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(m_compiler->compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); #ifdef TARGET_AMD64 @@ -10450,8 +10450,6 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -10921,8 +10919,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(m_compiler->bbIsFuncletBeg(block)); assert(isFramePointerUsed()); - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -10967,8 +10963,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - genClearAvxStateInEpilog(); inst_RV_IV(INS_add, REG_SPBASE, genFuncletInfo.fiSpDelta, EA_PTRSIZE); @@ -11056,8 +11050,6 @@ void CodeGen::genFuncletProlog(BasicBlock* block) } #endif - ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); - gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -11094,8 +11086,6 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif - ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); - genClearAvxStateInEpilog(); #ifdef UNIX_X86_ABI @@ -11136,7 +11126,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 5dd03596daf24f..226b5513f7023c 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -10941,8 +10941,6 @@ class Compiler bool compRegAllocDone = false; bool compRationalIRForm = false; - bool compGeneratingProlog = false; - bool compGeneratingEpilog = false; bool compGeneratingUnwindProlog = false; bool compGeneratingUnwindEpilog = false; diff --git a/src/coreclr/jit/emit.cpp b/src/coreclr/jit/emit.cpp index 7744c36d4b9e13..c43c8e8b3074e9 100644 --- a/src/coreclr/jit/emit.cpp +++ b/src/coreclr/jit/emit.cpp @@ -2012,7 +2012,7 @@ void emitter::emitCheckIGList() void emitter::emitBegProlog() { - assert(m_compiler->compGeneratingProlog); + assert(emitGeneratingPrologOrFuncletProlog()); #if EMIT_TRACK_STACK_DEPTH @@ -2045,12 +2045,13 @@ void emitter::emitBegProlog() /***************************************************************************** * * Mark the code offset of the current location as the end of the prolog, - * so it can be used later to compute the actual size of the prolog. + * so it can be used later to compute the actual size of the prolog for + * GCInfo purposes. We may still generate more code into "prolog" IGs. */ void emitter::emitMarkPrologEnd() { - assert(m_compiler->compGeneratingProlog); + assert(emitGeneratingPrologOrFuncletProlog()); emitPrologEndPos.CaptureLocation(this); } @@ -2061,7 +2062,7 @@ void emitter::emitMarkPrologEnd() void emitter::emitEndProlog() { - assert(m_compiler->compGeneratingProlog); + assert(emitGeneratingPrologOrFuncletProlog()); emitNoGCRequestCount = 0; emitNoGCIG = false; @@ -2366,6 +2367,16 @@ void emitter::emitFinishPrologEpilogGeneration() emitCurIG = nullptr; } +bool emitter::emitGeneratingPrologOrFuncletProlog() const +{ + return emitIGisInProlog(emitCurIG) || emitIGisInFuncletProlog(emitCurIG); +} + +bool emitter::emitGeneratingEpilogOrFuncletEpilog() const +{ + return emitIGisInEpilog(emitCurIG) || emitIGisInFuncletEpilog(emitCurIG); +} + /***************************************************************************** * * Common code for prolog / epilog beginning. Convert the placeholder group to actual code IG, @@ -2612,7 +2623,7 @@ bool emitter::emitHasEpilogEnd() void emitter::emitStartExitSeq() { - assert(m_compiler->compGeneratingEpilog); + assert(emitGeneratingEpilogOrFuncletEpilog()); emitExitSeqBegLoc.CaptureLocation(this); } @@ -2631,7 +2642,7 @@ void emitter::emitStartExitSeq() void emitter::emitSetFrameRangeGCRs(int offsLo, int offsHi) { - assert(m_compiler->compGeneratingProlog); + assert(emitGeneratingPrologOrFuncletProlog()); assert(offsHi > offsLo); #ifdef DEBUG diff --git a/src/coreclr/jit/emitpub.h b/src/coreclr/jit/emitpub.h index cda3839c43341a..124e1c0c776c94 100644 --- a/src/coreclr/jit/emitpub.h +++ b/src/coreclr/jit/emitpub.h @@ -58,6 +58,9 @@ void emitGeneratePrologEpilog(); void emitStartPrologEpilogGeneration(); void emitFinishPrologEpilogGeneration(); +bool emitGeneratingPrologOrFuncletProlog() const; +bool emitGeneratingEpilogOrFuncletEpilog() const; + /************************************************************************/ /* Record a code position and later convert it to offset */ /************************************************************************/ diff --git a/src/coreclr/jit/emitriscv64.cpp b/src/coreclr/jit/emitriscv64.cpp index f1de046359846e..40f09d4d1ae762 100644 --- a/src/coreclr/jit/emitriscv64.cpp +++ b/src/coreclr/jit/emitriscv64.cpp @@ -1010,7 +1010,7 @@ bool emitter::tryEmitCompressedIns_R_R_R( instruction ins, emitAttr attr, regNumber rd, regNumber rs1, regNumber rs2, insOpts opt) { // TODO-RISCV64-RVC: Disable this early return once compresed instructions are allowed in prolog / epilog - if (m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog) + if (emitGeneratingPrologOrFuncletProlog() || emitGeneratingEpilogOrFuncletEpilog()) { return false; } @@ -1634,7 +1634,7 @@ int emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm) int insCountLimit = prefMaxInsCount; // If we are currently generating prolog / epilog, we are currently not inside a method block, therefore, we should // not use the emitDataConst + emitIns_R_C combination. - if (m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog) + if (emitGeneratingPrologOrFuncletProlog() || emitGeneratingEpilogOrFuncletEpilog()) { insCountLimit = absMaxInsCount; } @@ -1861,7 +1861,7 @@ int emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm) { if (doEmit) { - assert(!m_compiler->compGeneratingProlog && !m_compiler->compGeneratingEpilog); + assert(!emitGeneratingPrologOrFuncletProlog() && !emitGeneratingEpilogOrFuncletEpilog()); auto constAddr = emitDataConst(&originalImm, sizeof(long), sizeof(long), TYP_LONG); emitIns_R_C(INS_ld, EA_PTRSIZE, reg, REG_NA, m_compiler->eeFindJitDataOffs(constAddr)); } diff --git a/src/coreclr/jit/emitxarch.cpp b/src/coreclr/jit/emitxarch.cpp index eadf46bb988a87..73180450d21dee 100644 --- a/src/coreclr/jit/emitxarch.cpp +++ b/src/coreclr/jit/emitxarch.cpp @@ -6205,7 +6205,7 @@ void emitter::spillIntArgRegsToShadowSlots() instrDesc* id; UNATIVE_OFFSET sz; - assert(m_compiler->compGeneratingProlog); + assert(emitGeneratingPrologOrFuncletProlog()); for (argNum = 0; argNum < MAX_REG_ARG; ++argNum) { diff --git a/src/coreclr/jit/regset.cpp b/src/coreclr/jit/regset.cpp index 2fcd275641bf46..1b6cdf532072d2 100644 --- a/src/coreclr/jit/regset.cpp +++ b/src/coreclr/jit/regset.cpp @@ -144,8 +144,9 @@ void RegSet::rsSetRegsModified(regMaskTP mask DEBUGARG(bool suppressDump)) // code generation isn't actually adding to set of modified registers. // Frame layout is only affected by callee-saved registers, so only ensure that callee-saved // registers aren't modified after final frame layout. - assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || m_compiler->compGeneratingProlog || - m_compiler->compGeneratingEpilog || + assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || + m_compiler->GetEmitter()->emitGeneratingPrologOrFuncletProlog() || + m_compiler->GetEmitter()->emitGeneratingEpilogOrFuncletEpilog() || (((rsModifiedRegsMask | mask) & RBM_CALLEE_SAVED) == (rsModifiedRegsMask & RBM_CALLEE_SAVED))); #ifdef DEBUG @@ -173,8 +174,9 @@ void RegSet::rsRemoveRegsModified(regMaskTP mask) assert(rsModifiedRegsMaskInitialized); // See comment in rsSetRegsModified(). - assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || m_compiler->compGeneratingProlog || - m_compiler->compGeneratingEpilog || + assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || + m_compiler->GetEmitter()->emitGeneratingPrologOrFuncletProlog() || + m_compiler->GetEmitter()->emitGeneratingEpilogOrFuncletEpilog() || (((rsModifiedRegsMask & ~mask) & RBM_CALLEE_SAVED) == (rsModifiedRegsMask & RBM_CALLEE_SAVED))); #ifdef DEBUG diff --git a/src/coreclr/jit/scopeinfo.cpp b/src/coreclr/jit/scopeinfo.cpp index 9fc32e0fb48798..69497a8cf6b204 100644 --- a/src/coreclr/jit/scopeinfo.cpp +++ b/src/coreclr/jit/scopeinfo.cpp @@ -1688,7 +1688,7 @@ NATIVE_OFFSET CodeGen::psiGetVarStackOffset(const LclVarDsc* lclVarDsc) const // void CodeGen::psiBegProlog() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); m_compiler->compResetScopeLists(); @@ -1756,7 +1756,7 @@ void CodeGen::psiBegProlog() // void CodeGen::psiEndProlog() { - assert(m_compiler->compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); varLiveKeeper->psiClosePrologVariableRanges(); } diff --git a/src/coreclr/jit/unwind.cpp b/src/coreclr/jit/unwind.cpp index 2453fcfc2c954b..34124abe667547 100644 --- a/src/coreclr/jit/unwind.cpp +++ b/src/coreclr/jit/unwind.cpp @@ -133,7 +133,7 @@ void Compiler::createCfiCode(FuncInfoDsc* func, UNATIVE_OFFSET codeOffset, UCHAR void Compiler::unwindPushPopCFI(regNumber reg) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -182,7 +182,7 @@ typedef jitstd::vector CFICodeVector; void Compiler::unwindBegPrologCFI() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -234,10 +234,10 @@ void Compiler::unwindPushPopMaskCFI(regMaskTP regMask, bool isFloat) void Compiler::unwindAllocStackCFI(unsigned size) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = 0; - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { cbProlog = unwindGetCurrentOffset(func); } @@ -253,7 +253,7 @@ void Compiler::unwindAllocStackCFI(unsigned size) // void Compiler::unwindSetFrameRegCFI(regNumber reg, unsigned offset) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -425,7 +425,7 @@ void Compiler::DumpCfiInfo(bool isHotCode, // UNATIVE_OFFSET Compiler::unwindGetCurrentOffset(FuncInfoDsc* func) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); emitLocation* loc = func->startLoc; insGroup* ig = (loc != nullptr) ? loc->GetIG() : nullptr; assert((ig == nullptr) || (loc->GetInsOffset() == 0)); diff --git a/src/coreclr/jit/unwindamd64.cpp b/src/coreclr/jit/unwindamd64.cpp index 87577ee390d853..92519f02b91284 100644 --- a/src/coreclr/jit/unwindamd64.cpp +++ b/src/coreclr/jit/unwindamd64.cpp @@ -150,7 +150,7 @@ void Compiler::unwindBegProlog() void Compiler::unwindBegPrologWindows() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -178,7 +178,7 @@ void Compiler::unwindBegPrologWindows() // void Compiler::unwindEndProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } @@ -189,7 +189,7 @@ void Compiler::unwindEndProlog() // void Compiler::unwindBegEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; } @@ -200,7 +200,7 @@ void Compiler::unwindBegEpilog() // void Compiler::unwindEndEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -248,7 +248,7 @@ void Compiler::unwindPush2(regNumber reg1, regNumber reg2) void Compiler::unwindPushWindows(regNumber reg) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -320,7 +320,7 @@ void Compiler::unwindAllocStack(unsigned size) void Compiler::unwindAllocStackWindows(unsigned size) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -381,7 +381,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) void Compiler::unwindSetFrameRegWindows(regNumber reg, unsigned offset) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -447,7 +447,7 @@ void Compiler::unwindSaveReg(regNumber reg, unsigned offset) void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); FuncInfoDsc* func = funCurrentFunc(); @@ -507,7 +507,7 @@ void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) #ifdef UNIX_AMD64_ABI void Compiler::unwindSaveRegCFI(regNumber reg, unsigned offset) { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); if (RBM_CALLEE_SAVED & genRegMask(reg)) { @@ -695,8 +695,8 @@ void DumpUnwindInfo(bool isHotCode, // void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { @@ -806,8 +806,8 @@ void Compiler::unwindReserveFuncHelper(FuncInfoDsc* func, bool isHotCode) // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindarm64.cpp b/src/coreclr/jit/unwindarm64.cpp index 620438ec644e5a..af6aab195fd296 100644 --- a/src/coreclr/jit/unwindarm64.cpp +++ b/src/coreclr/jit/unwindarm64.cpp @@ -235,7 +235,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindAllocStackCFI(size); } @@ -279,7 +279,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindSetFrameRegCFI(reg, offset); } @@ -351,7 +351,7 @@ void Compiler::unwindSaveRegPair(regNumber reg1, regNumber reg2, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -433,7 +433,7 @@ void Compiler::unwindSaveRegPairPreindexed(regNumber reg1, regNumber reg2, int o #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -522,7 +522,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -576,7 +576,7 @@ void Compiler::unwindSaveRegPreindexed(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -645,7 +645,7 @@ void Compiler::unwindPacSignLR() if (generateCFIUnwindCodes()) { // Emit NEGATE_RA_STATE opcode in prologs. - if (!compGeneratingProlog) + if (!GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { return; } diff --git a/src/coreclr/jit/unwindarmarch.cpp b/src/coreclr/jit/unwindarmarch.cpp index 3c9b87476c5a8c..bec6ed64b6f68f 100644 --- a/src/coreclr/jit/unwindarmarch.cpp +++ b/src/coreclr/jit/unwindarmarch.cpp @@ -137,7 +137,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -166,14 +166,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -189,7 +189,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -398,7 +398,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindAllocStackCFI(size); } @@ -452,7 +452,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindSetFrameRegCFI(reg, offset); } @@ -549,8 +549,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindloongarch64.cpp b/src/coreclr/jit/unwindloongarch64.cpp index e03a66cffc4040..b39f294cb3b5f9 100644 --- a/src/coreclr/jit/unwindloongarch64.cpp +++ b/src/coreclr/jit/unwindloongarch64.cpp @@ -235,7 +235,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindAllocStackCFI(size); } @@ -278,7 +278,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindSetFrameRegCFI(reg, offset); } @@ -346,7 +346,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -890,7 +890,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -919,14 +919,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -942,7 +942,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -967,8 +967,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindriscv64.cpp b/src/coreclr/jit/unwindriscv64.cpp index 6ac86921ad72c1..669cef02ce19fb 100644 --- a/src/coreclr/jit/unwindriscv64.cpp +++ b/src/coreclr/jit/unwindriscv64.cpp @@ -47,7 +47,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindAllocStackCFI(size); } @@ -90,7 +90,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { unwindSetFrameRegCFI(reg, offset); } @@ -158,7 +158,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (compGeneratingProlog) + if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -702,7 +702,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -731,14 +731,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(compGeneratingProlog); + assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -754,7 +754,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(compGeneratingEpilog); + assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -779,8 +779,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindwasm.cpp b/src/coreclr/jit/unwindwasm.cpp index 5e08bcc583fa2d..51b310b581068a 100644 --- a/src/coreclr/jit/unwindwasm.cpp +++ b/src/coreclr/jit/unwindwasm.cpp @@ -40,8 +40,8 @@ void Compiler::unwindAllocStack(unsigned size) // void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { @@ -76,8 +76,8 @@ void Compiler::unwindReserveFunc(FuncInfoDsc* func) // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindx86.cpp b/src/coreclr/jit/unwindx86.cpp index 8b4e3842f6b852..511bfc2797e961 100644 --- a/src/coreclr/jit/unwindx86.cpp +++ b/src/coreclr/jit/unwindx86.cpp @@ -70,8 +70,8 @@ void Compiler::unwindSaveReg(regNumber reg, unsigned offset) // void Compiler::unwindReserve() { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { @@ -88,8 +88,8 @@ void Compiler::unwindReserve() // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!compGeneratingProlog); - assert(!compGeneratingEpilog); + assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); for (FuncInfoDsc* const func : Funcs()) { From 5ff41aa77bc6f2e021b018e7df5912d442b5d5cc Mon Sep 17 00:00:00 2001 From: SingleAccretion Date: Thu, 28 May 2026 20:44:46 +0300 Subject: [PATCH 2/2] Revert "[Wasm RyuJIT] Move genHomeRegisterParams' output out of the prolog (#125398)" This reverts commit 338e288bd9535217764f4146f2fe89707818ac97. --- src/coreclr/jit/codegen.h | 7 ++----- src/coreclr/jit/codegenlinear.cpp | 12 +----------- src/coreclr/jit/codegenwasm.cpp | 25 +++++++------------------ src/coreclr/jit/emit.cpp | 3 +-- 4 files changed, 11 insertions(+), 36 deletions(-) diff --git a/src/coreclr/jit/codegen.h b/src/coreclr/jit/codegen.h index 30df97543bec50..668b958cfe5518 100644 --- a/src/coreclr/jit/codegen.h +++ b/src/coreclr/jit/codegen.h @@ -341,11 +341,8 @@ class CodeGen final : public CodeGenInterface // Prolog functions and data (there are a few exceptions for more generally used things) // - void genEstablishFramePointer(int delta, bool reportUnwindData); - void genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed); -#ifdef TARGET_WASM - void genHomeRegisterParamsOutsideProlog(); -#endif + void genEstablishFramePointer(int delta, bool reportUnwindData); + void genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed); regMaskTP genGetParameterHomingTempRegisterCandidates(); var_types genParamStackType(LclVarDsc* dsc, const ABIPassingSegment& seg); diff --git a/src/coreclr/jit/codegenlinear.cpp b/src/coreclr/jit/codegenlinear.cpp index 00b5ccf2740ac2..e0a7a76a06f368 100644 --- a/src/coreclr/jit/codegenlinear.cpp +++ b/src/coreclr/jit/codegenlinear.cpp @@ -458,19 +458,9 @@ void CodeGen::genCodeForBlock(BasicBlock* block) } #endif -#ifdef TARGET_WASM - // genHomeRegisterParams can generate arbitrary amounts of code on Wasm, so - // we have moved it out of the prolog to the first basic block in order to - // work around the restriction that the prolog can only be one insGroup. - if (block->IsFirst()) - { - genHomeRegisterParamsOutsideProlog(); - } -#endif - #ifndef TARGET_WASM // TODO-WASM: enable genPoisonFrame // Emit poisoning into the init BB that comes right after prolog. - // We cannot emit this code in the prolog as it might make the prolog too large. + // We cannot emit this code in the prolog as it might use a helper call that kills argument regs. if (m_compiler->compShouldPoisonFrame() && block->IsFirst()) { genPoisonFrame(newLiveRegSet); diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 56874485f443e8..34172db9dc90e0 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -211,22 +211,6 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() //------------------------------------------------------------------------ // genHomeRegisterParams: place register arguments into their RA-assigned locations. // -// We can't actually do this task here because the prolog will overflow. Instead, we -// do this later on and inject all the relevant code into the first basic block. -// See genHomeRegisterParamsOutsideProlog, below. -// -// Arguments: -// initReg - Unused -// initRegStillZeroed - Unused -// -void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) -{ - // Intentionally empty -} - -//------------------------------------------------------------------------ -// genHomeRegisterParamsOutsideProlog: place register arguments into their RA-assigned locations. -// // For the WASM RA, we have a much simplified (compared to LSRA) contract of: // - If an argument is live on entry in a set of registers, then the RA will // assign those registers to that argument on entry. @@ -235,9 +219,14 @@ void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) // The main motivation for this (along with the obvious CQ implications) is // obviating the need to adapt the general "RegGraph"-based algorithm to // !HAS_FIXED_REGISTER_SET constraints (no reg masks). -void CodeGen::genHomeRegisterParamsOutsideProlog() +// +// Arguments: +// initReg - Unused +// initRegStillZeroed - Unused +// +void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) { - JITDUMP("*************** In genHomeRegisterParamsOutsideProlog()\n"); + JITDUMP("*************** In genHomeRegisterParams()\n"); auto spillParam = [this](unsigned lclNum, unsigned offset, unsigned paramLclNum, const ABIPassingSegment& segment) { assert(segment.IsPassedInRegister()); diff --git a/src/coreclr/jit/emit.cpp b/src/coreclr/jit/emit.cpp index c43c8e8b3074e9..7c86ef79dc63c8 100644 --- a/src/coreclr/jit/emit.cpp +++ b/src/coreclr/jit/emit.cpp @@ -9935,6 +9935,7 @@ void emitter::emitInitIG(insGroup* ig) sure we act the same in non-DEBUG builds. */ + ig->igData = nullptr; ig->igSize = 0; ig->igGCregs = RBM_NONE; ig->igInsCnt = 0; @@ -9952,8 +9953,6 @@ void emitter::emitInitIG(insGroup* ig) // Explicitly call init, since IGs don't actually have a constructor. ig->igBlocks.jitstd::list::init(m_compiler->getAllocator(CMK_DebugOnly)); #endif - - ig->igData = nullptr; } /*****************************************************************************