1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Check simplification of 4*9880d681SAndroid Build Coastguard Worker; (icmp sgt x, -1) & (icmp sgt/sge n, x) --> icmp ugt/uge n, x 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and1 7*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x 8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 9*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and1(i32 %x, i32 %n) { 10*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 11*9880d681SAndroid Build Coastguard Worker %a = icmp sge i32 %x, 0 12*9880d681SAndroid Build Coastguard Worker %b = icmp slt i32 %x, %nn 13*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 14*9880d681SAndroid Build Coastguard Worker ret i1 %c 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and2 18*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x 19*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 20*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and2(i32 %x, i32 %n) { 21*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 22*9880d681SAndroid Build Coastguard Worker %a = icmp sgt i32 %x, -1 23*9880d681SAndroid Build Coastguard Worker %b = icmp sle i32 %x, %nn 24*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 25*9880d681SAndroid Build Coastguard Worker ret i1 %c 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and3 29*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x 30*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 31*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and3(i32 %x, i32 %n) { 32*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 33*9880d681SAndroid Build Coastguard Worker %a = icmp sgt i32 %nn, %x 34*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, 0 35*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 36*9880d681SAndroid Build Coastguard Worker ret i1 %c 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and4 40*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x 41*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 42*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and4(i32 %x, i32 %n) { 43*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 44*9880d681SAndroid Build Coastguard Worker %a = icmp sge i32 %nn, %x 45*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, 0 46*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 47*9880d681SAndroid Build Coastguard Worker ret i1 %c 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or1 51*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x 52*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 53*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or1(i32 %x, i32 %n) { 54*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 55*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %x, 0 56*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, %nn 57*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b 58*9880d681SAndroid Build Coastguard Worker ret i1 %c 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or2 62*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x 63*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 64*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or2(i32 %x, i32 %n) { 65*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 66*9880d681SAndroid Build Coastguard Worker %a = icmp sle i32 %x, -1 67*9880d681SAndroid Build Coastguard Worker %b = icmp sgt i32 %x, %nn 68*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b 69*9880d681SAndroid Build Coastguard Worker ret i1 %c 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or3 73*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x 74*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 75*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or3(i32 %x, i32 %n) { 76*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 77*9880d681SAndroid Build Coastguard Worker %a = icmp sle i32 %nn, %x 78*9880d681SAndroid Build Coastguard Worker %b = icmp slt i32 %x, 0 79*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b 80*9880d681SAndroid Build Coastguard Worker ret i1 %c 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or4 84*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x 85*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]] 86*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or4(i32 %x, i32 %n) { 87*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 88*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %nn, %x 89*9880d681SAndroid Build Coastguard Worker %b = icmp slt i32 %x, 0 90*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b 91*9880d681SAndroid Build Coastguard Worker ret i1 %c 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; Negative tests 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative1 97*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp 98*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp 99*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b 100*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 101*9880d681SAndroid Build Coastguard Workerdefine i1 @negative1(i32 %x, i32 %n) { 102*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 103*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %x, %nn 104*9880d681SAndroid Build Coastguard Worker %b = icmp sgt i32 %x, 0 ; should be: icmp sge 105*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 106*9880d681SAndroid Build Coastguard Worker ret i1 %c 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative2 110*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp 111*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp 112*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b 113*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 114*9880d681SAndroid Build Coastguard Workerdefine i1 @negative2(i32 %x, i32 %n) { 115*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %x, %n ; n can be negative 116*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, 0 117*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 118*9880d681SAndroid Build Coastguard Worker ret i1 %c 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative3 122*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp 123*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp 124*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b 125*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 126*9880d681SAndroid Build Coastguard Workerdefine i1 @negative3(i32 %x, i32 %y, i32 %n) { 127*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 128*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %x, %nn 129*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %y, 0 ; should compare %x and not %y 130*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 131*9880d681SAndroid Build Coastguard Worker ret i1 %c 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative4 135*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp 136*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp 137*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b 138*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 139*9880d681SAndroid Build Coastguard Workerdefine i1 @negative4(i32 %x, i32 %n) { 140*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 141*9880d681SAndroid Build Coastguard Worker %a = icmp ne i32 %x, %nn ; should be: icmp slt/sle 142*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, 0 143*9880d681SAndroid Build Coastguard Worker %c = and i1 %a, %b 144*9880d681SAndroid Build Coastguard Worker ret i1 %c 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative5 148*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp 149*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp 150*9880d681SAndroid Build Coastguard Worker; CHECK: %c = or i1 %a, %b 151*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c 152*9880d681SAndroid Build Coastguard Workerdefine i1 @negative5(i32 %x, i32 %n) { 153*9880d681SAndroid Build Coastguard Worker %nn = and i32 %n, 2147483647 154*9880d681SAndroid Build Coastguard Worker %a = icmp slt i32 %x, %nn 155*9880d681SAndroid Build Coastguard Worker %b = icmp sge i32 %x, 0 156*9880d681SAndroid Build Coastguard Worker %c = or i1 %a, %b ; should be: and 157*9880d681SAndroid Build Coastguard Worker ret i1 %c 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160