Skip to content

Commit ff11b93

Browse files
authored
[RISCV] Correct the CFA offsets for stack probing. (#166616)
We need to take into account that we may have already done a FirstSPAdjust. Fixes #164805.
1 parent 43b69e7 commit ff11b93

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,8 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
789789

790790
// Unroll the probe loop depending on the number of iterations.
791791
if (Offset < ProbeSize * 5) {
792+
uint64_t CFAAdjust = RealStackSize - Offset;
793+
792794
uint64_t CurrentOffset = 0;
793795
while (CurrentOffset + ProbeSize <= Offset) {
794796
RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
@@ -802,15 +804,15 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
802804

803805
CurrentOffset += ProbeSize;
804806
if (EmitCFI)
805-
CFIBuilder.buildDefCFAOffset(CurrentOffset);
807+
CFIBuilder.buildDefCFAOffset(CurrentOffset + CFAAdjust);
806808
}
807809

808810
uint64_t Residual = Offset - CurrentOffset;
809811
if (Residual) {
810812
RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
811813
StackOffset::getFixed(-Residual), Flag, getStackAlign());
812814
if (EmitCFI)
813-
CFIBuilder.buildDefCFAOffset(Offset);
815+
CFIBuilder.buildDefCFAOffset(RealStackSize);
814816

815817
if (DynAllocation) {
816818
// s[d|w] zero, 0(sp)

llvm/test/CodeGen/RISCV/rvv/stack-probing-dynamic.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,9 @@ define void @reserved_call_frame(i64 %n) #0 {
460460
; RV64I-NEXT: lui a0, 1
461461
; RV64I-NEXT: sub sp, sp, a0
462462
; RV64I-NEXT: sd zero, 0(sp)
463-
; RV64I-NEXT: .cfi_def_cfa_offset 4096
463+
; RV64I-NEXT: .cfi_def_cfa_offset 6128
464464
; RV64I-NEXT: addi sp, sp, -48
465-
; RV64I-NEXT: .cfi_def_cfa_offset 4144
465+
; RV64I-NEXT: .cfi_def_cfa_offset 6176
466466
; RV64I-NEXT: lui a0, 1
467467
; RV64I-NEXT: add a0, sp, a0
468468
; RV64I-NEXT: call callee_stack_args
@@ -485,9 +485,9 @@ define void @reserved_call_frame(i64 %n) #0 {
485485
; RV32I-NEXT: lui a0, 1
486486
; RV32I-NEXT: sub sp, sp, a0
487487
; RV32I-NEXT: sw zero, 0(sp)
488-
; RV32I-NEXT: .cfi_def_cfa_offset 4096
488+
; RV32I-NEXT: .cfi_def_cfa_offset 6128
489489
; RV32I-NEXT: addi sp, sp, -80
490-
; RV32I-NEXT: .cfi_def_cfa_offset 4176
490+
; RV32I-NEXT: .cfi_def_cfa_offset 6208
491491
; RV32I-NEXT: lui a0, 1
492492
; RV32I-NEXT: addi a0, a0, 36
493493
; RV32I-NEXT: add a0, sp, a0

0 commit comments

Comments
 (0)