1952dc2e5SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2952dc2e5SRoman Lebedev; RUN: opt < %s -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s
3952dc2e5SRoman Lebedev
4952dc2e5SRoman Lebedevdeclare void @sideeffect0()
5952dc2e5SRoman Lebedevdeclare void @sideeffect1()
6952dc2e5SRoman Lebedevdeclare void @sideeffect2()
7952dc2e5SRoman Lebedevdeclare void @use8(i8)
8952dc2e5SRoman Lebedevdeclare i1 @gen1()
9952dc2e5SRoman Lebedev
10952dc2e5SRoman Lebedevdefine i1 @t0_or_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
11952dc2e5SRoman Lebedev; CHECK-LABEL: @t0_or_binop(
12952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
13952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
14952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
15952dc2e5SRoman Lebedev; CHECK:       pred0:
16952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
17952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
18952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]]
19952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
20952dc2e5SRoman Lebedev; CHECK:       end:
21952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
22952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
23952dc2e5SRoman Lebedev;
24952dc2e5SRoman Lebedeventry:
25952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
26952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
27952dc2e5SRoman Lebedev
28952dc2e5SRoman Lebedevpred0:
29952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
30952dc2e5SRoman Lebedev  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
31952dc2e5SRoman Lebedev  %computed = or i1 %c1, %c2 ; binary or
32952dc2e5SRoman Lebedev  br label %end
33952dc2e5SRoman Lebedev
34952dc2e5SRoman Lebedevpred1:
35952dc2e5SRoman Lebedev  br label %end
36952dc2e5SRoman Lebedev
37952dc2e5SRoman Lebedevend:
38952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
39952dc2e5SRoman Lebedev  ret i1 %r
40952dc2e5SRoman Lebedev}
41952dc2e5SRoman Lebedevdefine i1 @t1_or_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
42952dc2e5SRoman Lebedev; CHECK-LABEL: @t1_or_logical(
43952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
44952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
45952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
46952dc2e5SRoman Lebedev; CHECK:       pred0:
47952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
48952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
49952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
50952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
51952dc2e5SRoman Lebedev; CHECK:       end:
52952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
53952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
54952dc2e5SRoman Lebedev;
55952dc2e5SRoman Lebedeventry:
56952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
57952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
58952dc2e5SRoman Lebedev
59952dc2e5SRoman Lebedevpred0:
60952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
61952dc2e5SRoman Lebedev  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
62952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 true, i1 %c2 ; logical or
63952dc2e5SRoman Lebedev  br label %end
64952dc2e5SRoman Lebedev
65952dc2e5SRoman Lebedevpred1:
66952dc2e5SRoman Lebedev  br label %end
67952dc2e5SRoman Lebedev
68952dc2e5SRoman Lebedevend:
69952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
70952dc2e5SRoman Lebedev  ret i1 %r
71952dc2e5SRoman Lebedev}
72952dc2e5SRoman Lebedev
73952dc2e5SRoman Lebedevdefine i1 @t2_and_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
74952dc2e5SRoman Lebedev; CHECK-LABEL: @t2_and_binop(
75952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
76952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
77952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
78952dc2e5SRoman Lebedev; CHECK:       pred0:
79952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
80952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
81952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]]
82952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
83952dc2e5SRoman Lebedev; CHECK:       end:
84952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
85952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
86952dc2e5SRoman Lebedev;
87952dc2e5SRoman Lebedeventry:
88952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
89952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
90952dc2e5SRoman Lebedev
91952dc2e5SRoman Lebedevpred0:
92952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
93952dc2e5SRoman Lebedev  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
94952dc2e5SRoman Lebedev  %computed = and i1 %c1, %c2 ; binary and
95952dc2e5SRoman Lebedev  br label %end
96952dc2e5SRoman Lebedev
97952dc2e5SRoman Lebedevpred1:
98952dc2e5SRoman Lebedev  br label %end
99952dc2e5SRoman Lebedev
100952dc2e5SRoman Lebedevend:
101952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
102952dc2e5SRoman Lebedev  ret i1 %r
103952dc2e5SRoman Lebedev}
104952dc2e5SRoman Lebedevdefine i1 @t3_and_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
105952dc2e5SRoman Lebedev; CHECK-LABEL: @t3_and_logical(
106952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
107952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
108952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
109952dc2e5SRoman Lebedev; CHECK:       pred0:
110952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
111952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0
112952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
113952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
114952dc2e5SRoman Lebedev; CHECK:       end:
115952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
116952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
117952dc2e5SRoman Lebedev;
118952dc2e5SRoman Lebedeventry:
119952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
120952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
121952dc2e5SRoman Lebedev
122952dc2e5SRoman Lebedevpred0:
123952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
124952dc2e5SRoman Lebedev  %c2 = icmp eq i8 %v2, 0 ; canonical predicate
125952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 %c2, i1 false ; logical and
126952dc2e5SRoman Lebedev  br label %end
127952dc2e5SRoman Lebedev
128952dc2e5SRoman Lebedevpred1:
129952dc2e5SRoman Lebedev  br label %end
130952dc2e5SRoman Lebedev
131952dc2e5SRoman Lebedevend:
132952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
133952dc2e5SRoman Lebedev  ret i1 %r
134952dc2e5SRoman Lebedev}
135952dc2e5SRoman Lebedev
136952dc2e5SRoman Lebedev
137952dc2e5SRoman Lebedevdefine i1 @t4_nor_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
138952dc2e5SRoman Lebedev; CHECK-LABEL: @t4_nor_binop(
139952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
140952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
141952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
142952dc2e5SRoman Lebedev; CHECK:       pred0:
143952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
144952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
145952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]]
146952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
147952dc2e5SRoman Lebedev; CHECK:       end:
148952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
149952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
150952dc2e5SRoman Lebedev;
151952dc2e5SRoman Lebedeventry:
152952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
153952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
154952dc2e5SRoman Lebedev
155952dc2e5SRoman Lebedevpred0:
156952dc2e5SRoman Lebedev  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
157952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
158952dc2e5SRoman Lebedev  %computed = and i1 %c1, %c2 ; binary and
159952dc2e5SRoman Lebedev  br label %end
160952dc2e5SRoman Lebedev
161952dc2e5SRoman Lebedevpred1:
162952dc2e5SRoman Lebedev  br label %end
163952dc2e5SRoman Lebedev
164952dc2e5SRoman Lebedevend:
165952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
166952dc2e5SRoman Lebedev  ret i1 %r
167952dc2e5SRoman Lebedev}
168952dc2e5SRoman Lebedevdefine i1 @t5_nor_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
169952dc2e5SRoman Lebedev; CHECK-LABEL: @t5_nor_logical(
170952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
171952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
172952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
173952dc2e5SRoman Lebedev; CHECK:       pred0:
174952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
175952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
176952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
177952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
178952dc2e5SRoman Lebedev; CHECK:       end:
179952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
180952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
181952dc2e5SRoman Lebedev;
182952dc2e5SRoman Lebedeventry:
183952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
184952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
185952dc2e5SRoman Lebedev
186952dc2e5SRoman Lebedevpred0:
187952dc2e5SRoman Lebedev  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
188952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
189952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 %c2, i1 false ; logical and
190952dc2e5SRoman Lebedev  br label %end
191952dc2e5SRoman Lebedev
192952dc2e5SRoman Lebedevpred1:
193952dc2e5SRoman Lebedev  br label %end
194952dc2e5SRoman Lebedev
195952dc2e5SRoman Lebedevend:
196952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
197952dc2e5SRoman Lebedev  ret i1 %r
198952dc2e5SRoman Lebedev}
199952dc2e5SRoman Lebedevdefine i1 @t6_nor_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
200952dc2e5SRoman Lebedev; CHECK-LABEL: @t6_nor_logical2(
201952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
202952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
203*7ef6f019SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
204*7ef6f019SRoman Lebedev; CHECK:       pred0:
205952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
206952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
207952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 false, i1 [[C2]]
208*7ef6f019SRoman Lebedev; CHECK-NEXT:    br label [[END]]
209*7ef6f019SRoman Lebedev; CHECK:       end:
210*7ef6f019SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
211952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
212952dc2e5SRoman Lebedev;
213952dc2e5SRoman Lebedeventry:
214952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0
215952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
216952dc2e5SRoman Lebedev
217952dc2e5SRoman Lebedevpred0:
218952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
219952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
220952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 false, i1 %c2 ; huh, what is this, logical nand?
221952dc2e5SRoman Lebedev  br label %end
222952dc2e5SRoman Lebedev
223952dc2e5SRoman Lebedevpred1:
224952dc2e5SRoman Lebedev  br label %end
225952dc2e5SRoman Lebedev
226952dc2e5SRoman Lebedevend:
227952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
228952dc2e5SRoman Lebedev  ret i1 %r
229952dc2e5SRoman Lebedev}
230952dc2e5SRoman Lebedev
231952dc2e5SRoman Lebedevdefine i1 @t7_nand_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
232952dc2e5SRoman Lebedev; CHECK-LABEL: @t7_nand_binop(
233952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
234952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
235952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
236952dc2e5SRoman Lebedev; CHECK:       pred0:
237952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
238952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
239952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]]
240952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
241952dc2e5SRoman Lebedev; CHECK:       end:
242952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
243952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
244952dc2e5SRoman Lebedev;
245952dc2e5SRoman Lebedeventry:
246952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
247952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
248952dc2e5SRoman Lebedev
249952dc2e5SRoman Lebedevpred0:
250952dc2e5SRoman Lebedev  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
251952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
252952dc2e5SRoman Lebedev  %computed = or i1 %c1, %c2 ; binary and
253952dc2e5SRoman Lebedev  br label %end
254952dc2e5SRoman Lebedev
255952dc2e5SRoman Lebedevpred1:
256952dc2e5SRoman Lebedev  br label %end
257952dc2e5SRoman Lebedev
258952dc2e5SRoman Lebedevend:
259952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
260952dc2e5SRoman Lebedev  ret i1 %r
261952dc2e5SRoman Lebedev}
262952dc2e5SRoman Lebedevdefine i1 @t8_nand_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
263952dc2e5SRoman Lebedev; CHECK-LABEL: @t8_nand_logical(
264952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
265952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
266952dc2e5SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
267952dc2e5SRoman Lebedev; CHECK:       pred0:
268952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0
269952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
270952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
271952dc2e5SRoman Lebedev; CHECK-NEXT:    br label [[END]]
272952dc2e5SRoman Lebedev; CHECK:       end:
273952dc2e5SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
274952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
275952dc2e5SRoman Lebedev;
276952dc2e5SRoman Lebedeventry:
277952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
278952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
279952dc2e5SRoman Lebedev
280952dc2e5SRoman Lebedevpred0:
281952dc2e5SRoman Lebedev  %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate
282952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
283952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 true, i1 %c2 ; logical or
284952dc2e5SRoman Lebedev  br label %end
285952dc2e5SRoman Lebedev
286952dc2e5SRoman Lebedevpred1:
287952dc2e5SRoman Lebedev  br label %end
288952dc2e5SRoman Lebedev
289952dc2e5SRoman Lebedevend:
290952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
291952dc2e5SRoman Lebedev  ret i1 %r
292952dc2e5SRoman Lebedev}
293952dc2e5SRoman Lebedevdefine i1 @t9_nand_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) {
294952dc2e5SRoman Lebedev; CHECK-LABEL: @t9_nand_logical2(
295952dc2e5SRoman Lebedev; CHECK-NEXT:  entry:
296952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0
297*7ef6f019SRoman Lebedev; CHECK-NEXT:    br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]]
298*7ef6f019SRoman Lebedev; CHECK:       pred0:
299952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0
300952dc2e5SRoman Lebedev; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0
301952dc2e5SRoman Lebedev; CHECK-NEXT:    [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 true
302*7ef6f019SRoman Lebedev; CHECK-NEXT:    br label [[END]]
303*7ef6f019SRoman Lebedev; CHECK:       end:
304*7ef6f019SRoman Lebedev; CHECK-NEXT:    [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ]
305952dc2e5SRoman Lebedev; CHECK-NEXT:    ret i1 [[R]]
306952dc2e5SRoman Lebedev;
307952dc2e5SRoman Lebedeventry:
308952dc2e5SRoman Lebedev  %c0 = icmp eq i8 %v0, 0 ; canonical predicate
309952dc2e5SRoman Lebedev  br i1 %c0, label %pred0, label %pred1
310952dc2e5SRoman Lebedev
311952dc2e5SRoman Lebedevpred0:
312952dc2e5SRoman Lebedev  %c1 = icmp eq i8 %v1, 0 ; canonical predicate
313952dc2e5SRoman Lebedev  %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate
314952dc2e5SRoman Lebedev  %computed = select i1 %c1, i1 %c2, i1 true ; huh, what is this, logical nor?
315952dc2e5SRoman Lebedev  br label %end
316952dc2e5SRoman Lebedev
317952dc2e5SRoman Lebedevpred1:
318952dc2e5SRoman Lebedev  br label %end
319952dc2e5SRoman Lebedev
320952dc2e5SRoman Lebedevend:
321952dc2e5SRoman Lebedev  %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ]
322952dc2e5SRoman Lebedev  ret i1 %r
323952dc2e5SRoman Lebedev}
324