1; RUN: opt < %s -instsimplify -S | FileCheck %s 2target datalayout = "p:32:32" 3 4define i1 @ptrtoint() { 5; CHECK: @ptrtoint 6 %a = alloca i8 7 %tmp = ptrtoint i8* %a to i32 8 %r = icmp eq i32 %tmp, 0 9 ret i1 %r 10; CHECK: ret i1 false 11} 12 13define i1 @zext(i32 %x) { 14; CHECK: @zext 15 %e1 = zext i32 %x to i64 16 %e2 = zext i32 %x to i64 17 %r = icmp eq i64 %e1, %e2 18 ret i1 %r 19; CHECK: ret i1 true 20} 21 22define i1 @zext2(i1 %x) { 23; CHECK: @zext2 24 %e = zext i1 %x to i32 25 %c = icmp ne i32 %e, 0 26 ret i1 %c 27; CHECK: ret i1 %x 28} 29 30define i1 @zext3() { 31; CHECK: @zext3 32 %e = zext i1 1 to i32 33 %c = icmp ne i32 %e, 0 34 ret i1 %c 35; CHECK: ret i1 true 36} 37 38define i1 @sext(i32 %x) { 39; CHECK: @sext 40 %e1 = sext i32 %x to i64 41 %e2 = sext i32 %x to i64 42 %r = icmp eq i64 %e1, %e2 43 ret i1 %r 44; CHECK: ret i1 true 45} 46 47define i1 @sext2(i1 %x) { 48; CHECK: @sext2 49 %e = sext i1 %x to i32 50 %c = icmp ne i32 %e, 0 51 ret i1 %c 52; CHECK: ret i1 %x 53} 54 55define i1 @sext3() { 56; CHECK: @sext3 57 %e = sext i1 1 to i32 58 %c = icmp ne i32 %e, 0 59 ret i1 %c 60; CHECK: ret i1 true 61} 62 63define i1 @add(i32 %x, i32 %y) { 64; CHECK: @add 65 %l = lshr i32 %x, 1 66 %q = lshr i32 %y, 1 67 %r = or i32 %q, 1 68 %s = add i32 %l, %r 69 %c = icmp eq i32 %s, 0 70 ret i1 %c 71; CHECK: ret i1 false 72} 73 74define i1 @add2(i8 %x, i8 %y) { 75; CHECK: @add2 76 %l = or i8 %x, 128 77 %r = or i8 %y, 129 78 %s = add i8 %l, %r 79 %c = icmp eq i8 %s, 0 80 ret i1 %c 81; CHECK: ret i1 false 82} 83 84define i1 @add3(i8 %x, i8 %y) { 85; CHECK: @add3 86 %l = zext i8 %x to i32 87 %r = zext i8 %y to i32 88 %s = add i32 %l, %r 89 %c = icmp eq i32 %s, 0 90 ret i1 %c 91; CHECK: ret i1 %c 92} 93 94define i1 @add4(i32 %x, i32 %y) { 95; CHECK: @add4 96 %z = add nsw i32 %y, 1 97 %s1 = add nsw i32 %x, %y 98 %s2 = add nsw i32 %x, %z 99 %c = icmp slt i32 %s1, %s2 100 ret i1 %c 101; CHECK: ret i1 true 102} 103 104define i1 @add5(i32 %x, i32 %y) { 105; CHECK: @add5 106 %z = add nuw i32 %y, 1 107 %s1 = add nuw i32 %x, %z 108 %s2 = add nuw i32 %x, %y 109 %c = icmp ugt i32 %s1, %s2 110 ret i1 %c 111; CHECK: ret i1 true 112} 113 114define i1 @addpowtwo(i32 %x, i32 %y) { 115; CHECK: @addpowtwo 116 %l = lshr i32 %x, 1 117 %r = shl i32 1, %y 118 %s = add i32 %l, %r 119 %c = icmp eq i32 %s, 0 120 ret i1 %c 121; CHECK: ret i1 false 122} 123 124define i1 @or(i32 %x) { 125; CHECK: @or 126 %o = or i32 %x, 1 127 %c = icmp eq i32 %o, 0 128 ret i1 %c 129; CHECK: ret i1 false 130} 131 132define i1 @shl(i32 %x) { 133; CHECK: @shl 134 %s = shl i32 1, %x 135 %c = icmp eq i32 %s, 0 136 ret i1 %c 137; CHECK: ret i1 false 138} 139 140define i1 @lshr1(i32 %x) { 141; CHECK: @lshr1 142 %s = lshr i32 -1, %x 143 %c = icmp eq i32 %s, 0 144 ret i1 %c 145; CHECK: ret i1 false 146} 147 148define i1 @lshr2(i32 %x) { 149; CHECK: @lshr2 150 %s = lshr i32 %x, 30 151 %c = icmp ugt i32 %s, 8 152 ret i1 %c 153; CHECK: ret i1 false 154} 155 156define i1 @ashr1(i32 %x) { 157; CHECK: @ashr1 158 %s = ashr i32 -1, %x 159 %c = icmp eq i32 %s, 0 160 ret i1 %c 161; CHECK: ret i1 false 162} 163 164define i1 @ashr2(i32 %x) { 165; CHECK: @ashr2 166 %s = ashr i32 %x, 30 167 %c = icmp slt i32 %s, -5 168 ret i1 %c 169; CHECK: ret i1 false 170} 171 172define i1 @select1(i1 %cond) { 173; CHECK: @select1 174 %s = select i1 %cond, i32 1, i32 0 175 %c = icmp eq i32 %s, 1 176 ret i1 %c 177; CHECK: ret i1 %cond 178} 179 180define i1 @select2(i1 %cond) { 181; CHECK: @select2 182 %x = zext i1 %cond to i32 183 %s = select i1 %cond, i32 %x, i32 0 184 %c = icmp ne i32 %s, 0 185 ret i1 %c 186; CHECK: ret i1 %cond 187} 188 189define i1 @select3(i1 %cond) { 190; CHECK: @select3 191 %x = zext i1 %cond to i32 192 %s = select i1 %cond, i32 1, i32 %x 193 %c = icmp ne i32 %s, 0 194 ret i1 %c 195; CHECK: ret i1 %cond 196} 197 198define i1 @select4(i1 %cond) { 199; CHECK: @select4 200 %invert = xor i1 %cond, 1 201 %s = select i1 %invert, i32 0, i32 1 202 %c = icmp ne i32 %s, 0 203 ret i1 %c 204; CHECK: ret i1 %cond 205} 206 207define i1 @urem1(i32 %X, i32 %Y) { 208; CHECK: @urem1 209 %A = urem i32 %X, %Y 210 %B = icmp ult i32 %A, %Y 211 ret i1 %B 212; CHECK: ret i1 true 213} 214 215define i1 @urem2(i32 %X, i32 %Y) { 216; CHECK: @urem2 217 %A = urem i32 %X, %Y 218 %B = icmp eq i32 %A, %Y 219 ret i1 %B 220; CHECK: ret i1 false 221} 222 223define i1 @urem3(i32 %X) { 224; CHECK: @urem3 225 %A = urem i32 %X, 10 226 %B = icmp ult i32 %A, 15 227 ret i1 %B 228; CHECK: ret i1 true 229} 230 231define i1 @urem4(i32 %X) { 232; CHECK: @urem4 233 %A = urem i32 %X, 15 234 %B = icmp ult i32 %A, 10 235 ret i1 %B 236; CHECK: ret i1 %B 237} 238 239define i1 @urem5(i16 %X, i32 %Y) { 240; CHECK: @urem5 241 %A = zext i16 %X to i32 242 %B = urem i32 %A, %Y 243 %C = icmp slt i32 %B, %Y 244 ret i1 %C 245; CHECK: ret i1 true 246} 247 248define i1 @urem6(i32 %X, i32 %Y) { 249; CHECK: @urem6 250 %A = urem i32 %X, %Y 251 %B = icmp ugt i32 %Y, %A 252 ret i1 %B 253; CHECK: ret i1 true 254} 255 256define i1 @srem1(i32 %X) { 257; CHECK: @srem1 258 %A = srem i32 %X, -5 259 %B = icmp sgt i32 %A, 5 260 ret i1 %B 261; CHECK: ret i1 false 262} 263 264; PR9343 #15 265; CHECK: @srem2 266; CHECK: ret i1 false 267define i1 @srem2(i16 %X, i32 %Y) { 268 %A = zext i16 %X to i32 269 %B = add nsw i32 %A, 1 270 %C = srem i32 %B, %Y 271 %D = icmp slt i32 %C, 0 272 ret i1 %D 273} 274 275; CHECK: @srem3 276; CHECK-NEXT: ret i1 false 277define i1 @srem3(i16 %X, i32 %Y) { 278 %A = zext i16 %X to i32 279 %B = or i32 2147483648, %A 280 %C = sub nsw i32 1, %B 281 %D = srem i32 %C, %Y 282 %E = icmp slt i32 %D, 0 283 ret i1 %E 284} 285 286define i1 @udiv1(i32 %X) { 287; CHECK: @udiv1 288 %A = udiv i32 %X, 1000000 289 %B = icmp ult i32 %A, 5000 290 ret i1 %B 291; CHECK: ret i1 true 292} 293 294define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) { 295; CHECK: @udiv2 296 %A = udiv exact i32 10, %Z 297 %B = udiv exact i32 20, %Z 298 %C = icmp ult i32 %A, %B 299 ret i1 %C 300; CHECK: ret i1 true 301} 302 303define i1 @sdiv1(i32 %X) { 304; CHECK: @sdiv1 305 %A = sdiv i32 %X, 1000000 306 %B = icmp slt i32 %A, 3000 307 ret i1 %B 308; CHECK: ret i1 true 309} 310 311define i1 @or1(i32 %X) { 312; CHECK: @or1 313 %A = or i32 %X, 62 314 %B = icmp ult i32 %A, 50 315 ret i1 %B 316; CHECK: ret i1 false 317} 318 319define i1 @and1(i32 %X) { 320; CHECK: @and1 321 %A = and i32 %X, 62 322 %B = icmp ugt i32 %A, 70 323 ret i1 %B 324; CHECK: ret i1 false 325} 326