Skip to content

Commit b3d2dc3

Browse files
ilovepitopperc
andauthored
[RISCV] Fix assertion failure when using -fstack-clash-protection (#135248)
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 <craig.topper@sifive.com>
1 parent 6c5f50f commit b3d2dc3

File tree

2 files changed

+89
-3
lines changed

2 files changed

+89
-3
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

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

21162116
// Synthesize the probe loop.
2117-
static void emitStackProbeInline(MachineFunction &MF, MachineBasicBlock &MBB,
2118-
MachineBasicBlock::iterator MBBI, DebugLoc DL,
2117+
static void emitStackProbeInline(MachineBasicBlock::iterator MBBI, DebugLoc DL,
21192118
Register TargetReg, bool IsRVV) {
21202119
assert(TargetReg != RISCV::X2 && "New top of stack cannot already be in SP");
21212120

2121+
MachineBasicBlock &MBB = *MBBI->getParent();
2122+
MachineFunction &MF = *MBB.getParent();
2123+
21222124
auto &Subtarget = MF.getSubtarget<RISCVSubtarget>();
21232125
const RISCVInstrInfo *TII = Subtarget.getInstrInfo();
21242126
bool IsRV64 = Subtarget.is64Bit();
@@ -2207,7 +2209,7 @@ void RISCVFrameLowering::inlineStackProbe(MachineFunction &MF,
22072209
MachineBasicBlock::iterator MBBI = MI->getIterator();
22082210
DebugLoc DL = MBB.findDebugLoc(MBBI);
22092211
Register TargetReg = MI->getOperand(1).getReg();
2210-
emitStackProbeInline(MF, MBB, MBBI, DL, TargetReg,
2212+
emitStackProbeInline(MBBI, DL, TargetReg,
22112213
(MI->getOpcode() == RISCV::PROBED_STACKALLOC_RVV));
22122214
MBBI->eraseFromParent();
22132215
}

llvm/test/CodeGen/RISCV/pr135206.ll

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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() nounwind "probe-stack"="inline-asm" "target-features"="+v" {
10+
; CHECK-LABEL: foo:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: addi sp, sp, -2032
13+
; CHECK-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill
14+
; CHECK-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill
15+
; CHECK-NEXT: sd s1, 2008(sp) # 8-byte Folded Spill
16+
; CHECK-NEXT: sd s2, 2000(sp) # 8-byte Folded Spill
17+
; CHECK-NEXT: sd s3, 1992(sp) # 8-byte Folded Spill
18+
; CHECK-NEXT: lui a0, 7
19+
; CHECK-NEXT: sub t1, sp, a0
20+
; CHECK-NEXT: lui t2, 1
21+
; CHECK-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
22+
; CHECK-NEXT: sub sp, sp, t2
23+
; CHECK-NEXT: sd zero, 0(sp)
24+
; CHECK-NEXT: bne sp, t1, .LBB0_1
25+
; CHECK-NEXT: # %bb.2:
26+
; CHECK-NEXT: addi sp, sp, -2048
27+
; CHECK-NEXT: addi sp, sp, -96
28+
; CHECK-NEXT: csrr t1, vlenb
29+
; CHECK-NEXT: lui t2, 1
30+
; CHECK-NEXT: .LBB0_3: # =>This Inner Loop Header: Depth=1
31+
; CHECK-NEXT: sub sp, sp, t2
32+
; CHECK-NEXT: sd zero, 0(sp)
33+
; CHECK-NEXT: sub t1, t1, t2
34+
; CHECK-NEXT: bge t1, t2, .LBB0_3
35+
; CHECK-NEXT: # %bb.4:
36+
; CHECK-NEXT: sub sp, sp, t1
37+
; CHECK-NEXT: li a0, 86
38+
; CHECK-NEXT: addi s0, sp, 48
39+
; CHECK-NEXT: addi s1, sp, 32
40+
; CHECK-NEXT: addi s2, sp, 16
41+
; CHECK-NEXT: lui a1, 353637
42+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
43+
; CHECK-NEXT: vmv.v.x v8, a0
44+
; CHECK-NEXT: lui a0, 8
45+
; CHECK-NEXT: addiw a0, a0, 32
46+
; CHECK-NEXT: add a0, sp, a0
47+
; CHECK-NEXT: vs1r.v v8, (a0) # vscale x 8-byte Folded Spill
48+
; CHECK-NEXT: addiw a0, a1, 1622
49+
; CHECK-NEXT: vse8.v v8, (s0)
50+
; CHECK-NEXT: vse8.v v8, (s1)
51+
; CHECK-NEXT: vse8.v v8, (s2)
52+
; CHECK-NEXT: slli a1, a0, 32
53+
; CHECK-NEXT: add s3, a0, a1
54+
; CHECK-NEXT: sd s3, 64(sp)
55+
; CHECK-NEXT: call bar
56+
; CHECK-NEXT: lui a0, 8
57+
; CHECK-NEXT: addiw a0, a0, 32
58+
; CHECK-NEXT: add a0, sp, a0
59+
; CHECK-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload
60+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
61+
; CHECK-NEXT: vse8.v v8, (s0)
62+
; CHECK-NEXT: vse8.v v8, (s1)
63+
; CHECK-NEXT: vse8.v v8, (s2)
64+
; CHECK-NEXT: sd s3, 64(sp)
65+
; CHECK-NEXT: li a0, 0
66+
; CHECK-NEXT: csrr a1, vlenb
67+
; CHECK-NEXT: add sp, sp, a1
68+
; CHECK-NEXT: lui a1, 8
69+
; CHECK-NEXT: addiw a1, a1, -1952
70+
; CHECK-NEXT: add sp, sp, a1
71+
; CHECK-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload
72+
; CHECK-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload
73+
; CHECK-NEXT: ld s1, 2008(sp) # 8-byte Folded Reload
74+
; CHECK-NEXT: ld s2, 2000(sp) # 8-byte Folded Reload
75+
; CHECK-NEXT: ld s3, 1992(sp) # 8-byte Folded Reload
76+
; CHECK-NEXT: addi sp, sp, 2032
77+
; CHECK-NEXT: ret
78+
%1 = alloca %"buff", align 8
79+
call void @llvm.memset.p0.i64(ptr %1, i8 86, i64 56, i1 false)
80+
call void @bar()
81+
call void @llvm.memset.p0.i64(ptr %1, i8 86, i64 56, i1 false)
82+
ret i1 false
83+
}
84+

0 commit comments

Comments
 (0)