Skip to content

Commit 233c7b1

Browse files
ilovepitopperc
andcommitted
[RISCV] Fix assertion failure when using -fstack-clash-protection
We can't assume MBBI is still pointing at MBB if we've already expanded a probe. We need to re-query the MBB from MBBI. Fixes #135206 Co-authored-by: Craig Topper <[email protected]>
1 parent 36acaa0 commit 233c7b1

File tree

2 files changed

+110
-3
lines changed

2 files changed

+110
-3
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2270,11 +2270,13 @@ TargetStackID::Value RISCVFrameLowering::getStackIDForScalableVectors() const {
22702270
}
22712271

22722272
// Synthesize the probe loop.
2273-
static void emitStackProbeInline(MachineFunction &MF, MachineBasicBlock &MBB,
2274-
MachineBasicBlock::iterator MBBI, DebugLoc DL,
2273+
static void emitStackProbeInline(MachineBasicBlock::iterator MBBI, DebugLoc DL,
22752274
Register TargetReg, bool IsRVV) {
22762275
assert(TargetReg != RISCV::X2 && "New top of stack cannot already be in SP");
22772276

2277+
MachineBasicBlock &MBB = *MBBI->getParent();
2278+
MachineFunction &MF = *MBB.getParent();
2279+
22782280
auto &Subtarget = MF.getSubtarget<RISCVSubtarget>();
22792281
const RISCVInstrInfo *TII = Subtarget.getInstrInfo();
22802282
bool IsRV64 = Subtarget.is64Bit();
@@ -2363,7 +2365,7 @@ void RISCVFrameLowering::inlineStackProbe(MachineFunction &MF,
23632365
MachineBasicBlock::iterator MBBI = MI->getIterator();
23642366
DebugLoc DL = MBB.findDebugLoc(MBBI);
23652367
Register TargetReg = MI->getOperand(1).getReg();
2366-
emitStackProbeInline(MF, MBB, MBBI, DL, TargetReg,
2368+
emitStackProbeInline(MBBI, DL, TargetReg,
23672369
(MI->getOpcode() == RISCV::PROBED_STACKALLOC_RVV));
23682370
MBBI->eraseFromParent();
23692371
}

llvm/test/CodeGen/RISCV/pr135206.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple riscv64 < %s -o - | FileCheck %s
3+
4+
%"buff" = type { [4096 x i64] }
5+
6+
declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
7+
declare void @bar()
8+
9+
define i1 @foo() #0 {
10+
; CHECK-LABEL: foo:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: addi sp, sp, -2032
13+
; CHECK-NEXT: .cfi_def_cfa_offset 2032
14+
; CHECK-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill
15+
; CHECK-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill
16+
; CHECK-NEXT: sd s1, 2008(sp) # 8-byte Folded Spill
17+
; CHECK-NEXT: sd s2, 2000(sp) # 8-byte Folded Spill
18+
; CHECK-NEXT: sd s3, 1992(sp) # 8-byte Folded Spill
19+
; CHECK-NEXT: .cfi_offset ra, -8
20+
; CHECK-NEXT: .cfi_offset s0, -16
21+
; CHECK-NEXT: .cfi_offset s1, -24
22+
; CHECK-NEXT: .cfi_offset s2, -32
23+
; CHECK-NEXT: .cfi_offset s3, -40
24+
; CHECK-NEXT: lui a0, 7
25+
; CHECK-NEXT: sub t1, sp, a0
26+
; CHECK-NEXT: .cfi_def_cfa t1, 28672
27+
; CHECK-NEXT: lui t2, 1
28+
; CHECK-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
29+
; CHECK-NEXT: sub sp, sp, t2
30+
; CHECK-NEXT: sd zero, 0(sp)
31+
; CHECK-NEXT: bne sp, t1, .LBB0_1
32+
; CHECK-NEXT: # %bb.2:
33+
; CHECK-NEXT: .cfi_def_cfa_register sp
34+
; CHECK-NEXT: addi sp, sp, -2048
35+
; CHECK-NEXT: addi sp, sp, -96
36+
; CHECK-NEXT: .cfi_def_cfa_offset 30816
37+
; CHECK-NEXT: csrr t1, vlenb
38+
; CHECK-NEXT: .cfi_def_cfa t1, -8
39+
; CHECK-NEXT: lui t2, 1
40+
; CHECK-NEXT: .LBB0_3: # =>This Inner Loop Header: Depth=1
41+
; CHECK-NEXT: sub sp, sp, t2
42+
; CHECK-NEXT: sd zero, 0(sp)
43+
; CHECK-NEXT: sub t1, t1, t2
44+
; CHECK-NEXT: bge t1, t2, .LBB0_3
45+
; CHECK-NEXT: # %bb.4:
46+
; CHECK-NEXT: .cfi_def_cfa_register sp
47+
; CHECK-NEXT: sub sp, sp, t1
48+
; CHECK-NEXT: .cfi_escape 0x0f, 0x0f, 0x72, 0x00, 0x11, 0xd0, 0x80, 0x02, 0x22, 0x11, 0x01, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 32848 + 1 * vlenb
49+
; CHECK-NEXT: li a0, 86
50+
; CHECK-NEXT: addi s0, sp, 48
51+
; CHECK-NEXT: addi s1, sp, 32
52+
; CHECK-NEXT: addi s2, sp, 16
53+
; CHECK-NEXT: lui a1, 353637
54+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
55+
; CHECK-NEXT: vmv.v.x v8, a0
56+
; CHECK-NEXT: lui a0, 8
57+
; CHECK-NEXT: addiw a0, a0, 32
58+
; CHECK-NEXT: add a0, sp, a0
59+
; CHECK-NEXT: vs1r.v v8, (a0) # vscale x 8-byte Folded Spill
60+
; CHECK-NEXT: addiw a0, a1, 1622
61+
; CHECK-NEXT: vse8.v v8, (s0)
62+
; CHECK-NEXT: vse8.v v8, (s1)
63+
; CHECK-NEXT: vse8.v v8, (s2)
64+
; CHECK-NEXT: slli a1, a0, 32
65+
; CHECK-NEXT: add s3, a0, a1
66+
; CHECK-NEXT: sd s3, 64(sp)
67+
; CHECK-NEXT: call bar
68+
; CHECK-NEXT: lui a0, 8
69+
; CHECK-NEXT: addiw a0, a0, 32
70+
; CHECK-NEXT: add a0, sp, a0
71+
; CHECK-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload
72+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
73+
; CHECK-NEXT: vse8.v v8, (s2)
74+
; CHECK-NEXT: vse8.v v8, (s1)
75+
; CHECK-NEXT: vse8.v v8, (s0)
76+
; CHECK-NEXT: sd s3, 64(sp)
77+
; CHECK-NEXT: li a0, 0
78+
; CHECK-NEXT: csrr a1, vlenb
79+
; CHECK-NEXT: add sp, sp, a1
80+
; CHECK-NEXT: .cfi_def_cfa sp, 2032
81+
; CHECK-NEXT: lui a1, 8
82+
; CHECK-NEXT: addiw a1, a1, -1952
83+
; CHECK-NEXT: add sp, sp, a1
84+
; CHECK-NEXT: .cfi_def_cfa_offset 2032
85+
; CHECK-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload
86+
; CHECK-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload
87+
; CHECK-NEXT: ld s1, 2008(sp) # 8-byte Folded Reload
88+
; CHECK-NEXT: ld s2, 2000(sp) # 8-byte Folded Reload
89+
; CHECK-NEXT: ld s3, 1992(sp) # 8-byte Folded Reload
90+
; CHECK-NEXT: .cfi_restore ra
91+
; CHECK-NEXT: .cfi_restore s0
92+
; CHECK-NEXT: .cfi_restore s1
93+
; CHECK-NEXT: .cfi_restore s2
94+
; CHECK-NEXT: .cfi_restore s3
95+
; CHECK-NEXT: addi sp, sp, 2032
96+
; CHECK-NEXT: .cfi_def_cfa_offset 0
97+
; CHECK-NEXT: ret
98+
%1 = alloca %"buff", align 8
99+
call void @llvm.memset.p0.i64(ptr %1, i8 86, i64 56, i1 false)
100+
call void @bar()
101+
call void @llvm.memset.p0.i64(ptr %1, i8 86, i64 56, i1 false)
102+
ret i1 false
103+
}
104+
105+
attributes #0 = { "probe-stack"="inline-asm" "target-features"="+v" }

0 commit comments

Comments
 (0)