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]] 9 define 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]] 20 define 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]] 31 define 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]] 42 define 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]] 53 define 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]] 64 define 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]] 75 define 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]] 86 define 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 101 define 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 114 define 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 126 define 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 139 define 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 152 define 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