1 ; RUN: opt < %s -instsimplify -S | FileCheck %s 2 3 define i64 @pow2(i32 %x) { 4 ; CHECK-LABEL: @pow2( 5 %negx = sub i32 0, %x 6 %x2 = and i32 %x, %negx 7 %e = zext i32 %x2 to i64 8 %nege = sub i64 0, %e 9 %e2 = and i64 %e, %nege 10 ret i64 %e2 11 ; CHECK: ret i64 %e 12 } 13 14 define i64 @pow2b(i32 %x) { 15 ; CHECK-LABEL: @pow2b( 16 %sh = shl i32 2, %x 17 %e = zext i32 %sh to i64 18 %nege = sub i64 0, %e 19 %e2 = and i64 %e, %nege 20 ret i64 %e2 21 ; CHECK: ret i64 %e 22 } 23 24 define i32 @sub_neg_nuw(i32 %x, i32 %y) { 25 ; CHECK-LABEL: @sub_neg_nuw( 26 %neg = sub nuw i32 0, %y 27 %sub = sub i32 %x, %neg 28 ret i32 %sub 29 ; CHECK: ret i32 %x 30 } 31 32 define i1 @and_of_icmps0(i32 %b) { 33 ; CHECK-LABEL: @and_of_icmps0( 34 %1 = add i32 %b, 2 35 %2 = icmp ult i32 %1, 4 36 %cmp3 = icmp sgt i32 %b, 2 37 %cmp = and i1 %2, %cmp3 38 ret i1 %cmp 39 ; CHECK: ret i1 false 40 } 41 42 define i1 @and_of_icmps1(i32 %b) { 43 ; CHECK-LABEL: @and_of_icmps1( 44 %1 = add nsw i32 %b, 2 45 %2 = icmp slt i32 %1, 4 46 %cmp3 = icmp sgt i32 %b, 2 47 %cmp = and i1 %2, %cmp3 48 ret i1 %cmp 49 ; CHECK: ret i1 false 50 } 51 52 define i1 @and_of_icmps2(i32 %b) { 53 ; CHECK-LABEL: @and_of_icmps2( 54 %1 = add i32 %b, 2 55 %2 = icmp ule i32 %1, 3 56 %cmp3 = icmp sgt i32 %b, 2 57 %cmp = and i1 %2, %cmp3 58 ret i1 %cmp 59 ; CHECK: ret i1 false 60 } 61 62 define i1 @and_of_icmps3(i32 %b) { 63 ; CHECK-LABEL: @and_of_icmps3( 64 %1 = add nsw i32 %b, 2 65 %2 = icmp sle i32 %1, 3 66 %cmp3 = icmp sgt i32 %b, 2 67 %cmp = and i1 %2, %cmp3 68 ret i1 %cmp 69 ; CHECK: ret i1 false 70 } 71 72 define i1 @and_of_icmps4(i32 %b) { 73 ; CHECK-LABEL: @and_of_icmps4( 74 %1 = add nuw i32 %b, 2 75 %2 = icmp ult i32 %1, 4 76 %cmp3 = icmp ugt i32 %b, 2 77 %cmp = and i1 %2, %cmp3 78 ret i1 %cmp 79 ; CHECK: ret i1 false 80 } 81 82 define i1 @and_of_icmps5(i32 %b) { 83 ; CHECK-LABEL: @and_of_icmps5( 84 %1 = add nuw i32 %b, 2 85 %2 = icmp ule i32 %1, 3 86 %cmp3 = icmp ugt i32 %b, 2 87 %cmp = and i1 %2, %cmp3 88 ret i1 %cmp 89 ; CHECK: ret i1 false 90 } 91 92 define i1 @or_of_icmps0(i32 %b) { 93 ; CHECK-LABEL: @or_of_icmps0( 94 %1 = add i32 %b, 2 95 %2 = icmp uge i32 %1, 4 96 %cmp3 = icmp sle i32 %b, 2 97 %cmp = or i1 %2, %cmp3 98 ret i1 %cmp 99 ; CHECK: ret i1 true 100 } 101 102 define i1 @or_of_icmps1(i32 %b) { 103 ; CHECK-LABEL: @or_of_icmps1( 104 %1 = add nsw i32 %b, 2 105 %2 = icmp sge i32 %1, 4 106 %cmp3 = icmp sle i32 %b, 2 107 %cmp = or i1 %2, %cmp3 108 ret i1 %cmp 109 ; CHECK: ret i1 true 110 } 111 112 define i1 @or_of_icmps2(i32 %b) { 113 ; CHECK-LABEL: @or_of_icmps2( 114 %1 = add i32 %b, 2 115 %2 = icmp ugt i32 %1, 3 116 %cmp3 = icmp sle i32 %b, 2 117 %cmp = or i1 %2, %cmp3 118 ret i1 %cmp 119 ; CHECK: ret i1 true 120 } 121 122 define i1 @or_of_icmps3(i32 %b) { 123 ; CHECK-LABEL: @or_of_icmps3( 124 %1 = add nsw i32 %b, 2 125 %2 = icmp sgt i32 %1, 3 126 %cmp3 = icmp sle i32 %b, 2 127 %cmp = or i1 %2, %cmp3 128 ret i1 %cmp 129 ; CHECK: ret i1 true 130 } 131 132 define i1 @or_of_icmps4(i32 %b) { 133 ; CHECK-LABEL: @or_of_icmps4( 134 %1 = add nuw i32 %b, 2 135 %2 = icmp uge i32 %1, 4 136 %cmp3 = icmp ule i32 %b, 2 137 %cmp = or i1 %2, %cmp3 138 ret i1 %cmp 139 ; CHECK: ret i1 true 140 } 141 142 define i1 @or_of_icmps5(i32 %b) { 143 ; CHECK-LABEL: @or_of_icmps5( 144 %1 = add nuw i32 %b, 2 145 %2 = icmp ugt i32 %1, 3 146 %cmp3 = icmp ule i32 %b, 2 147 %cmp = or i1 %2, %cmp3 148 ret i1 %cmp 149 ; CHECK: ret i1 true 150 } 151 152 define i32 @neg_nuw(i32 %x) { 153 ; CHECK-LABEL: @neg_nuw( 154 %neg = sub nuw i32 0, %x 155 ret i32 %neg 156 ; CHECK: ret i32 0 157 } 158 159 define i1 @and_icmp1(i32 %x, i32 %y) { 160 %1 = icmp ult i32 %x, %y 161 %2 = icmp ne i32 %y, 0 162 %3 = and i1 %1, %2 163 ret i1 %3 164 } 165 ; CHECK-LABEL: @and_icmp1( 166 ; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y 167 ; CHECK: ret i1 %[[cmp]] 168 169 define i1 @and_icmp2(i32 %x, i32 %y) { 170 %1 = icmp ult i32 %x, %y 171 %2 = icmp eq i32 %y, 0 172 %3 = and i1 %1, %2 173 ret i1 %3 174 } 175 ; CHECK-LABEL: @and_icmp2( 176 ; CHECK: ret i1 false 177 178 define i1 @or_icmp1(i32 %x, i32 %y) { 179 %1 = icmp ult i32 %x, %y 180 %2 = icmp ne i32 %y, 0 181 %3 = or i1 %1, %2 182 ret i1 %3 183 } 184 ; CHECK-LABEL: @or_icmp1( 185 ; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0 186 ; CHECK: ret i1 %[[cmp]] 187 188 define i1 @or_icmp2(i32 %x, i32 %y) { 189 %1 = icmp uge i32 %x, %y 190 %2 = icmp ne i32 %y, 0 191 %3 = or i1 %1, %2 192 ret i1 %3 193 } 194 ; CHECK-LABEL: @or_icmp2( 195 ; CHECK: ret i1 true 196 197 define i1 @or_icmp3(i32 %x, i32 %y) { 198 %1 = icmp uge i32 %x, %y 199 %2 = icmp eq i32 %y, 0 200 %3 = or i1 %1, %2 201 ret i1 %3 202 } 203 ; CHECK-LABEL: @or_icmp3( 204 ; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y 205 ; CHECK: ret i1 %[[cmp]] 206