diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index 174c19e327b7ef..d29b738b009b2a 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -5924,11 +5924,11 @@ void CodeGen::genFnProlog() // MOV EAX, assert(compiler->lvaVarargsHandleArg == compiler->info.compArgsCount - 1); - GetEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_EAX, compiler->lvaVarargsHandleArg, 0); - regSet.verifyRegUsed(REG_EAX); + GetEmitter()->emitIns_R_S(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_SCRATCH, compiler->lvaVarargsHandleArg, 0); + regSet.verifyRegUsed(REG_SCRATCH); // MOV EAX, [EAX] - GetEmitter()->emitIns_R_AR(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_EAX, REG_EAX, 0); + GetEmitter()->emitIns_R_AR(ins_Load(TYP_I_IMPL), EA_PTRSIZE, REG_SCRATCH, REG_SCRATCH, 0); // EDX might actually be holding something here. So make sure to only use EAX for this code // sequence. @@ -5940,16 +5940,16 @@ void CodeGen::genFnProlog() noway_assert(lastArg->lvFramePointerBased); // LEA EAX, & + EAX - GetEmitter()->emitIns_R_ARR(INS_lea, EA_PTRSIZE, REG_EAX, genFramePointerReg(), REG_EAX, offset); + GetEmitter()->emitIns_R_ARR(INS_lea, EA_PTRSIZE, REG_SCRATCH, genFramePointerReg(), REG_SCRATCH, offset); if (varDsc->lvIsInReg()) { - GetEmitter()->emitIns_Mov(INS_mov, EA_PTRSIZE, varDsc->GetRegNum(), REG_EAX, /* canSkip */ true); + GetEmitter()->emitIns_Mov(INS_mov, EA_PTRSIZE, varDsc->GetRegNum(), REG_SCRATCH, /* canSkip */ true); regSet.verifyRegUsed(varDsc->GetRegNum()); } else { - GetEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_EAX, argsStartVar, 0); + GetEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, REG_SCRATCH, argsStartVar, 0); } } diff --git a/src/coreclr/jit/lsrabuild.cpp b/src/coreclr/jit/lsrabuild.cpp index 5d4a166dd61fbb..d3145322ffa9b1 100644 --- a/src/coreclr/jit/lsrabuild.cpp +++ b/src/coreclr/jit/lsrabuild.cpp @@ -2448,7 +2448,13 @@ void LinearScan::buildIntervals() // do that in the prolog. We handle registers in the prolog and the // stack args in the scratch BB that we have ensured exists. The // handling clobbers REG_SCRATCH, so kill it here. - if ((block == compiler->fgFirstBB) && compiler->lvaHasAnySwiftStackParamToReassemble()) + bool prologUsesScratchReg = compiler->lvaHasAnySwiftStackParamToReassemble(); +#ifdef TARGET_X86 + // On x86, CodeGen::genFnProlog does a varargs preprocessing that uses + // the scratch register. + prologUsesScratchReg |= compiler->info.compIsVarArgs; +#endif + if ((block == compiler->fgFirstBB) && prologUsesScratchReg) { addKillForRegs(genRegMask(REG_SCRATCH), currentLoc + 1); currentLoc += 2;