Skip to content

Commit ec572f2

Browse files
committed
Redesign the frame layout for LoongArch64 to avoid the redundant computation of the stackOffsets.
After the `lvaAssignVirtualFrameOffsetsToLocals`, there is no need to recompute the LclVarDsc's StackOffset within the `lvaFixVirtualFrameOffsets`.
1 parent e658fdf commit ec572f2

File tree

5 files changed

+345
-359
lines changed

5 files changed

+345
-359
lines changed

src/coreclr/jit/codegen.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,6 @@ class CodeGen final : public CodeGenInterface
442442
int fiFunction_CallerSP_to_FP_delta; // Delta between caller SP and the frame pointer in the parent function
443443
// (negative)
444444
int fiSP_to_CalleeSaved_delta; // CalleeSaved register save offset from SP (positive)
445-
int fiCalleeSavedPadding; // CalleeSaved offset padding (positive)
446445
int fiSP_to_PSP_slot_delta; // PSP slot offset from SP (positive)
447446
int fiCallerSP_to_PSP_slot_delta; // PSP slot offset from Caller SP (negative)
448447
int fiSpDelta; // Stack pointer delta (negative)
@@ -1281,7 +1280,6 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
12811280
void genJmpMethod(GenTree* jmp);
12821281
BasicBlock* genCallFinally(BasicBlock* block);
12831282
#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
1284-
// TODO: refactor for LA.
12851283
void genCodeForJumpCompare(GenTreeOpCC* tree);
12861284
#endif
12871285
#if defined(TARGET_ARM64)

src/coreclr/jit/codegencommon.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4922,7 +4922,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
49224922

49234923
GetEmitter()->emitIns_R_AR(ins_Load(lclTyp), size, varDsc->GetRegNum(), genFramePointerReg(), offset);
49244924

4925-
#elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4925+
#elif defined(TARGET_ARM64) || defined(TARGET_RISCV64)
49264926

49274927
// Patchpoint offset is from top of Tier0 frame
49284928
//
@@ -4948,6 +4948,39 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
49484948
// | | | |
49494949
const int offset = stkOffs + tier0FrameSize + osrFrameSize - osrSpToFpDelta;
49504950

4951+
JITDUMP("---OSR--- V%02u (reg) Tier0 virtual offset %d OSR frame size %d OSR sp-fp "
4952+
"delta %d total offset %d (0x%x)\n",
4953+
varNum, stkOffs, osrFrameSize, osrSpToFpDelta, offset, offset);
4954+
4955+
genInstrWithConstant(ins_Load(lclTyp), size, varDsc->GetRegNum(), genFramePointerReg(), offset, initReg);
4956+
*pInitRegZeroed = false;
4957+
4958+
#elif defined(TARGET_LOONGARCH64)
4959+
4960+
// Patchpoint offset is from top of Tier0 frame
4961+
//
4962+
// We need to determine the frame-pointer relative
4963+
// offset for this variable in the osr frame.
4964+
//
4965+
// First get the fp's relative offset within Tier0 frame
4966+
//
4967+
const int tier0FrameOffset = compiler->info.compPatchpointInfo->CalleeSaveRegisters();
4968+
4969+
// then add the OSR frame size
4970+
//
4971+
const int osrFrameSize = genTotalFrameSize();
4972+
4973+
// then subtract OSR SP-FP delta
4974+
//
4975+
const int osrSpToFpDelta = genSPtoFPdelta();
4976+
4977+
// | => tier0 top of frame relative
4978+
// | + => tier0's fp relative offset
4979+
// | | + => osr bottom of frame (sp) relative
4980+
// | | | - => osr fp relative
4981+
// | | | |
4982+
const int offset = stkOffs + tier0FrameOffset + osrFrameSize - osrSpToFpDelta;
4983+
49514984
JITDUMP("---OSR--- V%02u (reg) Tier0 virtual offset %d OSR frame size %d OSR sp-fp "
49524985
"delta %d total offset %d (0x%x)\n",
49534986
varNum, stkOffs, osrFrameSize, osrSpToFpDelta, offset, offset);

0 commit comments

Comments
 (0)