Skip to content

Commit c23bc4b

Browse files
committed
Add test coverage
1 parent 2c9d30d commit c23bc4b

File tree

1 file changed

+253
-0
lines changed

1 file changed

+253
-0
lines changed
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
2+
; RUN: opt -S -passes=dfa-jump-threading -dfa-max-out-use-blocks=5 %s | FileCheck %s
3+
4+
define void @max_outer_uses_by_switch(i32 %cond) {
5+
; CHECK-LABEL: define void @max_outer_uses_by_switch(
6+
; CHECK-SAME: i32 [[COND:%.*]]) {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br label %[[SWITCH_BB:.*]]
9+
; CHECK: [[SWITCH_BB]]:
10+
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[ONE:%.*]], %[[CASE1_SUCC:.*]] ], [ 2, %[[CASE2:.*]] ]
11+
; CHECK-NEXT: switch i32 [[PHI]], label %[[DEFAULT_DEST:.*]] [
12+
; CHECK-NEXT: i32 0, label %[[CASE1:.*]]
13+
; CHECK-NEXT: i32 1, label %[[CASE2]]
14+
; CHECK-NEXT: ]
15+
; CHECK: [[CASE1]]:
16+
; CHECK-NEXT: br label %[[CASE1_SUCC]]
17+
; CHECK: [[CASE1_SUCC]]:
18+
; CHECK-NEXT: [[ONE]] = phi i32 [ 1, %[[CASE1]] ]
19+
; CHECK-NEXT: switch i32 [[COND]], label %[[SWITCH_BB]] [
20+
; CHECK-NEXT: i32 0, label %[[OUTER1:.*]]
21+
; CHECK-NEXT: i32 1, label %[[OUTER2:.*]]
22+
; CHECK-NEXT: i32 2, label %[[OUTER3:.*]]
23+
; CHECK-NEXT: i32 3, label %[[OUTER4:.*]]
24+
; CHECK-NEXT: ]
25+
; CHECK: [[CASE2]]:
26+
; CHECK-NEXT: br label %[[SWITCH_BB]]
27+
; CHECK: [[OUTER1]]:
28+
; CHECK-NEXT: ret void
29+
; CHECK: [[OUTER2]]:
30+
; CHECK-NEXT: ret void
31+
; CHECK: [[OUTER3]]:
32+
; CHECK-NEXT: ret void
33+
; CHECK: [[OUTER4]]:
34+
; CHECK-NEXT: ret void
35+
; CHECK: [[DEFAULT_DEST]]:
36+
; CHECK-NEXT: ret void
37+
;
38+
entry:
39+
br label %switch_bb
40+
41+
switch_bb:
42+
%phi = phi i32 [ 0, %entry ], [ %one, %case1_succ ], [ 2, %case2 ]
43+
switch i32 %phi, label %default_dest [
44+
i32 0, label %case1
45+
i32 1, label %case2
46+
]
47+
48+
case1:
49+
br label %case1_succ
50+
51+
case1_succ:
52+
%one = phi i32 [ 1, %case1 ]
53+
switch i32 %cond, label %switch_bb [
54+
i32 0, label %outer1
55+
i32 1, label %outer2
56+
i32 2, label %outer3
57+
i32 3, label %outer4
58+
]
59+
60+
case2:
61+
br label %switch_bb
62+
63+
outer1:
64+
ret void
65+
66+
outer2:
67+
ret void
68+
69+
outer3:
70+
ret void
71+
72+
outer4:
73+
ret void
74+
75+
default_dest:
76+
ret void
77+
}
78+
79+
define void @less_outer_uses_by_switch(i32 %cond, i1 %c1) {
80+
; CHECK-LABEL: define void @less_outer_uses_by_switch(
81+
; CHECK-SAME: i32 [[COND:%.*]], i1 [[C1:%.*]]) {
82+
; CHECK-NEXT: [[ENTRY:.*]]:
83+
; CHECK-NEXT: br label %[[SWITCH_BB:.*]]
84+
; CHECK: [[SWITCH_BB]]:
85+
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ poison, %[[CASE1_SUCC:.*]] ]
86+
; CHECK-NEXT: switch i32 [[PHI]], label %[[DEFAULT_DEST:.*]] [
87+
; CHECK-NEXT: i32 0, label %[[CASE1:.*]]
88+
; CHECK-NEXT: i32 1, label %[[CASE2:.*]]
89+
; CHECK-NEXT: ]
90+
; CHECK: [[SWITCH_BB_JT2:.*]]:
91+
; CHECK-NEXT: [[PHI_JT2:%.*]] = phi i32 [ 2, %[[CASE2]] ]
92+
; CHECK-NEXT: br label %[[DEFAULT_DEST]]
93+
; CHECK: [[SWITCH_BB_JT1:.*]]:
94+
; CHECK-NEXT: [[PHI_JT1:%.*]] = phi i32 [ [[ONE_JT1:%.*]], %[[CASE1_SUCC_JT1:.*]] ]
95+
; CHECK-NEXT: br label %[[CASE2]]
96+
; CHECK: [[CASE1]]:
97+
; CHECK-NEXT: br label %[[CASE1_SUCC_JT1]]
98+
; CHECK: [[CASE1_SUCC]]:
99+
; CHECK-NEXT: switch i32 [[COND]], label %[[SWITCH_BB]] [
100+
; CHECK-NEXT: i32 0, label %[[OUTER1:.*]]
101+
; CHECK-NEXT: i32 1, label %[[OUTER2:.*]]
102+
; CHECK-NEXT: ]
103+
; CHECK: [[CASE1_SUCC_JT1]]:
104+
; CHECK-NEXT: [[ONE_JT1]] = phi i32 [ 1, %[[CASE1]] ]
105+
; CHECK-NEXT: switch i32 [[COND]], label %[[SWITCH_BB_JT1]] [
106+
; CHECK-NEXT: i32 0, label %[[OUTER1]]
107+
; CHECK-NEXT: i32 1, label %[[OUTER2]]
108+
; CHECK-NEXT: ]
109+
; CHECK: [[CASE2]]:
110+
; CHECK-NEXT: br label %[[SWITCH_BB_JT2]]
111+
; CHECK: [[OUTER1]]:
112+
; CHECK-NEXT: ret void
113+
; CHECK: [[OUTER2]]:
114+
; CHECK-NEXT: ret void
115+
; CHECK: [[DEFAULT_DEST]]:
116+
; CHECK-NEXT: ret void
117+
;
118+
entry:
119+
br label %switch_bb
120+
121+
switch_bb:
122+
%phi = phi i32 [ 0, %entry ], [ %one, %case1_succ ], [ 2, %case2 ]
123+
switch i32 %phi, label %default_dest [
124+
i32 0, label %case1
125+
i32 1, label %case2
126+
]
127+
128+
case1:
129+
br label %case1_succ
130+
131+
case1_succ:
132+
%one = phi i32 [ 1, %case1 ]
133+
switch i32 %cond, label %switch_bb [
134+
i32 0, label %outer1
135+
i32 1, label %outer2
136+
]
137+
138+
case2:
139+
br label %switch_bb
140+
141+
outer1:
142+
ret void
143+
144+
outer2:
145+
ret void
146+
147+
default_dest:
148+
ret void
149+
}
150+
151+
152+
define void @max_outer_uses_multi_preds(i32 %cond) {
153+
; CHECK-LABEL: define void @max_outer_uses_multi_preds(
154+
; CHECK-SAME: i32 [[COND:%.*]]) {
155+
; CHECK-NEXT: [[ENTRY:.*]]:
156+
; CHECK-NEXT: br label %[[SWITCH_BB:.*]]
157+
; CHECK: [[SWITCH_BB]]:
158+
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ poison, %[[CASE1_SUCC:.*]] ]
159+
; CHECK-NEXT: switch i32 [[PHI]], label %[[DEFAULT_DEST:.*]] [
160+
; CHECK-NEXT: i32 0, label %[[CASE1:.*]]
161+
; CHECK-NEXT: i32 1, label %[[CASE2:.*]]
162+
; CHECK-NEXT: i32 2, label %[[CASE3:.*]]
163+
; CHECK-NEXT: ]
164+
; CHECK: [[SWITCH_BB_JT2:.*]]:
165+
; CHECK-NEXT: [[PHI_JT2:%.*]] = phi i32 [ 2, %[[CASE2]] ]
166+
; CHECK-NEXT: br label %[[CASE3]]
167+
; CHECK: [[SWITCH_BB_JT1:.*]]:
168+
; CHECK-NEXT: [[PHI_JT1:%.*]] = phi i32 [ [[ONE_JT1:%.*]], %[[CASE1_SUCC_JT1:.*]] ]
169+
; CHECK-NEXT: br label %[[CASE2]]
170+
; CHECK: [[CASE1]]:
171+
; CHECK-NEXT: br label %[[CASE1_SUCC_JT1]]
172+
; CHECK: [[CASE1_SUCC]]:
173+
; CHECK-NEXT: switch i32 [[COND]], label %[[SWITCH_BB]] [
174+
; CHECK-NEXT: i32 0, label %[[OUTER1:.*]]
175+
; CHECK-NEXT: i32 1, label %[[OUTER2:.*]]
176+
; CHECK-NEXT: i32 2, label %[[OUTER3:.*]]
177+
; CHECK-NEXT: i32 3, label %[[OUTER4:.*]]
178+
; CHECK-NEXT: ]
179+
; CHECK: [[CASE1_SUCC_JT1]]:
180+
; CHECK-NEXT: [[ONE_JT1]] = phi i32 [ 1, %[[CASE1]] ]
181+
; CHECK-NEXT: switch i32 [[COND]], label %[[SWITCH_BB_JT1]] [
182+
; CHECK-NEXT: i32 0, label %[[OUTER1]]
183+
; CHECK-NEXT: i32 1, label %[[OUTER2]]
184+
; CHECK-NEXT: i32 2, label %[[OUTER3]]
185+
; CHECK-NEXT: i32 3, label %[[OUTER4]]
186+
; CHECK-NEXT: ]
187+
; CHECK: [[CASE2]]:
188+
; CHECK-NEXT: br label %[[SWITCH_BB_JT2]]
189+
; CHECK: [[CASE3]]:
190+
; CHECK-NEXT: switch i32 [[COND]], label %[[OUTER4]] [
191+
; CHECK-NEXT: i32 0, label %[[OUTER1]]
192+
; CHECK-NEXT: i32 1, label %[[OUTER2]]
193+
; CHECK-NEXT: i32 2, label %[[OUTER3]]
194+
; CHECK-NEXT: ]
195+
; CHECK: [[OUTER1]]:
196+
; CHECK-NEXT: ret void
197+
; CHECK: [[OUTER2]]:
198+
; CHECK-NEXT: ret void
199+
; CHECK: [[OUTER3]]:
200+
; CHECK-NEXT: ret void
201+
; CHECK: [[OUTER4]]:
202+
; CHECK-NEXT: ret void
203+
; CHECK: [[DEFAULT_DEST]]:
204+
; CHECK-NEXT: ret void
205+
;
206+
entry:
207+
br label %switch_bb
208+
209+
switch_bb:
210+
%phi = phi i32 [ 0, %entry ], [ %one, %case1_succ ], [ 2, %case2 ]
211+
switch i32 %phi, label %default_dest [
212+
i32 0, label %case1
213+
i32 1, label %case2
214+
i32 2, label %case3
215+
]
216+
217+
case1:
218+
br label %case1_succ
219+
220+
case1_succ:
221+
%one = phi i32 [ 1, %case1 ]
222+
switch i32 %cond, label %switch_bb [
223+
i32 0, label %outer1
224+
i32 1, label %outer2
225+
i32 2, label %outer3
226+
i32 3, label %outer4
227+
]
228+
229+
case2:
230+
br label %switch_bb
231+
232+
case3:
233+
switch i32 %cond, label %outer4 [
234+
i32 0, label %outer1
235+
i32 1, label %outer2
236+
i32 2, label %outer3
237+
]
238+
239+
outer1:
240+
ret void
241+
242+
outer2:
243+
ret void
244+
245+
outer3:
246+
ret void
247+
248+
outer4:
249+
ret void
250+
251+
default_dest:
252+
ret void
253+
}

0 commit comments

Comments
 (0)