xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/two-entry-phi-node.ll (revision d1d129356909af2f6fefd6f1b9335a39fe172e9a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s
3
4declare void @sideeffect0()
5declare void @sideeffect1()
6declare void @sideeffect2()
7declare void @use8(i8)
8declare i1 @gen1()
9
10define i1 @t0_or_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
11; CHECK-LABEL: @t0_or_binop(
12; CHECK-NEXT:  entry:
13; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
14; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
15; CHECK:       pred0:
16; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
17; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
18; CHECK-NEXT:    [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]]
19; CHECK-NEXT:    br label [[END]]
20; CHECK:       end:
21; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
22; CHECK-NEXT:    ret i1 [[R]]
23;
24entry:
25  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
26  br i1 %c0, label %pred0, label %pred1
27
28pred0:
29  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
30  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
31  %computed = or i1 %c1, %c2 ; binary or
32  br label %end
33
34pred1:
35  br label %end
36
37end:
38  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
39  ret i1 %r
40}
41define i1 @t1_or_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
42; CHECK-LABEL: @t1_or_logical(
43; CHECK-NEXT:  entry:
44; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
45; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
46; CHECK:       pred0:
47; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
48; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
49; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
50; CHECK-NEXT:    br label [[END]]
51; CHECK:       end:
52; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
53; CHECK-NEXT:    ret i1 [[R]]
54;
55entry:
56  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
57  br i1 %c0, label %pred0, label %pred1
58
59pred0:
60  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
61  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
62  %computed = select i1 %c1, i1 true, i1 %c2 ; logical or
63  br label %end
64
65pred1:
66  br label %end
67
68end:
69  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
70  ret i1 %r
71}
72
73define i1 @t2_and_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
74; CHECK-LABEL: @t2_and_binop(
75; CHECK-NEXT:  entry:
76; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
77; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
78; CHECK:       pred0:
79; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
80; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
81; CHECK-NEXT:    [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]]
82; CHECK-NEXT:    br label [[END]]
83; CHECK:       end:
84; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
85; CHECK-NEXT:    ret i1 [[R]]
86;
87entry:
88  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
89  br i1 %c0, label %pred0, label %pred1
90
91pred0:
92  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
93  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
94  %computed = and i1 %c1, %c2 ; binary and
95  br label %end
96
97pred1:
98  br label %end
99
100end:
101  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
102  ret i1 %r
103}
104define i1 @t3_and_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
105; CHECK-LABEL: @t3_and_logical(
106; CHECK-NEXT:  entry:
107; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
108; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
109; CHECK:       pred0:
110; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
111; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
112; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
113; CHECK-NEXT:    br label [[END]]
114; CHECK:       end:
115; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
116; CHECK-NEXT:    ret i1 [[R]]
117;
118entry:
119  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
120  br i1 %c0, label %pred0, label %pred1
121
122pred0:
123  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
124  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
125  %computed = select i1 %c1, i1 %c2, i1 false ; logical and
126  br label %end
127
128pred1:
129  br label %end
130
131end:
132  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
133  ret i1 %r
134}
135
136
137define i1 @t4_nor_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
138; CHECK-LABEL: @t4_nor_binop(
139; CHECK-NEXT:  entry:
140; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
141; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
142; CHECK:       pred0:
143; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
144; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
145; CHECK-NEXT:    [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]]
146; CHECK-NEXT:    br label [[END]]
147; CHECK:       end:
148; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
149; CHECK-NEXT:    ret i1 [[R]]
150;
151entry:
152  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
153  br i1 %c0, label %pred0, label %pred1
154
155pred0:
156  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
157  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
158  %computed = and i1 %c1, %c2 ; binary and
159  br label %end
160
161pred1:
162  br label %end
163
164end:
165  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
166  ret i1 %r
167}
168define i1 @t5_nor_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
169; CHECK-LABEL: @t5_nor_logical(
170; CHECK-NEXT:  entry:
171; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
172; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
173; CHECK:       pred0:
174; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
175; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
176; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
177; CHECK-NEXT:    br label [[END]]
178; CHECK:       end:
179; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
180; CHECK-NEXT:    ret i1 [[R]]
181;
182entry:
183  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
184  br i1 %c0, label %pred0, label %pred1
185
186pred0:
187  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
188  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
189  %computed = select i1 %c1, i1 %c2, i1 false ; logical and
190  br label %end
191
192pred1:
193  br label %end
194
195end:
196  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
197  ret i1 %r
198}
199define i1 @t6_nor_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
200; CHECK-LABEL: @t6_nor_logical2(
201; CHECK-NEXT:  entry:
202; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
203; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
204; CHECK:       pred0:
205; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
206; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
207; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 false, i1 [[C2]]
208; CHECK-NEXT:    br label [[END]]
209; CHECK:       end:
210; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
211; CHECK-NEXT:    ret i1 [[R]]
212;
213entry:
214  %c0 = icmp eq i8 %v0, 0
215  br i1 %c0, label %pred0, label %pred1
216
217pred0:
218  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
219  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
220  %computed = select i1 %c1, i1 false, i1 %c2 ; huh, what is this, logical nand?
221  br label %end
222
223pred1:
224  br label %end
225
226end:
227  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
228  ret i1 %r
229}
230
231define i1 @t7_nand_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
232; CHECK-LABEL: @t7_nand_binop(
233; CHECK-NEXT:  entry:
234; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
235; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
236; CHECK:       pred0:
237; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
238; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
239; CHECK-NEXT:    [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]]
240; CHECK-NEXT:    br label [[END]]
241; CHECK:       end:
242; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
243; CHECK-NEXT:    ret i1 [[R]]
244;
245entry:
246  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
247  br i1 %c0, label %pred0, label %pred1
248
249pred0:
250  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
251  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
252  %computed = or i1 %c1, %c2 ; binary and
253  br label %end
254
255pred1:
256  br label %end
257
258end:
259  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
260  ret i1 %r
261}
262define i1 @t8_nand_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
263; CHECK-LABEL: @t8_nand_logical(
264; CHECK-NEXT:  entry:
265; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
266; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
267; CHECK:       pred0:
268; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
269; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
270; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
271; CHECK-NEXT:    br label [[END]]
272; CHECK:       end:
273; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
274; CHECK-NEXT:    ret i1 [[R]]
275;
276entry:
277  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
278  br i1 %c0, label %pred0, label %pred1
279
280pred0:
281  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
282  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
283  %computed = select i1 %c1, i1 true, i1 %c2 ; logical or
284  br label %end
285
286pred1:
287  br label %end
288
289end:
290  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
291  ret i1 %r
292}
293define i1 @t9_nand_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
294; CHECK-LABEL: @t9_nand_logical2(
295; CHECK-NEXT:  entry:
296; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
297; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
298; CHECK:       pred0:
299; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
300; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
301; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 true
302; CHECK-NEXT:    br label [[END]]
303; CHECK:       end:
304; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
305; CHECK-NEXT:    ret i1 [[R]]
306;
307entry:
308  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
309  br i1 %c0, label %pred0, label %pred1
310
311pred0:
312  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
313  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
314  %computed = select i1 %c1, i1 %c2, i1 true ; huh, what is this, logical nor?
315  br label %end
316
317pred1:
318  br label %end
319
320end:
321  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
322  ret i1 %r
323}
324