xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/and.ll (revision 7cf499c63bfa2230d0e4144faba1fb4331f9d2ec)
12322080bSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
32322080bSFlorian Hahn
42322080bSFlorian Hahndeclare void @use(i1)
52322080bSFlorian Hahn
60bcfd4cbSFlorian Hahndefine i1 @test_and_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
72322080bSFlorian Hahn; CHECK-LABEL: @test_and_ule(
82322080bSFlorian Hahn; CHECK-NEXT:  entry:
90bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
100bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
112322080bSFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
122322080bSFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
132322080bSFlorian Hahn; CHECK:       bb1:
140bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
150bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
160bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 [[X]], [[A:%.*]]
170bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_3]]
180bcfd4cbSFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
192322080bSFlorian Hahn; CHECK:       exit:
200bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 [[X]], [[Z]]
210bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
220bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[C_4]], [[C_5]]
230bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Y]]
240bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
250bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[Y]], [[Z]]
260bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
270bcfd4cbSFlorian Hahn; CHECK-NEXT:    ret i1 [[R_6]]
282322080bSFlorian Hahn;
292322080bSFlorian Hahnentry:
300bcfd4cbSFlorian Hahn  %c.1 = icmp ule i4 %x, %y
310bcfd4cbSFlorian Hahn  %c.2 = icmp ule i4 %y, %z
322322080bSFlorian Hahn  %and = and i1 %c.1, %c.2
332322080bSFlorian Hahn  br i1 %and, label %bb1, label %exit
342322080bSFlorian Hahn
352322080bSFlorian Hahnbb1:
360bcfd4cbSFlorian Hahn  %t.1 = icmp ule i4 %x, %z
370bcfd4cbSFlorian Hahn  %t.2 = icmp ule i4 %x, %y
380bcfd4cbSFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
392322080bSFlorian Hahn
400bcfd4cbSFlorian Hahn  %t.3 = icmp ule i4 %y, %z
410bcfd4cbSFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
422322080bSFlorian Hahn
432322080bSFlorian Hahn
440bcfd4cbSFlorian Hahn  %c.3 = icmp ule i4 %x, %a
450bcfd4cbSFlorian Hahn  %r.3 = xor i1 %r.2, %c.3
462322080bSFlorian Hahn
470bcfd4cbSFlorian Hahn  ret i1 %r.3
482322080bSFlorian Hahn
492322080bSFlorian Hahnexit:
500bcfd4cbSFlorian Hahn  %c.4 = icmp ule i4 %x, %z
510bcfd4cbSFlorian Hahn  %c.5 = icmp ule i4 %x, %a
520bcfd4cbSFlorian Hahn  %r.4 = xor i1 %c.4, %c.5
532322080bSFlorian Hahn
540bcfd4cbSFlorian Hahn  %c.6 = icmp ule i4 %x, %y
550bcfd4cbSFlorian Hahn  %r.5 = xor i1 %r.4, %c.6
562322080bSFlorian Hahn
570bcfd4cbSFlorian Hahn  %c.7 = icmp ule i4 %y, %z
580bcfd4cbSFlorian Hahn  %r.6 = xor i1 %r.5, %c.7
592322080bSFlorian Hahn
600bcfd4cbSFlorian Hahn  ret i1 %r.6
612322080bSFlorian Hahn}
62109e0736SJuneyoung Lee
63bfedd5d2SJuneyoung Lee; The result of test_and_ule and test_and_select_ule should be same
640bcfd4cbSFlorian Hahndefine i1 @test_and_select_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
65109e0736SJuneyoung Lee; CHECK-LABEL: @test_and_select_ule(
66109e0736SJuneyoung Lee; CHECK-NEXT:  entry:
670bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
680bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
69109e0736SJuneyoung Lee; CHECK-NEXT:    [[AND:%.*]] = select i1 [[C_1]], i1 [[C_2]], i1 false
70109e0736SJuneyoung Lee; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
71109e0736SJuneyoung Lee; CHECK:       bb1:
720bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
730bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
740bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 [[X]], [[A:%.*]]
750bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_3]]
760bcfd4cbSFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
77109e0736SJuneyoung Lee; CHECK:       exit:
780bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 [[X]], [[Z]]
790bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
800bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[C_4]], [[C_5]]
810bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Y]]
820bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
830bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[Y]], [[Z]]
840bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
850bcfd4cbSFlorian Hahn; CHECK-NEXT:    ret i1 [[R_6]]
86109e0736SJuneyoung Lee;
87109e0736SJuneyoung Leeentry:
880bcfd4cbSFlorian Hahn  %c.1 = icmp ule i4 %x, %y
890bcfd4cbSFlorian Hahn  %c.2 = icmp ule i4 %y, %z
90109e0736SJuneyoung Lee  %and = select i1 %c.1, i1 %c.2, i1 false
91109e0736SJuneyoung Lee  br i1 %and, label %bb1, label %exit
92109e0736SJuneyoung Lee
93109e0736SJuneyoung Leebb1:
940bcfd4cbSFlorian Hahn  %t.1 = icmp ule i4 %x, %z
950bcfd4cbSFlorian Hahn  %t.2 = icmp ule i4 %x, %y
960bcfd4cbSFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
97109e0736SJuneyoung Lee
980bcfd4cbSFlorian Hahn  %t.3 = icmp ule i4 %y, %z
990bcfd4cbSFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
100109e0736SJuneyoung Lee
1010bcfd4cbSFlorian Hahn  %c.3 = icmp ule i4 %x, %a
1020bcfd4cbSFlorian Hahn  %r.3 = xor i1 %r.2, %c.3
1030bcfd4cbSFlorian Hahn  ret i1 %r.3
104109e0736SJuneyoung Lee
105109e0736SJuneyoung Leeexit:
1060bcfd4cbSFlorian Hahn  %c.4 = icmp ule i4 %x, %z
1070bcfd4cbSFlorian Hahn  %c.5 = icmp ule i4 %x, %a
1080bcfd4cbSFlorian Hahn  %r.4 = xor i1 %c.4, %c.5
109109e0736SJuneyoung Lee
1100bcfd4cbSFlorian Hahn  %c.6 = icmp ule i4 %x, %y
1110bcfd4cbSFlorian Hahn  %r.5 = xor i1 %r.4, %c.6
112109e0736SJuneyoung Lee
1130bcfd4cbSFlorian Hahn  %c.7 = icmp ule i4 %y, %z
1140bcfd4cbSFlorian Hahn  %r.6 = xor i1 %r.5, %c.7
1150bcfd4cbSFlorian Hahn  ret i1 %r.6
116109e0736SJuneyoung Lee}
11714da287eSFlorian Hahn
1180bcfd4cbSFlorian Hahndefine i4 @and_compare_undef(i4 %N, i4 %step) {
11914da287eSFlorian Hahn; CHECK-LABEL: @and_compare_undef(
12014da287eSFlorian Hahn; CHECK-NEXT:  step.check:
1210bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[B1:%.*]] = add i4 undef, -1
1220bcfd4cbSFlorian Hahn; CHECK-NEXT:    [[STEP_ULT_N:%.*]] = icmp ult i4 [[B1]], [[N:%.*]]
12398e016d9SFlorian Hahn; CHECK-NEXT:    [[AND_STEP:%.*]] = and i1 true, [[STEP_ULT_N]]
12414da287eSFlorian Hahn; CHECK-NEXT:    br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
12514da287eSFlorian Hahn; CHECK:       ptr.check:
12614da287eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
12714da287eSFlorian Hahn; CHECK:       exit:
12814da287eSFlorian Hahn; CHECK-NEXT:    ret i4 3
12914da287eSFlorian Hahn;
13014da287eSFlorian Hahnstep.check:
1310bcfd4cbSFlorian Hahn  %step.pos = icmp uge i4 %step, 0
1320bcfd4cbSFlorian Hahn  %B1 = add i4 undef, -1
1330bcfd4cbSFlorian Hahn  %step.ult.N = icmp ult i4 %B1, %N
13414da287eSFlorian Hahn  %and.step = and i1 %step.pos, %step.ult.N
13514da287eSFlorian Hahn  br i1 %and.step, label %ptr.check, label %exit
13614da287eSFlorian Hahn
13714da287eSFlorian Hahnptr.check:
13814da287eSFlorian Hahn  br label %exit
13914da287eSFlorian Hahn
14014da287eSFlorian Hahnexit:
14114da287eSFlorian Hahn  ret i4 3
14214da287eSFlorian Hahn}
143bec1aa30SFlorian Hahn
144c5e1ddb6SFlorian Hahndefine i1 @test_and_condition_trivially_false(i1 %c, ptr %ptr.1, i8 %idx, ptr %ptr.2) {
145bec1aa30SFlorian Hahn; CHECK-LABEL: @test_and_condition_trivially_false(
146bec1aa30SFlorian Hahn; CHECK-NEXT:  entry:
147bec1aa30SFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT_3:%.*]]
148bec1aa30SFlorian Hahn; CHECK:       then:
149bec1aa30SFlorian Hahn; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[IDX:%.*]] to i16
150c5e1ddb6SFlorian Hahn; CHECK-NEXT:    [[GEP_IDX_EXT:%.*]] = getelementptr inbounds i8, ptr [[PTR_1:%.*]], i16 [[IDX_EXT]]
15113ffde31SFlorian Hahn; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ult ptr [[PTR_2:%.*]], [[GEP_IDX_EXT]]
152bec1aa30SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 false, [[CMP_2]]
153bec1aa30SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
154bec1aa30SFlorian Hahn; CHECK:       exit.1:
155bec1aa30SFlorian Hahn; CHECK-NEXT:    ret i1 true
156bec1aa30SFlorian Hahn; CHECK:       exit.2:
157bec1aa30SFlorian Hahn; CHECK-NEXT:    ret i1 false
158bec1aa30SFlorian Hahn; CHECK:       exit.3:
159bec1aa30SFlorian Hahn; CHECK-NEXT:    [[CMP_3:%.*]] = icmp ne i8 [[IDX]], 0
160bec1aa30SFlorian Hahn; CHECK-NEXT:    ret i1 [[CMP_3]]
161bec1aa30SFlorian Hahn;
162bec1aa30SFlorian Hahnentry:
163bec1aa30SFlorian Hahn  br i1 %c, label %then, label %exit.3
164bec1aa30SFlorian Hahn
165bec1aa30SFlorian Hahnthen:
166c5e1ddb6SFlorian Hahn  %cmp.1 = icmp ugt ptr %ptr.2, %ptr.2
167bec1aa30SFlorian Hahn  %idx.ext = zext i8 %idx to i16
168c5e1ddb6SFlorian Hahn  %gep.idx.ext = getelementptr inbounds i8, ptr %ptr.1, i16 %idx.ext
169c5e1ddb6SFlorian Hahn  %cmp.2 = icmp ult ptr %ptr.2, %gep.idx.ext
170bec1aa30SFlorian Hahn  %and = and i1 %cmp.1, %cmp.2
171bec1aa30SFlorian Hahn  br i1 %and, label %exit.1, label %exit.2
172bec1aa30SFlorian Hahn
173bec1aa30SFlorian Hahnexit.1:
174c5e1ddb6SFlorian Hahn  ret i1 true
175bec1aa30SFlorian Hahn
176bec1aa30SFlorian Hahnexit.2:
177c5e1ddb6SFlorian Hahn  ret i1 false
178bec1aa30SFlorian Hahn
179bec1aa30SFlorian Hahnexit.3:
180bec1aa30SFlorian Hahn  %cmp.3 = icmp ne i8 %idx, 0
181bec1aa30SFlorian Hahn  ret i1 %cmp.3
182bec1aa30SFlorian Hahn}
183e09b0589SFlorian Hahn
184e09b0589SFlorian Hahndefine i1 @test_and_chain_ule_1(i4 %x, i4 %y, i4 %z, i4 %a) {
185e09b0589SFlorian Hahn; CHECK-LABEL: @test_and_chain_ule_1(
186e09b0589SFlorian Hahn; CHECK-NEXT:  entry:
187e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
188e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
189e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
190e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
191e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
192e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[AND_1]], [[C_3]]
193e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[C_4]], [[AND_2]]
194e09b0589SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
195e09b0589SFlorian Hahn; CHECK:       bb1:
196a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
197a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
198a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
199a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
200e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
201e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
202e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_5]]
203e09b0589SFlorian Hahn; CHECK:       exit:
204e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
205e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
206e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
207e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
208e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
209e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
210e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
211e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
212e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
213e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
214e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
215e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_10]]
216e09b0589SFlorian Hahn;
217e09b0589SFlorian Hahnentry:
218e09b0589SFlorian Hahn  %c.1 = icmp ule i4 %x, %y
219e09b0589SFlorian Hahn  %c.2 = icmp ule i4 %y, %z
220e09b0589SFlorian Hahn  %c.3 = icmp ule i4 3, %x
221e09b0589SFlorian Hahn  %c.4 = icmp ule i4 3, %a
222e09b0589SFlorian Hahn  %and.1 = and i1 %c.1, %c.2
223e09b0589SFlorian Hahn  %and.2 = and i1 %and.1, %c.3
224e09b0589SFlorian Hahn  %and.3 = and i1 %c.4, %and.2
225e09b0589SFlorian Hahn  br i1 %and.3, label %bb1, label %exit
226e09b0589SFlorian Hahn
227e09b0589SFlorian Hahnbb1:
228e09b0589SFlorian Hahn  %t.1 = icmp ule i4 %x, %z
229e09b0589SFlorian Hahn  %t.2 = icmp ule i4 %x, %y
230e09b0589SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
231e09b0589SFlorian Hahn
232e09b0589SFlorian Hahn  %t.3 = icmp ule i4 %y, %z
233e09b0589SFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
234e09b0589SFlorian Hahn
235e09b0589SFlorian Hahn  %t.4 = icmp ule i4 3, %x
236e09b0589SFlorian Hahn  %r.3 = xor i1 %r.2, %t.4
237e09b0589SFlorian Hahn
238e09b0589SFlorian Hahn  %t.5 = icmp ule i4 3, %a
239e09b0589SFlorian Hahn  %r.4 = xor i1 %r.3, %t.5
240e09b0589SFlorian Hahn
241e09b0589SFlorian Hahn  %c.5 = icmp ule i4 %x, %a
242e09b0589SFlorian Hahn  %r.5 = xor i1 %r.4, %c.5
243e09b0589SFlorian Hahn
244e09b0589SFlorian Hahn  ret i1 %r.5
245e09b0589SFlorian Hahn
246e09b0589SFlorian Hahnexit:
247e09b0589SFlorian Hahn  %c.6 = icmp ule i4 %x, %z
248e09b0589SFlorian Hahn  %c.7 = icmp ule i4 %x, %a
249e09b0589SFlorian Hahn  %r.6 = xor i1 %c.6, %c.7
250e09b0589SFlorian Hahn
251e09b0589SFlorian Hahn  %c.8 = icmp ule i4 %x, %y
252e09b0589SFlorian Hahn  %r.7 = xor i1 %r.6, %c.8
253e09b0589SFlorian Hahn
254e09b0589SFlorian Hahn  %c.9 = icmp ule i4 %y, %z
255e09b0589SFlorian Hahn  %r.8 = xor i1 %r.7, %c.9
256e09b0589SFlorian Hahn
257e09b0589SFlorian Hahn  %c.10 = icmp ule i4 3, %x
258e09b0589SFlorian Hahn  %r.9 = xor i1 %r.8, %c.10
259e09b0589SFlorian Hahn
260e09b0589SFlorian Hahn  %c.11 = icmp ule i4 3, %a
261e09b0589SFlorian Hahn  %r.10 = xor i1 %r.9, %c.11
262e09b0589SFlorian Hahn
263e09b0589SFlorian Hahn  ret i1 %r.10
264e09b0589SFlorian Hahn}
265e09b0589SFlorian Hahn
266e09b0589SFlorian Hahn; Same as @test_and_chain_ule_1 but with `and`s reordered.
267e09b0589SFlorian Hahndefine i1 @test_and_chain_ule_2(i4 %x, i4 %y, i4 %z, i4 %a) {
268e09b0589SFlorian Hahn; CHECK-LABEL: @test_and_chain_ule_2(
269e09b0589SFlorian Hahn; CHECK-NEXT:  entry:
270e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
271e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
272e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
273e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
274e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
275e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[C_3]], [[C_4]]
276e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[AND_1]], [[AND_2]]
277e09b0589SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
278e09b0589SFlorian Hahn; CHECK:       bb1:
279a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
280a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
281a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
282a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
283e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
284e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
285e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_5]]
286e09b0589SFlorian Hahn; CHECK:       exit:
287e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
288e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
289e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
290e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
291e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
292e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
293e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
294e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
295e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
296e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
297e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
298e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_10]]
299e09b0589SFlorian Hahn;
300e09b0589SFlorian Hahnentry:
301e09b0589SFlorian Hahn  %c.1 = icmp ule i4 %x, %y
302e09b0589SFlorian Hahn  %c.2 = icmp ule i4 %y, %z
303e09b0589SFlorian Hahn  %c.3 = icmp ule i4 3, %x
304e09b0589SFlorian Hahn  %c.4 = icmp ule i4 3, %a
305e09b0589SFlorian Hahn  %and.1 = and i1 %c.1, %c.2
306e09b0589SFlorian Hahn  %and.2 = and i1 %c.3, %c.4
307e09b0589SFlorian Hahn  %and.3 = and i1 %and.1, %and.2
308e09b0589SFlorian Hahn  br i1 %and.3, label %bb1, label %exit
309e09b0589SFlorian Hahn
310e09b0589SFlorian Hahnbb1:
311e09b0589SFlorian Hahn  %t.1 = icmp ule i4 %x, %z
312e09b0589SFlorian Hahn  %t.2 = icmp ule i4 %x, %y
313e09b0589SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
314e09b0589SFlorian Hahn
315e09b0589SFlorian Hahn  %t.3 = icmp ule i4 %y, %z
316e09b0589SFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
317e09b0589SFlorian Hahn
318e09b0589SFlorian Hahn  %t.4 = icmp ule i4 3, %x
319e09b0589SFlorian Hahn  %r.3 = xor i1 %r.2, %t.4
320e09b0589SFlorian Hahn
321e09b0589SFlorian Hahn  %t.5 = icmp ule i4 3, %a
322e09b0589SFlorian Hahn  %r.4 = xor i1 %r.3, %t.5
323e09b0589SFlorian Hahn
324e09b0589SFlorian Hahn  %c.5 = icmp ule i4 %x, %a
325e09b0589SFlorian Hahn  %r.5 = xor i1 %r.4, %c.5
326e09b0589SFlorian Hahn
327e09b0589SFlorian Hahn  ret i1 %r.5
328e09b0589SFlorian Hahn
329e09b0589SFlorian Hahnexit:
330e09b0589SFlorian Hahn  %c.6 = icmp ule i4 %x, %z
331e09b0589SFlorian Hahn  %c.7 = icmp ule i4 %x, %a
332e09b0589SFlorian Hahn  %r.6 = xor i1 %c.6, %c.7
333e09b0589SFlorian Hahn
334e09b0589SFlorian Hahn  %c.8 = icmp ule i4 %x, %y
335e09b0589SFlorian Hahn  %r.7 = xor i1 %r.6, %c.8
336e09b0589SFlorian Hahn
337e09b0589SFlorian Hahn  %c.9 = icmp ule i4 %y, %z
338e09b0589SFlorian Hahn  %r.8 = xor i1 %r.7, %c.9
339e09b0589SFlorian Hahn
340e09b0589SFlorian Hahn  %c.10 = icmp ule i4 3, %x
341e09b0589SFlorian Hahn  %r.9 = xor i1 %r.8, %c.10
342e09b0589SFlorian Hahn
343e09b0589SFlorian Hahn  %c.11 = icmp ule i4 3, %a
344e09b0589SFlorian Hahn  %r.10 = xor i1 %r.9, %c.11
345e09b0589SFlorian Hahn
346e09b0589SFlorian Hahn  ret i1 %r.10
347e09b0589SFlorian Hahn}
348e09b0589SFlorian Hahn
349e09b0589SFlorian Hahn
350e09b0589SFlorian Hahndeclare i1 @cond() readnone
351e09b0589SFlorian Hahn
352e09b0589SFlorian Hahndefine i1 @test_and_chain_with_other_insts_ule(i4 %x, i4 %y, i4 %z, i4 %a, i1 %arg.c) {
353e09b0589SFlorian Hahn; CHECK-LABEL: @test_and_chain_with_other_insts_ule(
354e09b0589SFlorian Hahn; CHECK-NEXT:  entry:
355e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
356e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
357e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = call i1 @cond()
358e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[C_1]], [[C_2]]
359e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = and i1 [[C_3]], [[ARG_C:%.*]]
360e09b0589SFlorian Hahn; CHECK-NEXT:    [[AND_3:%.*]] = and i1 [[AND_1]], [[AND_2]]
361e09b0589SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
362e09b0589SFlorian Hahn; CHECK:       bb1:
363a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, true
364a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], true
365e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[X]]
366e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
367e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 3, [[A:%.*]]
368e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
369e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[A]]
370e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
371e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_5]]
372e09b0589SFlorian Hahn; CHECK:       exit:
373e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Z]]
374e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[X]], [[A]]
375e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_8]], [[C_9]]
376e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 [[X]], [[Y]]
377e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_10]]
378e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 [[Y]], [[Z]]
379e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_11]]
380e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_12:%.*]] = icmp ule i4 3, [[X]]
381e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_12]]
382e09b0589SFlorian Hahn; CHECK-NEXT:    [[C_13:%.*]] = icmp ule i4 3, [[A]]
383e09b0589SFlorian Hahn; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_13]]
384e09b0589SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_10]]
385e09b0589SFlorian Hahn;
386e09b0589SFlorian Hahnentry:
387e09b0589SFlorian Hahn  %c.1 = icmp ule i4 %x, %y
388e09b0589SFlorian Hahn  %c.2 = icmp ule i4 %y, %z
389e09b0589SFlorian Hahn  %c.3 = call i1 @cond()
390e09b0589SFlorian Hahn  %and.1 = and i1 %c.1, %c.2
391e09b0589SFlorian Hahn  %and.2 = and i1 %c.3, %arg.c
392e09b0589SFlorian Hahn  %and.3 = and i1 %and.1, %and.2
393e09b0589SFlorian Hahn  br i1 %and.3, label %bb1, label %exit
394e09b0589SFlorian Hahn
395e09b0589SFlorian Hahnbb1:
396e09b0589SFlorian Hahn  %t.1 = icmp ule i4 %x, %z
397e09b0589SFlorian Hahn  %t.2 = icmp ule i4 %x, %y
398e09b0589SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
399e09b0589SFlorian Hahn
400e09b0589SFlorian Hahn  %t.3 = icmp ule i4 %y, %z
401e09b0589SFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
402e09b0589SFlorian Hahn
403e09b0589SFlorian Hahn  %c.4 = icmp ule i4 3, %x
404e09b0589SFlorian Hahn  %r.3 = xor i1 %r.2, %c.4
405e09b0589SFlorian Hahn
406e09b0589SFlorian Hahn  %c.5 = icmp ule i4 3, %a
407e09b0589SFlorian Hahn  %r.4 = xor i1 %r.3, %c.5
408e09b0589SFlorian Hahn
409e09b0589SFlorian Hahn  %c.6 = icmp ule i4 %x, %a
410e09b0589SFlorian Hahn  %r.5 = xor i1 %r.4, %c.6
411e09b0589SFlorian Hahn
412e09b0589SFlorian Hahn  ret i1 %r.5
413e09b0589SFlorian Hahn
414e09b0589SFlorian Hahnexit:
415e09b0589SFlorian Hahn  %c.8 = icmp ule i4 %x, %z
416e09b0589SFlorian Hahn  %c.9 = icmp ule i4 %x, %a
417e09b0589SFlorian Hahn  %r.6 = xor i1 %c.8, %c.9
418e09b0589SFlorian Hahn
419e09b0589SFlorian Hahn  %c.10 = icmp ule i4 %x, %y
420e09b0589SFlorian Hahn  %r.7 = xor i1 %r.6, %c.10
421e09b0589SFlorian Hahn
422e09b0589SFlorian Hahn  %c.11 = icmp ule i4 %y, %z
423e09b0589SFlorian Hahn  %r.8 = xor i1 %r.7, %c.11
424e09b0589SFlorian Hahn
425e09b0589SFlorian Hahn  %c.12 = icmp ule i4 3, %x
426e09b0589SFlorian Hahn  %r.9 = xor i1 %r.8, %c.12
427e09b0589SFlorian Hahn
428e09b0589SFlorian Hahn  %c.13 = icmp ule i4 3, %a
429e09b0589SFlorian Hahn  %r.10 = xor i1 %r.9, %c.13
430e09b0589SFlorian Hahn
431e09b0589SFlorian Hahn  ret i1 %r.10
432e09b0589SFlorian Hahn}
433e09b0589SFlorian Hahn
434a2f96a10SFlorian Hahndefine i1 @test_and_chain_select_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
435a2f96a10SFlorian Hahn; CHECK-LABEL: @test_and_chain_select_ule(
436a2f96a10SFlorian Hahn; CHECK-NEXT:  entry:
437a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
438a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
439a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
440a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
441*7cf499c6SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
442a2f96a10SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
443a2f96a10SFlorian Hahn; CHECK-NEXT:    [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
444a2f96a10SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
445a2f96a10SFlorian Hahn; CHECK:       bb1:
446a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
447a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], true
448a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
449a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
450a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], true
451a7ac0dd0SFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
452a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
453a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
454a2f96a10SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_5]]
455a2f96a10SFlorian Hahn; CHECK:       exit:
456a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
457a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
458a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
459a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
460a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
461a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
462a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
463a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
464a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
465a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
466a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
467a2f96a10SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_10]]
468a2f96a10SFlorian Hahn;
469a2f96a10SFlorian Hahnentry:
470a2f96a10SFlorian Hahn  %c.1 = icmp ule i4 %x, %y
471a2f96a10SFlorian Hahn  %c.2 = icmp ule i4 %y, %z
472a2f96a10SFlorian Hahn  %c.3 = icmp ule i4 3, %x
473a2f96a10SFlorian Hahn  %c.4 = icmp ule i4 3, %a
474a2f96a10SFlorian Hahn  %and.1 = select i1 %c.1, i1 %c.1, i1 false
475a2f96a10SFlorian Hahn  %and.2 = select i1 %and.1, i1 %c.3, i1 false
476a2f96a10SFlorian Hahn  %and.3 = select i1 %c.4, i1 %and.2, i1 false
477a2f96a10SFlorian Hahn  br i1 %and.3, label %bb1, label %exit
478a2f96a10SFlorian Hahn
479a2f96a10SFlorian Hahnbb1:
480a2f96a10SFlorian Hahn  %t.1 = icmp ule i4 %x, %z
481a2f96a10SFlorian Hahn  %t.2 = icmp ule i4 %x, %y
482a2f96a10SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
483a2f96a10SFlorian Hahn
484a2f96a10SFlorian Hahn  %t.3 = icmp ule i4 %y, %z
485a2f96a10SFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
486a2f96a10SFlorian Hahn
487a2f96a10SFlorian Hahn  %t.4 = icmp ule i4 3, %x
488a2f96a10SFlorian Hahn  %r.3 = xor i1 %r.2, %t.4
489a2f96a10SFlorian Hahn
490a2f96a10SFlorian Hahn  %t.5 = icmp ule i4 3, %a
491a2f96a10SFlorian Hahn  %r.4 = xor i1 %r.3, %t.5
492a2f96a10SFlorian Hahn
493a2f96a10SFlorian Hahn  %c.5 = icmp ule i4 %x, %a
494a2f96a10SFlorian Hahn  %r.5 = xor i1 %r.4, %c.5
495a2f96a10SFlorian Hahn
496a2f96a10SFlorian Hahn  ret i1 %r.5
497a2f96a10SFlorian Hahn
498a2f96a10SFlorian Hahnexit:
499a2f96a10SFlorian Hahn  %c.6 = icmp ule i4 %x, %z
500a2f96a10SFlorian Hahn  %c.7 = icmp ule i4 %x, %a
501a2f96a10SFlorian Hahn  %r.6 = xor i1 %c.6, %c.7
502a2f96a10SFlorian Hahn
503a2f96a10SFlorian Hahn  %c.8 = icmp ule i4 %x, %y
504a2f96a10SFlorian Hahn  %r.7 = xor i1 %r.6, %c.8
505a2f96a10SFlorian Hahn
506a2f96a10SFlorian Hahn  %c.9 = icmp ule i4 %y, %z
507a2f96a10SFlorian Hahn  %r.8 = xor i1 %r.7, %c.9
508a2f96a10SFlorian Hahn
509a2f96a10SFlorian Hahn  %c.10 = icmp ule i4 3, %x
510a2f96a10SFlorian Hahn  %r.9 = xor i1 %r.8, %c.10
511a2f96a10SFlorian Hahn
512a2f96a10SFlorian Hahn  %c.11 = icmp ule i4 3, %a
513a2f96a10SFlorian Hahn  %r.10 = xor i1 %r.9, %c.11
514a2f96a10SFlorian Hahn
515a2f96a10SFlorian Hahn  ret i1 %r.10
516a2f96a10SFlorian Hahn}
517a2f96a10SFlorian Hahn
518a2f96a10SFlorian Hahndefine i1 @test_and_chain_select_ule_logical_or(i4 %x, i4 %y, i4 %z, i4 %a) {
519a2f96a10SFlorian Hahn; CHECK-LABEL: @test_and_chain_select_ule_logical_or(
520a2f96a10SFlorian Hahn; CHECK-NEXT:  entry:
521a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
522a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
523a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i4 3, [[X]]
524a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
525*7cf499c6SFlorian Hahn; CHECK-NEXT:    [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
526a2f96a10SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
527a2f96a10SFlorian Hahn; CHECK-NEXT:    [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
528a2f96a10SFlorian Hahn; CHECK-NEXT:    [[AND_4:%.*]] = select i1 [[AND_3]], i1 true, i1 false
529a2f96a10SFlorian Hahn; CHECK-NEXT:    br i1 [[AND_4]], label [[BB1:%.*]], label [[EXIT:%.*]]
530a2f96a10SFlorian Hahn; CHECK:       bb1:
531a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
532a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
533a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
534a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
535a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
536a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i4 3, [[X]]
537a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
538a2f96a10SFlorian Hahn; CHECK-NEXT:    [[T_5:%.*]] = icmp ule i4 3, [[A]]
539a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
540a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
541a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
542a2f96a10SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_5]]
543a2f96a10SFlorian Hahn; CHECK:       exit:
544a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
545a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
546a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
547a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
548a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
549a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
550a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
551a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_10:%.*]] = icmp ule i4 3, [[X]]
552a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
553a2f96a10SFlorian Hahn; CHECK-NEXT:    [[C_11:%.*]] = icmp ule i4 3, [[A]]
554a2f96a10SFlorian Hahn; CHECK-NEXT:    [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
555a2f96a10SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_10]]
556a2f96a10SFlorian Hahn;
557a2f96a10SFlorian Hahnentry:
558a2f96a10SFlorian Hahn  %c.1 = icmp ule i4 %x, %y
559a2f96a10SFlorian Hahn  %c.2 = icmp ule i4 %y, %z
560a2f96a10SFlorian Hahn  %c.3 = icmp ule i4 3, %x
561a2f96a10SFlorian Hahn  %c.4 = icmp ule i4 3, %a
562a2f96a10SFlorian Hahn  %and.1 = select i1 %c.1, i1 %c.1, i1 false
563a2f96a10SFlorian Hahn  %and.2 = select i1 %and.1, i1 %c.3, i1 false
564a2f96a10SFlorian Hahn  %and.3 = select i1 %c.4, i1 %and.2, i1 false
565a2f96a10SFlorian Hahn  %and.4 = select i1 %and.3, i1 true, i1 false
566a2f96a10SFlorian Hahn  br i1 %and.4, label %bb1, label %exit
567a2f96a10SFlorian Hahn
568a2f96a10SFlorian Hahnbb1:
569a2f96a10SFlorian Hahn  %t.1 = icmp ule i4 %x, %z
570a2f96a10SFlorian Hahn  %t.2 = icmp ule i4 %x, %y
571a2f96a10SFlorian Hahn  %r.1 = xor i1 %t.1, %t.2
572a2f96a10SFlorian Hahn
573a2f96a10SFlorian Hahn  %t.3 = icmp ule i4 %y, %z
574a2f96a10SFlorian Hahn  %r.2 = xor i1 %r.1, %t.3
575a2f96a10SFlorian Hahn
576a2f96a10SFlorian Hahn  %t.4 = icmp ule i4 3, %x
577a2f96a10SFlorian Hahn  %r.3 = xor i1 %r.2, %t.4
578a2f96a10SFlorian Hahn
579a2f96a10SFlorian Hahn  %t.5 = icmp ule i4 3, %a
580a2f96a10SFlorian Hahn  %r.4 = xor i1 %r.3, %t.5
581a2f96a10SFlorian Hahn
582a2f96a10SFlorian Hahn  %c.5 = icmp ule i4 %x, %a
583a2f96a10SFlorian Hahn  %r.5 = xor i1 %r.4, %c.5
584a2f96a10SFlorian Hahn
585a2f96a10SFlorian Hahn  ret i1 %r.5
586a2f96a10SFlorian Hahn
587a2f96a10SFlorian Hahnexit:
588a2f96a10SFlorian Hahn  %c.6 = icmp ule i4 %x, %z
589a2f96a10SFlorian Hahn  %c.7 = icmp ule i4 %x, %a
590a2f96a10SFlorian Hahn  %r.6 = xor i1 %c.6, %c.7
591a2f96a10SFlorian Hahn
592a2f96a10SFlorian Hahn  %c.8 = icmp ule i4 %x, %y
593a2f96a10SFlorian Hahn  %r.7 = xor i1 %r.6, %c.8
594a2f96a10SFlorian Hahn
595a2f96a10SFlorian Hahn  %c.9 = icmp ule i4 %y, %z
596a2f96a10SFlorian Hahn  %r.8 = xor i1 %r.7, %c.9
597a2f96a10SFlorian Hahn
598a2f96a10SFlorian Hahn  %c.10 = icmp ule i4 3, %x
599a2f96a10SFlorian Hahn  %r.9 = xor i1 %r.8, %c.10
600a2f96a10SFlorian Hahn
601a2f96a10SFlorian Hahn  %c.11 = icmp ule i4 3, %a
602a2f96a10SFlorian Hahn  %r.10 = xor i1 %r.9, %c.11
603a2f96a10SFlorian Hahn
604a2f96a10SFlorian Hahn  ret i1 %r.10
605a2f96a10SFlorian Hahn}
606