Skip to content

Commit bacddf4

Browse files
committed
[amdgpu] Fix a crash case when preserving MDT in SILowerControlFlow
- When a redundant MBB is being erased from MDT, check whether its single successor is dominiated by it. If yes, update that successor's idom before erasing MBB; otherwise, it implies MBB is a leaf node and could be erased directly. Reviewed By: foad Differential Revision: https://reviews.llvm.org/D111831
1 parent e0f3a3b commit bacddf4

File tree

2 files changed

+164
-1
lines changed

2 files changed

+164
-1
lines changed

llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,15 @@ bool SILowerControlFlow::removeMBBifRedundant(MachineBasicBlock &MBB) {
768768
for (auto &I : MBB.instrs())
769769
LIS->RemoveMachineInstrFromMaps(I);
770770
}
771-
if (MDT)
771+
if (MDT) {
772+
// If Succ, the single successor of MBB, is dominated by MBB, MDT needs
773+
// updating by changing Succ's idom to the one of MBB; otherwise, MBB must
774+
// be a leaf node in MDT and could be erased directly.
775+
if (MDT->dominates(&MBB, Succ))
776+
MDT->changeImmediateDominator(MDT->getNode(Succ),
777+
MDT->getNode(&MBB)->getIDom());
772778
MDT->eraseNode(&MBB);
779+
}
773780
MBB.clear();
774781
MBB.eraseFromParent();
775782
if (FallThrough && !FallThrough->isLayoutSuccessor(Succ)) {
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
; RUN: llc < %s
2+
target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7"
3+
target triple = "amdgcn-amd-amdhsa"
4+
5+
@_RSENC_gDcd_______________________________ = external protected addrspace(1) externally_initialized global [4096 x i8], align 16
6+
7+
define protected amdgpu_kernel void @_RSENC_PRInit__________________________________() local_unnamed_addr #0 {
8+
entry:
9+
%runtimeVersionCopy = alloca [128 x i8], align 16, addrspace(5)
10+
%licenseVersionCopy = alloca [128 x i8], align 16, addrspace(5)
11+
%pD10 = alloca [128 x i8], align 16, addrspace(5)
12+
br label %if.end
13+
14+
if.end: ; preds = %entry
15+
%0 = load i32, i32* undef, align 4
16+
%mul = mul i32 %0, 3
17+
%cmp13 = icmp eq i32 %mul, 989619
18+
br i1 %cmp13, label %cleanup.cont, label %if.end15
19+
20+
if.end15: ; preds = %if.end
21+
br i1 undef, label %cleanup.cont, label %lor.lhs.false17
22+
23+
lor.lhs.false17: ; preds = %if.end15
24+
br label %while.cond.i
25+
26+
while.cond.i: ; preds = %while.cond.i, %lor.lhs.false17
27+
switch i32 undef, label %if.end60 [
28+
i32 0, label %while.cond.i
29+
i32 3, label %if.end60.loopexit857
30+
]
31+
32+
if.end60.loopexit857: ; preds = %while.cond.i
33+
br label %if.end60
34+
35+
if.end60: ; preds = %if.end60.loopexit857, %while.cond.i
36+
%1 = load i8, i8 addrspace(1)* getelementptr inbounds ([4096 x i8], [4096 x i8] addrspace(1)* @_RSENC_gDcd_______________________________, i64 0, i64 655), align 1
37+
%2 = getelementptr inbounds [128 x i8], [128 x i8] addrspace(5)* %runtimeVersionCopy, i32 0, i32 0
38+
%arrayidx144260.5 = getelementptr inbounds [128 x i8], [128 x i8] addrspace(5)* %runtimeVersionCopy, i32 0, i32 5
39+
%3 = getelementptr inbounds [128 x i8], [128 x i8] addrspace(5)* %licenseVersionCopy, i32 0, i32 0
40+
%arrayidx156258.5 = getelementptr inbounds [128 x i8], [128 x i8] addrspace(5)* %licenseVersionCopy, i32 0, i32 5
41+
switch i8 0, label %if.end5.i [
42+
i8 45, label %if.then.i
43+
i8 43, label %if.then3.i
44+
]
45+
46+
if.then.i: ; preds = %if.end60
47+
unreachable
48+
49+
if.then3.i: ; preds = %if.end60
50+
br label %if.end5.i
51+
52+
if.end5.i: ; preds = %if.then3.i, %if.end60
53+
%pS.addr.0.i = phi i8 addrspace(5)* [ undef, %if.then3.i ], [ %2, %if.end60 ]
54+
%4 = load i8, i8 addrspace(5)* %pS.addr.0.i, align 1
55+
%conv612.i = sext i8 %4 to i32
56+
%sub13.i = add nsw i32 %conv612.i, -48
57+
%cmp714.i = icmp ugt i32 %sub13.i, 9
58+
switch i8 undef, label %if.end5.i314 [
59+
i8 45, label %if.then.i306
60+
i8 43, label %if.then3.i308
61+
]
62+
63+
if.then.i306: ; preds = %if.end5.i
64+
unreachable
65+
66+
if.then3.i308: ; preds = %if.end5.i
67+
br label %if.end5.i314
68+
69+
if.end5.i314: ; preds = %if.then3.i308, %if.end5.i
70+
%pS.addr.0.i309 = phi i8 addrspace(5)* [ undef, %if.then3.i308 ], [ %3, %if.end5.i ]
71+
%5 = load i8, i8 addrspace(5)* %pS.addr.0.i309, align 1
72+
%conv612.i311 = sext i8 %5 to i32
73+
%sub13.i312 = add nsw i32 %conv612.i311, -48
74+
%cmp714.i313 = icmp ugt i32 %sub13.i312, 9
75+
switch i8 undef, label %if.end5.i338 [
76+
i8 45, label %if.then.i330
77+
i8 43, label %if.then3.i332
78+
]
79+
80+
if.then.i330: ; preds = %if.end5.i314
81+
unreachable
82+
83+
if.then3.i332: ; preds = %if.end5.i314
84+
br label %if.end5.i338
85+
86+
if.end5.i338: ; preds = %if.then3.i332, %if.end5.i314
87+
%pS.addr.0.i333 = phi i8 addrspace(5)* [ undef, %if.then3.i332 ], [ %arrayidx144260.5, %if.end5.i314 ]
88+
%6 = load i8, i8 addrspace(5)* %pS.addr.0.i333, align 1
89+
%conv612.i335 = sext i8 %6 to i32
90+
%sub13.i336 = add nsw i32 %conv612.i335, -48
91+
%cmp714.i337 = icmp ugt i32 %sub13.i336, 9
92+
switch i8 undef, label %if.end5.i362 [
93+
i8 45, label %if.then.i354
94+
i8 43, label %if.then3.i356
95+
]
96+
97+
if.then.i354: ; preds = %if.end5.i338
98+
unreachable
99+
100+
if.then3.i356: ; preds = %if.end5.i338
101+
br label %if.end5.i362
102+
103+
if.end5.i362: ; preds = %if.then3.i356, %if.end5.i338
104+
%pS.addr.0.i357 = phi i8 addrspace(5)* [ undef, %if.then3.i356 ], [ %arrayidx156258.5, %if.end5.i338 ]
105+
%7 = load i8, i8 addrspace(5)* %pS.addr.0.i357, align 1
106+
%conv612.i359 = sext i8 %7 to i32
107+
%sub13.i360 = add nsw i32 %conv612.i359, -48
108+
%cmp714.i361 = icmp ugt i32 %sub13.i360, 9
109+
store i8 0, i8 addrspace(5)* undef, align 16
110+
%8 = load i8, i8 addrspace(1)* getelementptr inbounds ([4096 x i8], [4096 x i8] addrspace(1)* @_RSENC_gDcd_______________________________, i64 0, i64 1153), align 1
111+
%arrayidx232250.1 = getelementptr inbounds [128 x i8], [128 x i8] addrspace(5)* %pD10, i32 0, i32 1
112+
store i8 %8, i8 addrspace(5)* %arrayidx232250.1, align 1
113+
switch i8 undef, label %if.end5.i400 [
114+
i8 45, label %if.then.i392
115+
i8 43, label %if.then3.i394
116+
]
117+
118+
if.then.i392: ; preds = %if.end5.i362
119+
unreachable
120+
121+
if.then3.i394: ; preds = %if.end5.i362
122+
br label %if.end5.i400
123+
124+
if.end5.i400: ; preds = %if.then3.i394, %if.end5.i362
125+
%pS.addr.0.i395 = phi i8 addrspace(5)* [ %arrayidx232250.1, %if.then3.i394 ], [ undef, %if.end5.i362 ]
126+
%9 = load i8, i8 addrspace(5)* %pS.addr.0.i395, align 1
127+
%conv612.i397 = sext i8 %9 to i32
128+
%sub13.i398 = add nsw i32 %conv612.i397, -48
129+
%cmp714.i399 = icmp ugt i32 %sub13.i398, 9
130+
%10 = load i8, i8* undef, align 1
131+
%cmp9.not.i500 = icmp eq i8 0, %10
132+
br label %land.lhs.true402.critedge
133+
134+
land.lhs.true402.critedge: ; preds = %if.end5.i400
135+
br i1 %cmp9.not.i500, label %if.then404, label %if.else407
136+
137+
if.then404: ; preds = %land.lhs.true402.critedge
138+
br label %for.body564
139+
140+
if.else407: ; preds = %land.lhs.true402.critedge
141+
br label %if.end570
142+
143+
for.body564: ; preds = %for.body564, %if.then404
144+
%i560.0801 = phi i32 [ 0, %if.then404 ], [ %inc568.31, %for.body564 ]
145+
%inc568.31 = add nuw nsw i32 %i560.0801, 32
146+
%exitcond839.not.31 = icmp eq i32 %inc568.31, 4096
147+
br i1 %exitcond839.not.31, label %if.end570, label %for.body564
148+
149+
if.end570: ; preds = %for.body564, %if.else407
150+
unreachable
151+
152+
cleanup.cont: ; preds = %if.end15, %if.end
153+
ret void
154+
}
155+
156+
attributes #0 = { "uniform-work-group-size"="true" }

0 commit comments

Comments
 (0)