diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index 5451fe563541ba..6e33d18389e3c8 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -402,6 +402,9 @@ CodeGen::CodeGen(Compiler* theCompiler) m_cgEmitter->codeGen = this; m_cgEmitter->gcInfo = &gcInfo; + // On wasm this is never set by register allocation, so initialize it here. + calleeRegArgMaskLiveIn = RBM_NONE; + #ifdef DEBUG setVerbose(m_compiler->verbose); #endif // DEBUG @@ -3415,6 +3418,11 @@ void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) } #endif + if (calleeRegArgMaskLiveIn == RBM_NONE) + { + return; + } + regMaskTP paramRegs = calleeRegArgMaskLiveIn; if (m_compiler->opts.OptimizationDisabled()) { @@ -5834,10 +5842,7 @@ void CodeGen::genFnProlog() genHomeStackPartOfSplitParameter(initReg, &initRegZeroed); - if (calleeRegArgMaskLiveIn != RBM_NONE) - { - genHomeRegisterParams(initReg, &initRegZeroed); - } + genHomeRegisterParams(initReg, &initRegZeroed); // Home the incoming arguments. genEnregisterIncomingStackArgs(); diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 9e62ace9d85c97..934e6b3270c950 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -291,6 +291,7 @@ void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) assert(segment.IsPassedInRegister()); LclVarDsc* varDsc = m_compiler->lvaGetDesc(lclNum); + // Skip homing parameters that are dead at method entry (not live into the first block). if (varDsc->lvTracked && !VarSetOps::IsMember(m_compiler, m_compiler->fgFirstBB->bbLiveIn, varDsc->lvVarIndex)) { return;