Skip to content

Commit 8330db9

Browse files
authored
[RISC-V] Fix initReg usage in genPushCalleeSavedRegisters (#99353)
1 parent ce34357 commit 8330db9

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

src/coreclr/jit/codegenriscv64.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7782,6 +7782,11 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
77827782
{
77837783
assert(compiler->compGeneratingProlog);
77847784

7785+
// The 'initReg' could have been calculated as one of the callee-saved registers (let's say T0, T1 and T2 are in
7786+
// use, so the next possible register is S1, which should be callee-save register). This is fine, as long as we
7787+
// save callee-saved registers before using 'initReg' for the first time. Instead, we can use REG_SCRATCH
7788+
// beforehand. We don't care if REG_SCRATCH will be overwritten, so we'll skip 'RegZeroed check'.
7789+
//
77857790
// Unlike on x86/x64, we can also push float registers to stack
77867791
regMaskTP rsPushRegs = regSet.rsGetModifiedRegsMask() & RBM_CALLEE_SAVED;
77877792

@@ -7894,11 +7899,11 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
78947899
calleeSaveSPDelta = AlignUp((UINT)offset, STACK_ALIGN);
78957900
offset = calleeSaveSPDelta - offset;
78967901

7897-
genStackPointerAdjustment(-calleeSaveSPDelta, initReg, pInitRegZeroed, /* reportUnwindData */ true);
7902+
genStackPointerAdjustment(-calleeSaveSPDelta, REG_SCRATCH, nullptr, /* reportUnwindData */ true);
78987903
}
78997904
else
79007905
{
7901-
genStackPointerAdjustment(-totalFrameSize, initReg, pInitRegZeroed, /* reportUnwindData */ true);
7906+
genStackPointerAdjustment(-totalFrameSize, REG_SCRATCH, nullptr, /* reportUnwindData */ true);
79027907
}
79037908
}
79047909

@@ -7907,6 +7912,8 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe
79077912
genSaveCalleeSavedRegistersHelp(rsPushRegs, offset, 0);
79087913
offset += (int)(genCountBits(rsPushRegs) << 3); // each reg has 8 bytes
79097914

7915+
// From now on, we can safely use initReg.
7916+
79107917
emit->emitIns_R_R_I(INS_sd, EA_PTRSIZE, REG_RA, REG_SPBASE, offset);
79117918
compiler->unwindSaveReg(REG_RA, offset);
79127919

0 commit comments

Comments
 (0)