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