1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %x) { 4*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1 5*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 6*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %x, -2 7*9880d681SAndroid Build Coastguard Worker %and1.x = select i1 %cmp, i32 %and1, i32 %x 8*9880d681SAndroid Build Coastguard Worker ret i32 %and1.x 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 10*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %x) { 14*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1 15*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 16*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %x, -2 17*9880d681SAndroid Build Coastguard Worker %and1.x = select i1 %cmp, i32 %x, i32 %and1 18*9880d681SAndroid Build Coastguard Worker ret i32 %and1.x 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 20*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %x) { 24*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 1 25*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %and, 0 26*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %x, -2 27*9880d681SAndroid Build Coastguard Worker %and1.x = select i1 %cmp, i32 %and1, i32 %x 28*9880d681SAndroid Build Coastguard Worker ret i32 %and1.x 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 30*9880d681SAndroid Build Coastguard Worker; CHECK: %[[and:.*]] = and i32 %x, -2 31*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[and]] 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %X) { 35*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %X, 0 36*9880d681SAndroid Build Coastguard Worker %or = or i32 %X, -2147483648 37*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %X, i32 %or 38*9880d681SAndroid Build Coastguard Worker ret i32 %cond 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 40*9880d681SAndroid Build Coastguard Worker; CHECK: %[[or:.*]] = or i32 %X, -2147483648 41*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[or]] 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %X) { 45*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %X, 0 46*9880d681SAndroid Build Coastguard Worker %or = or i32 %X, -2147483648 47*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %or, i32 %X 48*9880d681SAndroid Build Coastguard Worker ret i32 %cond 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 50*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %X 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %X) { 54*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %X, 0 55*9880d681SAndroid Build Coastguard Worker %and = and i32 %X, 2147483647 56*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %and, i32 %X 57*9880d681SAndroid Build Coastguard Worker ret i32 %cond 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 59*9880d681SAndroid Build Coastguard Worker; CHECK: %[[and:.*]] = and i32 %X, 2147483647 60*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[and]] 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %X) { 64*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %X, 0 65*9880d681SAndroid Build Coastguard Worker %and = and i32 %X, 2147483647 66*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %X, i32 %and 67*9880d681SAndroid Build Coastguard Worker ret i32 %cond 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 69*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %X 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %X) { 73*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %X, -1 74*9880d681SAndroid Build Coastguard Worker %or = or i32 %X, -2147483648 75*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %X, i32 %or 76*9880d681SAndroid Build Coastguard Worker ret i32 %cond 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 78*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %X 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %X) { 82*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %X, -1 83*9880d681SAndroid Build Coastguard Worker %or = or i32 %X, -2147483648 84*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %or, i32 %X 85*9880d681SAndroid Build Coastguard Worker ret i32 %cond 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9 87*9880d681SAndroid Build Coastguard Worker; CHECK: %[[or:.*]] = or i32 %X, -2147483648 88*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[or]] 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %X) { 92*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %X, -1 93*9880d681SAndroid Build Coastguard Worker %and = and i32 %X, 2147483647 94*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %and, i32 %X 95*9880d681SAndroid Build Coastguard Worker ret i32 %cond 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 97*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %X 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %X) { 101*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %X, -1 102*9880d681SAndroid Build Coastguard Worker %and = and i32 %X, 2147483647 103*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %X, i32 %and 104*9880d681SAndroid Build Coastguard Worker ret i32 %cond 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11 106*9880d681SAndroid Build Coastguard Worker; CHECK: %[[and:.*]] = and i32 %X, 2147483647 107*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[and]] 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_8_eq_0_or_8( 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, 8 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[OR]] 113*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_8_eq_0_or_8(i32 %x) { 114*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 115*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 116*9880d681SAndroid Build Coastguard Worker %or = or i32 %x, 8 117*9880d681SAndroid Build Coastguard Worker %or.x = select i1 %cmp, i32 %or, i32 %x 118*9880d681SAndroid Build Coastguard Worker ret i32 %or.x 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_8_ne_0_and_not_8( 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, -9 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]] 124*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_8_ne_0_and_not_8(i32 %x) { 125*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 126*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 127*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %x, -9 128*9880d681SAndroid Build Coastguard Worker %x.and1 = select i1 %cmp, i32 %x, i32 %and1 129*9880d681SAndroid Build Coastguard Worker ret i32 %x.and1 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_and_8_eq_0_and_not_8( 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %x 134*9880d681SAndroid Build Coastguard Workerdefine i32 @select_icmp_and_8_eq_0_and_not_8(i32 %x) { 135*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 136*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 137*9880d681SAndroid Build Coastguard Worker %and1 = and i32 %x, -9 138*9880d681SAndroid Build Coastguard Worker %and1.x = select i1 %cmp, i32 %and1, i32 %x 139*9880d681SAndroid Build Coastguard Worker ret i32 %and1.x 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_and_not_8( 143*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp, i64 %y, i64 %and1 144*9880d681SAndroid Build Coastguard Workerdefine i64 @select_icmp_x_and_8_eq_0_y_and_not_8(i32 %x, i64 %y) { 145*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 146*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 147*9880d681SAndroid Build Coastguard Worker %and1 = and i64 %y, -9 148*9880d681SAndroid Build Coastguard Worker %y.and1 = select i1 %cmp, i64 %y, i64 %and1 149*9880d681SAndroid Build Coastguard Worker ret i64 %y.and1 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_and_not_8( 153*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %cmp, i64 %and1, i64 %y 154*9880d681SAndroid Build Coastguard Workerdefine i64 @select_icmp_x_and_8_ne_0_y_and_not_8(i32 %x, i64 %y) { 155*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 8 156*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %and, 0 157*9880d681SAndroid Build Coastguard Worker %and1 = and i64 %y, -9 158*9880d681SAndroid Build Coastguard Worker %and1.y = select i1 %cmp, i64 %and1, i64 %y 159*9880d681SAndroid Build Coastguard Worker ret i64 %and1.y 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162