Skip to content

Commit 69586a9

Browse files
toppercdyung
authored andcommitted
[RISCV] Correct the CFA offsets for stack probing. (llvm#166616)
We need to take into account that we may have already done a FirstSPAdjust. Fixes llvm#164805. (cherry picked from commit ff11b93)
1 parent 2fde0df commit 69586a9

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
@@ -768,6 +768,8 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
768768

769769
// Unroll the probe loop depending on the number of iterations.
770770
if (Offset < ProbeSize * 5) {
771+
uint64_t CFAAdjust = RealStackSize - Offset;
772+
771773
uint64_t CurrentOffset = 0;
772774
while (CurrentOffset + ProbeSize <= Offset) {
773775
RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
@@ -781,15 +783,15 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
781783

782784
CurrentOffset += ProbeSize;
783785
if (EmitCFI)
784-
CFIBuilder.buildDefCFAOffset(CurrentOffset);
786+
CFIBuilder.buildDefCFAOffset(CurrentOffset + CFAAdjust);
785787
}
786788

787789
uint64_t Residual = Offset - CurrentOffset;
788790
if (Residual) {
789791
RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
790792
StackOffset::getFixed(-Residual), Flag, getStackAlign());
791793
if (EmitCFI)
792-
CFIBuilder.buildDefCFAOffset(Offset);
794+
CFIBuilder.buildDefCFAOffset(RealStackSize);
793795

794796
if (DynAllocation) {
795797
// 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)