Skip to content

Commit 46e29e5

Browse files
committed
[LoongArch64] redesign the frame layout 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 0df43f2 commit 46e29e5

File tree

5 files changed

+345
-359
lines changed

5 files changed

+345
-359
lines changed

src/coreclr/jit/codegen.h

-2
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

+34-1
Original file line numberDiff line numberDiff line change
@@ -4930,7 +4930,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
49304930

49314931
GetEmitter()->emitIns_R_AR(ins_Load(lclTyp), size, varDsc->GetRegNum(), genFramePointerReg(), offset);
49324932

4933-
#elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
4933+
#elif defined(TARGET_ARM64) || defined(TARGET_RISCV64)
49344934

49354935
// Patchpoint offset is from top of Tier0 frame
49364936
//
@@ -4956,6 +4956,39 @@ void CodeGen::genEnregisterOSRArgsAndLocals()
49564956
// | | | |
49574957
const int offset = stkOffs + tier0FrameSize + osrFrameSize - osrSpToFpDelta;
49584958

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

0 commit comments

Comments
 (0)