1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notallzeroes(i32 %A) { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notallzeroes 5*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7 6*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], 0 7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39 8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 11*9880d681SAndroid Build Coastguard Worker %tst1 = icmp ne i32 %mask1, 0 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 14*9880d681SAndroid Build Coastguard Worker %tst2 = icmp ne i32 %mask2, 0 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker %res = and i1 %tst1, %tst2 17*9880d681SAndroid Build Coastguard Worker ret i1 %res 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allzeroes(i32 %A) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allzeroes 22*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7 23*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39 25*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 28*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %mask1, 0 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 31*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %mask2, 0 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker %res = or i1 %tst1, %tst2 34*9880d681SAndroid Build Coastguard Worker ret i1 %res 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notallones(i32 %A) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notallones 39*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7 40*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], 7 41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39 42*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 45*9880d681SAndroid Build Coastguard Worker %tst1 = icmp ne i32 %mask1, 7 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 48*9880d681SAndroid Build Coastguard Worker %tst2 = icmp ne i32 %mask2, 39 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker %res = and i1 %tst1, %tst2 51*9880d681SAndroid Build Coastguard Worker ret i1 %res 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allones(i32 %A) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allones 56*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 7 57*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 7 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 39 59*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 62*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %mask1, 7 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 65*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %mask2, 39 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker %res = or i1 %tst1, %tst2 68*9880d681SAndroid Build Coastguard Worker ret i1 %res 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_and_notA(i32 %A) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_and_notA 73*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39 74*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne i32 [[MASK]], %A 75*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 7 76*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 79*9880d681SAndroid Build Coastguard Worker %tst1 = icmp ne i32 %mask1, %A 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 82*9880d681SAndroid Build Coastguard Worker %tst2 = icmp ne i32 %mask2, %A 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker %res = and i1 %tst1, %tst2 85*9880d681SAndroid Build Coastguard Worker ret i1 %res 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_A(i32 %A) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_A 90*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39 91*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], %A 92*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and i32 %A, 7 93*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 7 96*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %mask1, %A 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 99*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %mask2, %A 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker %res = or i1 %tst1, %tst2 102*9880d681SAndroid Build Coastguard Worker ret i1 %res 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine i1 @masked_or_allzeroes_notoptimised(i32 %A) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @masked_or_allzeroes_notoptimised 107*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 15 108*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0 109*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %A, 39 110*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0 111*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker %mask1 = and i32 %A, 15 114*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %mask1, 0 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker %mask2 = and i32 %A, 39 117*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %mask2, 0 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker %res = or i1 %tst1, %tst2 120*9880d681SAndroid Build Coastguard Worker ret i1 %res 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i1 @nomask_lhs(i32 %in) { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nomask_lhs 125*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %in, 1 126*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0 127*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp 128*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 129*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %in, 0 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker %masked = and i32 %in, 1 132*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %masked, 0 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker %val = or i1 %tst1, %tst2 135*9880d681SAndroid Build Coastguard Worker ret i1 %val 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine i1 @nomask_rhs(i32 %in) { 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nomask_rhs 141*9880d681SAndroid Build Coastguard Worker; CHECK: [[MASK:%.*]] = and i32 %in, 1 142*9880d681SAndroid Build Coastguard Worker; CHECK: icmp eq i32 [[MASK]], 0 143*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp 144*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 145*9880d681SAndroid Build Coastguard Worker %masked = and i32 %in, 1 146*9880d681SAndroid Build Coastguard Worker %tst1 = icmp eq i32 %masked, 0 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i32 %in, 0 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker %val = or i1 %tst1, %tst2 151*9880d681SAndroid Build Coastguard Worker ret i1 %val 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine i1 @fold_mask_cmps_to_false(i32 %x) { 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_mask_cmps_to_false 156*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 157*9880d681SAndroid Build Coastguard Worker %1 = and i32 %x, 2147483647 158*9880d681SAndroid Build Coastguard Worker %2 = icmp eq i32 %1, 0 159*9880d681SAndroid Build Coastguard Worker %3 = icmp eq i32 %x, 2147483647 160*9880d681SAndroid Build Coastguard Worker %4 = and i1 %3, %2 161*9880d681SAndroid Build Coastguard Worker ret i1 %4 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerdefine i1 @fold_mask_cmps_to_true(i32 %x) { 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_mask_cmps_to_true 166*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 167*9880d681SAndroid Build Coastguard Worker %1 = and i32 %x, 2147483647 168*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i32 %1, 0 169*9880d681SAndroid Build Coastguard Worker %3 = icmp ne i32 %x, 2147483647 170*9880d681SAndroid Build Coastguard Worker %4 = or i1 %3, %2 171*9880d681SAndroid Build Coastguard Worker ret i1 %4 172*9880d681SAndroid Build Coastguard Worker} 173