xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/and.ll (revision 7cf499c63bfa2230d0e4144faba1fb4331f9d2ec)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4declare void @use(i1)
5
6define i1 @test_and_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
7; CHECK-LABEL: @test_and_ule(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
10; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
11; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
12; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
13; CHECK:       bb1:
14; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
15; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
16; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 [[X]], [[A:%.*]]
17; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_3]]
18; CHECK-NEXT:    ret i1 [[R_3]]
19; CHECK:       exit:
20; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 [[X]], [[Z]]
21; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
22; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[C_4]], [[C_5]]
23; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Y]]
24; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
25; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[Y]], [[Z]]
26; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
27; CHECK-NEXT:    ret i1 [[R_6]]
28;
29entry:
30  %c.1 = icmp ule i4 %x, %y
31  %c.2 = icmp ule i4 %y, %z
32  %and = and i1 %c.1, %c.2
33  br i1 %and, label %bb1, label %exit
34
35bb1:
36  %t.1 = icmp ule i4 %x, %z
37  %t.2 = icmp ule i4 %x, %y
38  %r.1 = xor i1 %t.1, %t.2
39
40  %t.3 = icmp ule i4 %y, %z
41  %r.2 = xor i1 %r.1, %t.3
42
43
44  %c.3 = icmp ule i4 %x, %a
45  %r.3 = xor i1 %r.2, %c.3
46
47  ret i1 %r.3
48
49exit:
50  %c.4 = icmp ule i4 %x, %z
51  %c.5 = icmp ule i4 %x, %a
52  %r.4 = xor i1 %c.4, %c.5
53
54  %c.6 = icmp ule i4 %x, %y
55  %r.5 = xor i1 %r.4, %c.6
56
57  %c.7 = icmp ule i4 %y, %z
58  %r.6 = xor i1 %r.5, %c.7
59
60  ret i1 %r.6
61}
62
63; The result of test_and_ule and test_and_select_ule should be same
64define i1 @test_and_select_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
65; CHECK-LABEL: @test_and_select_ule(
66; CHECK-NEXT:  entry:
67; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
68; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
69; CHECK-NEXT:    [[AND:%.*]] = select i1 [[C_1]], i1 [[C_2]], i1 false
70; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
71; CHECK:       bb1:
72; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
73; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
74; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 [[X]], [[A:%.*]]
75; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_3]]
76; CHECK-NEXT:    ret i1 [[R_3]]
77; CHECK:       exit:
78; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 [[X]], [[Z]]
79; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
80; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[C_4]], [[C_5]]
81; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Y]]
82; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
83; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[Y]], [[Z]]
84; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
85; CHECK-NEXT:    ret i1 [[R_6]]
86;
87entry:
88  %c.1 = icmp ule i4 %x, %y
89  %c.2 = icmp ule i4 %y, %z
90  %and = select i1 %c.1, i1 %c.2, i1 false
91  br i1 %and, label %bb1, label %exit
92
93bb1:
94  %t.1 = icmp ule i4 %x, %z
95  %t.2 = icmp ule i4 %x, %y
96  %r.1 = xor i1 %t.1, %t.2
97
98  %t.3 = icmp ule i4 %y, %z
99  %r.2 = xor i1 %r.1, %t.3
100
101  %c.3 = icmp ule i4 %x, %a
102  %r.3 = xor i1 %r.2, %c.3
103  ret i1 %r.3
104
105exit:
106  %c.4 = icmp ule i4 %x, %z
107  %c.5 = icmp ule i4 %x, %a
108  %r.4 = xor i1 %c.4, %c.5
109
110  %c.6 = icmp ule i4 %x, %y
111  %r.5 = xor i1 %r.4, %c.6
112
113  %c.7 = icmp ule i4 %y, %z
114  %r.6 = xor i1 %r.5, %c.7
115  ret i1 %r.6
116}
117
118define i4 @and_compare_undef(i4 %N, i4 %step) {
119; CHECK-LABEL: @and_compare_undef(
120; CHECK-NEXT:  step.check:
121; CHECK-NEXT:    [[B1:%.*]] = add i4 undef, -1
122; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i4 [[B1]], [[N:%.*]]
123; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]
124; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
125; CHECK:       ptr.check:
126; CHECK-NEXT:    br label [[EXIT]]
127; CHECK:       exit:
128; CHECK-NEXT:    ret i4 3
129;
130step.check:
131  %step.pos = icmp uge i4 %step, 0
132  %B1 = add i4 undef, -1
133  %step.ult.N = icmp ult i4 %B1, %N
134  %and.step = and i1 %step.pos, %step.ult.N
135  br i1 %and.step, label %ptr.check, label %exit
136
137ptr.check:
138  br label %exit
139
140exit:
141  ret i4 3
142}
143
144define i1 @test_and_condition_trivially_false(i1 %c, ptr %ptr.1, i8 %idx, ptr %ptr.2) {
145; CHECK-LABEL: @test_and_condition_trivially_false(
146; CHECK-NEXT:  entry:
147; CHECK-NEXT:    br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT_3:%.*]]
148; CHECK:       then:
149; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX:%.*]] to i16
150; CHECK-NEXT:    [[GEP_IDX_EXT:%.*]] = getelementptr inbounds i8, ptr [[PTR_1:%.*]], i16 [[IDX_EXT]]
151; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ult ptr [[PTR_2:%.*]], [[GEP_IDX_EXT]]
152; CHECK-NEXT:    [[AND:%.*]] = and i1 false, [[CMP_2]]
153; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
154; CHECK:       exit.1:
155; CHECK-NEXT:    ret i1 true
156; CHECK:       exit.2:
157; CHECK-NEXT:    ret i1 false
158; CHECK:       exit.3:
159; CHECK-NEXT:    [[CMP_3:%.*]] = icmp ne i8 [[IDX]], 0
160; CHECK-NEXT:    ret i1 [[CMP_3]]
161;
162entry:
163  br i1 %c, label %then, label %exit.3
164
165then:
166  %cmp.1 = icmp ugt ptr %ptr.2, %ptr.2
167  %idx.ext = zext i8 %idx to i16
168  %gep.idx.ext = getelementptr inbounds i8, ptr %ptr.1, i16 %idx.ext
169  %cmp.2 = icmp ult ptr %ptr.2, %gep.idx.ext
170  %and = and i1 %cmp.1, %cmp.2
171  br i1 %and, label %exit.1, label %exit.2
172
173exit.1:
174  ret i1 true
175
176exit.2:
177  ret i1 false
178
179exit.3:
180  %cmp.3 = icmp ne i8 %idx, 0
181  ret i1 %cmp.3
182}
183
184define i1 @test_and_chain_ule_1(i4 %x, i4 %y, i4 %z, i4 %a) {
185; CHECK-LABEL: @test_and_chain_ule_1(
186; CHECK-NEXT:  entry:
187; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
188; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
189; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
190; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
191; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
192; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[AND_1]], [[C_3]]
193; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[C_4]], [[AND_2]]
194; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
195; CHECK:       bb1:
196; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
197; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
198; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
199; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
200; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
201; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
202; CHECK-NEXT:    ret i1 [[R_5]]
203; CHECK:       exit:
204; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
205; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
206; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
207; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
208; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
209; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
210; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
211; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
212; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
213; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
214; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
215; CHECK-NEXT:    ret i1 [[R_10]]
216;
217entry:
218  %c.1 = icmp ule i4 %x, %y
219  %c.2 = icmp ule i4 %y, %z
220  %c.3 = icmp ule i4 3, %x
221  %c.4 = icmp ule i4 3, %a
222  %and.1 = and i1 %c.1, %c.2
223  %and.2 = and i1 %and.1, %c.3
224  %and.3 = and i1 %c.4, %and.2
225  br i1 %and.3, label %bb1, label %exit
226
227bb1:
228  %t.1 = icmp ule i4 %x, %z
229  %t.2 = icmp ule i4 %x, %y
230  %r.1 = xor i1 %t.1, %t.2
231
232  %t.3 = icmp ule i4 %y, %z
233  %r.2 = xor i1 %r.1, %t.3
234
235  %t.4 = icmp ule i4 3, %x
236  %r.3 = xor i1 %r.2, %t.4
237
238  %t.5 = icmp ule i4 3, %a
239  %r.4 = xor i1 %r.3, %t.5
240
241  %c.5 = icmp ule i4 %x, %a
242  %r.5 = xor i1 %r.4, %c.5
243
244  ret i1 %r.5
245
246exit:
247  %c.6 = icmp ule i4 %x, %z
248  %c.7 = icmp ule i4 %x, %a
249  %r.6 = xor i1 %c.6, %c.7
250
251  %c.8 = icmp ule i4 %x, %y
252  %r.7 = xor i1 %r.6, %c.8
253
254  %c.9 = icmp ule i4 %y, %z
255  %r.8 = xor i1 %r.7, %c.9
256
257  %c.10 = icmp ule i4 3, %x
258  %r.9 = xor i1 %r.8, %c.10
259
260  %c.11 = icmp ule i4 3, %a
261  %r.10 = xor i1 %r.9, %c.11
262
263  ret i1 %r.10
264}
265
266; Same as @test_and_chain_ule_1 but with `and`s reordered.
267define i1 @test_and_chain_ule_2(i4 %x, i4 %y, i4 %z, i4 %a) {
268; CHECK-LABEL: @test_and_chain_ule_2(
269; CHECK-NEXT:  entry:
270; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
271; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
272; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
273; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
274; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
275; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[C_3]], [[C_4]]
276; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[AND_1]], [[AND_2]]
277; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
278; CHECK:       bb1:
279; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
280; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
281; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
282; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
283; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
284; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
285; CHECK-NEXT:    ret i1 [[R_5]]
286; CHECK:       exit:
287; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
288; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
289; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
290; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
291; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
292; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
293; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
294; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
295; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
296; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
297; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
298; CHECK-NEXT:    ret i1 [[R_10]]
299;
300entry:
301  %c.1 = icmp ule i4 %x, %y
302  %c.2 = icmp ule i4 %y, %z
303  %c.3 = icmp ule i4 3, %x
304  %c.4 = icmp ule i4 3, %a
305  %and.1 = and i1 %c.1, %c.2
306  %and.2 = and i1 %c.3, %c.4
307  %and.3 = and i1 %and.1, %and.2
308  br i1 %and.3, label %bb1, label %exit
309
310bb1:
311  %t.1 = icmp ule i4 %x, %z
312  %t.2 = icmp ule i4 %x, %y
313  %r.1 = xor i1 %t.1, %t.2
314
315  %t.3 = icmp ule i4 %y, %z
316  %r.2 = xor i1 %r.1, %t.3
317
318  %t.4 = icmp ule i4 3, %x
319  %r.3 = xor i1 %r.2, %t.4
320
321  %t.5 = icmp ule i4 3, %a
322  %r.4 = xor i1 %r.3, %t.5
323
324  %c.5 = icmp ule i4 %x, %a
325  %r.5 = xor i1 %r.4, %c.5
326
327  ret i1 %r.5
328
329exit:
330  %c.6 = icmp ule i4 %x, %z
331  %c.7 = icmp ule i4 %x, %a
332  %r.6 = xor i1 %c.6, %c.7
333
334  %c.8 = icmp ule i4 %x, %y
335  %r.7 = xor i1 %r.6, %c.8
336
337  %c.9 = icmp ule i4 %y, %z
338  %r.8 = xor i1 %r.7, %c.9
339
340  %c.10 = icmp ule i4 3, %x
341  %r.9 = xor i1 %r.8, %c.10
342
343  %c.11 = icmp ule i4 3, %a
344  %r.10 = xor i1 %r.9, %c.11
345
346  ret i1 %r.10
347}
348
349
350declare i1 @cond() readnone
351
352define i1 @test_and_chain_with_other_insts_ule(i4 %x, i4 %y, i4 %z, i4 %a, i1 %arg.c) {
353; CHECK-LABEL: @test_and_chain_with_other_insts_ule(
354; CHECK-NEXT:  entry:
355; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
356; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
357; CHECK-NEXT:    [[C_3:%.*]] = call i1 @cond()
358; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
359; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[C_3]], [[ARG_C:%.*]]
360; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[AND_1]], [[AND_2]]
361; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
362; CHECK:       bb1:
363; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
364; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
365; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[X]]
366; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
367; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 3, [[A:%.*]]
368; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
369; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[A]]
370; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
371; CHECK-NEXT:    ret i1 [[R_5]]
372; CHECK:       exit:
373; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Z]]
374; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[X]], [[A]]
375; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_8]], [[C_9]]
376; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 [[X]], [[Y]]
377; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_10]]
378; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 [[Y]], [[Z]]
379; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_11]]
380; CHECK-NEXT:    [[C_12:%.*]] = icmp ule i4 3, [[X]]
381; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_12]]
382; CHECK-NEXT:    [[C_13:%.*]] = icmp ule i4 3, [[A]]
383; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_13]]
384; CHECK-NEXT:    ret i1 [[R_10]]
385;
386entry:
387  %c.1 = icmp ule i4 %x, %y
388  %c.2 = icmp ule i4 %y, %z
389  %c.3 = call i1 @cond()
390  %and.1 = and i1 %c.1, %c.2
391  %and.2 = and i1 %c.3, %arg.c
392  %and.3 = and i1 %and.1, %and.2
393  br i1 %and.3, label %bb1, label %exit
394
395bb1:
396  %t.1 = icmp ule i4 %x, %z
397  %t.2 = icmp ule i4 %x, %y
398  %r.1 = xor i1 %t.1, %t.2
399
400  %t.3 = icmp ule i4 %y, %z
401  %r.2 = xor i1 %r.1, %t.3
402
403  %c.4 = icmp ule i4 3, %x
404  %r.3 = xor i1 %r.2, %c.4
405
406  %c.5 = icmp ule i4 3, %a
407  %r.4 = xor i1 %r.3, %c.5
408
409  %c.6 = icmp ule i4 %x, %a
410  %r.5 = xor i1 %r.4, %c.6
411
412  ret i1 %r.5
413
414exit:
415  %c.8 = icmp ule i4 %x, %z
416  %c.9 = icmp ule i4 %x, %a
417  %r.6 = xor i1 %c.8, %c.9
418
419  %c.10 = icmp ule i4 %x, %y
420  %r.7 = xor i1 %r.6, %c.10
421
422  %c.11 = icmp ule i4 %y, %z
423  %r.8 = xor i1 %r.7, %c.11
424
425  %c.12 = icmp ule i4 3, %x
426  %r.9 = xor i1 %r.8, %c.12
427
428  %c.13 = icmp ule i4 3, %a
429  %r.10 = xor i1 %r.9, %c.13
430
431  ret i1 %r.10
432}
433
434define i1 @test_and_chain_select_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
435; CHECK-LABEL: @test_and_chain_select_ule(
436; CHECK-NEXT:  entry:
437; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
438; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
439; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
440; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
441; CHECK-NEXT:    [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
442; CHECK-NEXT:    [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
443; CHECK-NEXT:    [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
444; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
445; CHECK:       bb1:
446; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
447; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], true
448; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
449; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
450; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
451; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
452; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
453; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
454; CHECK-NEXT:    ret i1 [[R_5]]
455; CHECK:       exit:
456; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
457; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
458; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
459; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
460; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
461; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
462; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
463; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
464; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
465; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
466; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
467; CHECK-NEXT:    ret i1 [[R_10]]
468;
469entry:
470  %c.1 = icmp ule i4 %x, %y
471  %c.2 = icmp ule i4 %y, %z
472  %c.3 = icmp ule i4 3, %x
473  %c.4 = icmp ule i4 3, %a
474  %and.1 = select i1 %c.1, i1 %c.1, i1 false
475  %and.2 = select i1 %and.1, i1 %c.3, i1 false
476  %and.3 = select i1 %c.4, i1 %and.2, i1 false
477  br i1 %and.3, label %bb1, label %exit
478
479bb1:
480  %t.1 = icmp ule i4 %x, %z
481  %t.2 = icmp ule i4 %x, %y
482  %r.1 = xor i1 %t.1, %t.2
483
484  %t.3 = icmp ule i4 %y, %z
485  %r.2 = xor i1 %r.1, %t.3
486
487  %t.4 = icmp ule i4 3, %x
488  %r.3 = xor i1 %r.2, %t.4
489
490  %t.5 = icmp ule i4 3, %a
491  %r.4 = xor i1 %r.3, %t.5
492
493  %c.5 = icmp ule i4 %x, %a
494  %r.5 = xor i1 %r.4, %c.5
495
496  ret i1 %r.5
497
498exit:
499  %c.6 = icmp ule i4 %x, %z
500  %c.7 = icmp ule i4 %x, %a
501  %r.6 = xor i1 %c.6, %c.7
502
503  %c.8 = icmp ule i4 %x, %y
504  %r.7 = xor i1 %r.6, %c.8
505
506  %c.9 = icmp ule i4 %y, %z
507  %r.8 = xor i1 %r.7, %c.9
508
509  %c.10 = icmp ule i4 3, %x
510  %r.9 = xor i1 %r.8, %c.10
511
512  %c.11 = icmp ule i4 3, %a
513  %r.10 = xor i1 %r.9, %c.11
514
515  ret i1 %r.10
516}
517
518define i1 @test_and_chain_select_ule_logical_or(i4 %x, i4 %y, i4 %z, i4 %a) {
519; CHECK-LABEL: @test_and_chain_select_ule_logical_or(
520; CHECK-NEXT:  entry:
521; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
522; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
523; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
524; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
525; CHECK-NEXT:    [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
526; CHECK-NEXT:    [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
527; CHECK-NEXT:    [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
528; CHECK-NEXT:    [[AND_4:%.*]] = select i1 [[AND_3]], i1 true, i1 false
529; CHECK-NEXT:    br i1 [[AND_4]], label [[BB1:%.*]], label [[EXIT:%.*]]
530; CHECK:       bb1:
531; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
532; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
533; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
534; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
535; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
536; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i4 3, [[X]]
537; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
538; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i4 3, [[A]]
539; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
540; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
541; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
542; CHECK-NEXT:    ret i1 [[R_5]]
543; CHECK:       exit:
544; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
545; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
546; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
547; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
548; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
549; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
550; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
551; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
552; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
553; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
554; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
555; CHECK-NEXT:    ret i1 [[R_10]]
556;
557entry:
558  %c.1 = icmp ule i4 %x, %y
559  %c.2 = icmp ule i4 %y, %z
560  %c.3 = icmp ule i4 3, %x
561  %c.4 = icmp ule i4 3, %a
562  %and.1 = select i1 %c.1, i1 %c.1, i1 false
563  %and.2 = select i1 %and.1, i1 %c.3, i1 false
564  %and.3 = select i1 %c.4, i1 %and.2, i1 false
565  %and.4 = select i1 %and.3, i1 true, i1 false
566  br i1 %and.4, label %bb1, label %exit
567
568bb1:
569  %t.1 = icmp ule i4 %x, %z
570  %t.2 = icmp ule i4 %x, %y
571  %r.1 = xor i1 %t.1, %t.2
572
573  %t.3 = icmp ule i4 %y, %z
574  %r.2 = xor i1 %r.1, %t.3
575
576  %t.4 = icmp ule i4 3, %x
577  %r.3 = xor i1 %r.2, %t.4
578
579  %t.5 = icmp ule i4 3, %a
580  %r.4 = xor i1 %r.3, %t.5
581
582  %c.5 = icmp ule i4 %x, %a
583  %r.5 = xor i1 %r.4, %c.5
584
585  ret i1 %r.5
586
587exit:
588  %c.6 = icmp ule i4 %x, %z
589  %c.7 = icmp ule i4 %x, %a
590  %r.6 = xor i1 %c.6, %c.7
591
592  %c.8 = icmp ule i4 %x, %y
593  %r.7 = xor i1 %r.6, %c.8
594
595  %c.9 = icmp ule i4 %y, %z
596  %r.8 = xor i1 %r.7, %c.9
597
598  %c.10 = icmp ule i4 3, %x
599  %r.9 = xor i1 %r.8, %c.10
600
601  %c.11 = icmp ule i4 3, %a
602  %r.10 = xor i1 %r.9, %c.11
603
604  ret i1 %r.10
605}
606