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