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