[RISCV] Correct the CFA offsets for stack probing. (#166616) · llvm/llvm-project@69586a9 (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -768,6 +768,8 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
768 768
769 769 // Unroll the probe loop depending on the number of iterations.
770 770 if (Offset < ProbeSize * 5) {
771 +uint64_t CFAAdjust = RealStackSize - Offset;
772 +
771 773 uint64_t CurrentOffset = 0;
772 774 while (CurrentOffset + ProbeSize <= Offset) {
773 775 RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
@@ -781,15 +783,15 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
781 783
782 784 CurrentOffset += ProbeSize;
783 785 if (EmitCFI)
784 - CFIBuilder.buildDefCFAOffset(CurrentOffset);
786 + CFIBuilder.buildDefCFAOffset(CurrentOffset + CFAAdjust);
785 787 }
786 788
787 789 uint64_t Residual = Offset - CurrentOffset;
788 790 if (Residual) {
789 791 RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg,
790 792 StackOffset::getFixed(-Residual), Flag, getStackAlign());
791 793 if (EmitCFI)
792 - CFIBuilder.buildDefCFAOffset(Offset);
794 + CFIBuilder.buildDefCFAOffset(RealStackSize);
793 795
794 796 if (DynAllocation) {
795 797 // s[d|w] zero, 0(sp)
Original file line number Diff line number Diff line change
@@ -460,9 +460,9 @@ define void @reserved_call_frame(i64 %n) #0 {
460 460 ; RV64I-NEXT: lui a0, 1
461 461 ; RV64I-NEXT: sub sp, sp, a0
462 462 ; RV64I-NEXT: sd zero, 0(sp)
463 -; RV64I-NEXT: .cfi_def_cfa_offset 4096
463 +; RV64I-NEXT: .cfi_def_cfa_offset 6128
464 464 ; RV64I-NEXT: addi sp, sp, -48
465 -; RV64I-NEXT: .cfi_def_cfa_offset 4144
465 +; RV64I-NEXT: .cfi_def_cfa_offset 6176
466 466 ; RV64I-NEXT: lui a0, 1
467 467 ; RV64I-NEXT: add a0, sp, a0
468 468 ; RV64I-NEXT: call callee_stack_args
@@ -485,9 +485,9 @@ define void @reserved_call_frame(i64 %n) #0 {
485 485 ; RV32I-NEXT: lui a0, 1
486 486 ; RV32I-NEXT: sub sp, sp, a0
487 487 ; RV32I-NEXT: sw zero, 0(sp)
488 -; RV32I-NEXT: .cfi_def_cfa_offset 4096
488 +; RV32I-NEXT: .cfi_def_cfa_offset 6128
489 489 ; RV32I-NEXT: addi sp, sp, -80
490 -; RV32I-NEXT: .cfi_def_cfa_offset 4176
490 +; RV32I-NEXT: .cfi_def_cfa_offset 6208
491 491 ; RV32I-NEXT: lui a0, 1
492 492 ; RV32I-NEXT: addi a0, a0, 36
493 493 ; RV32I-NEXT: add a0, sp, a0