1 ; RUN: opt < %s -instsimplify -S | FileCheck %s 2 target datalayout = "p:32:32" 3 4 define 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 13 define i1 @bitcast() { 14 ; CHECK: @bitcast 15 %a = alloca i32 16 %b = alloca i64 17 %x = bitcast i32* %a to i8* 18 %y = bitcast i64* %b to i8* 19 %cmp = icmp eq i8* %x, %y 20 ret i1 %cmp 21 ; CHECK-NEXT: ret i1 false 22 } 23 24 define i1 @gep() { 25 ; CHECK: @gep 26 %a = alloca [3 x i8], align 8 27 %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0 28 %cmp = icmp eq i8* %x, null 29 ret i1 %cmp 30 ; CHECK-NEXT: ret i1 false 31 } 32 33 define i1 @gep2() { 34 ; CHECK: @gep2 35 %a = alloca [3 x i8], align 8 36 %x = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0 37 %y = getelementptr inbounds [3 x i8]* %a, i32 0, i32 0 38 %cmp = icmp eq i8* %x, %y 39 ret i1 %cmp 40 ; CHECK-NEXT: ret i1 true 41 } 42 43 ; PR11238 44 %gept = type { i32, i32 } 45 @gepy = global %gept zeroinitializer, align 8 46 @gepz = extern_weak global %gept 47 48 define i1 @gep3() { 49 ; CHECK: @gep3 50 %x = alloca %gept, align 8 51 %a = getelementptr %gept* %x, i64 0, i32 0 52 %b = getelementptr %gept* %x, i64 0, i32 1 53 %equal = icmp eq i32* %a, %b 54 ret i1 %equal 55 ; CHECK-NEXT: ret i1 false 56 } 57 58 define i1 @gep4() { 59 ; CHECK: @gep4 60 %x = alloca %gept, align 8 61 %a = getelementptr %gept* @gepy, i64 0, i32 0 62 %b = getelementptr %gept* @gepy, i64 0, i32 1 63 %equal = icmp eq i32* %a, %b 64 ret i1 %equal 65 ; CHECK-NEXT: ret i1 false 66 } 67 68 define i1 @gep5() { 69 ; CHECK: @gep5 70 %x = alloca %gept, align 8 71 %a = getelementptr inbounds %gept* %x, i64 0, i32 1 72 %b = getelementptr %gept* @gepy, i64 0, i32 0 73 %equal = icmp eq i32* %a, %b 74 ret i1 %equal 75 ; CHECK-NEXT: ret i1 false 76 } 77 78 define i1 @gep6(%gept* %x) { 79 ; Same as @gep3 but potentially null. 80 ; CHECK: @gep6 81 %a = getelementptr %gept* %x, i64 0, i32 0 82 %b = getelementptr %gept* %x, i64 0, i32 1 83 %equal = icmp eq i32* %a, %b 84 ret i1 %equal 85 ; CHECK-NEXT: ret i1 false 86 } 87 88 define i1 @gep7(%gept* %x) { 89 ; CHECK: @gep7 90 %a = getelementptr %gept* %x, i64 0, i32 0 91 %b = getelementptr %gept* @gepz, i64 0, i32 0 92 %equal = icmp eq i32* %a, %b 93 ret i1 %equal 94 ; CHECK: ret i1 %equal 95 } 96 97 define i1 @gep8(%gept* %x) { 98 ; CHECK: @gep8 99 %a = getelementptr %gept* %x, i32 1 100 %b = getelementptr %gept* %x, i32 -1 101 %equal = icmp ugt %gept* %a, %b 102 ret i1 %equal 103 ; CHECK: ret i1 %equal 104 } 105 106 define i1 @gep9(i8* %ptr) { 107 ; CHECK: @gep9 108 ; CHECK-NOT: ret 109 ; CHECK: ret i1 true 110 111 entry: 112 %first1 = getelementptr inbounds i8* %ptr, i32 0 113 %first2 = getelementptr inbounds i8* %first1, i32 1 114 %first3 = getelementptr inbounds i8* %first2, i32 2 115 %first4 = getelementptr inbounds i8* %first3, i32 4 116 %last1 = getelementptr inbounds i8* %first2, i32 48 117 %last2 = getelementptr inbounds i8* %last1, i32 8 118 %last3 = getelementptr inbounds i8* %last2, i32 -4 119 %last4 = getelementptr inbounds i8* %last3, i32 -4 120 %first.int = ptrtoint i8* %first4 to i32 121 %last.int = ptrtoint i8* %last4 to i32 122 %cmp = icmp ne i32 %last.int, %first.int 123 ret i1 %cmp 124 } 125 126 define i1 @gep10(i8* %ptr) { 127 ; CHECK: @gep10 128 ; CHECK-NOT: ret 129 ; CHECK: ret i1 true 130 131 entry: 132 %first1 = getelementptr inbounds i8* %ptr, i32 -2 133 %first2 = getelementptr inbounds i8* %first1, i32 44 134 %last1 = getelementptr inbounds i8* %ptr, i32 48 135 %last2 = getelementptr inbounds i8* %last1, i32 -6 136 %first.int = ptrtoint i8* %first2 to i32 137 %last.int = ptrtoint i8* %last2 to i32 138 %cmp = icmp eq i32 %last.int, %first.int 139 ret i1 %cmp 140 } 141 142 define i1 @gep11(i8* %ptr) { 143 ; CHECK: @gep11 144 ; CHECK-NOT: ret 145 ; CHECK: ret i1 true 146 147 entry: 148 %first1 = getelementptr inbounds i8* %ptr, i32 -2 149 %last1 = getelementptr inbounds i8* %ptr, i32 48 150 %last2 = getelementptr inbounds i8* %last1, i32 -6 151 %cmp = icmp ult i8* %first1, %last2 152 ret i1 %cmp 153 } 154 155 define i1 @gep12(i8* %ptr) { 156 ; CHECK: @gep12 157 ; CHECK-NOT: ret 158 ; CHECK: ret i1 %cmp 159 160 entry: 161 %first1 = getelementptr inbounds i8* %ptr, i32 -2 162 %last1 = getelementptr inbounds i8* %ptr, i32 48 163 %last2 = getelementptr inbounds i8* %last1, i32 -6 164 %cmp = icmp slt i8* %first1, %last2 165 ret i1 %cmp 166 } 167 168 define i1 @zext(i32 %x) { 169 ; CHECK: @zext 170 %e1 = zext i32 %x to i64 171 %e2 = zext i32 %x to i64 172 %r = icmp eq i64 %e1, %e2 173 ret i1 %r 174 ; CHECK: ret i1 true 175 } 176 177 define i1 @zext2(i1 %x) { 178 ; CHECK: @zext2 179 %e = zext i1 %x to i32 180 %c = icmp ne i32 %e, 0 181 ret i1 %c 182 ; CHECK: ret i1 %x 183 } 184 185 define i1 @zext3() { 186 ; CHECK: @zext3 187 %e = zext i1 1 to i32 188 %c = icmp ne i32 %e, 0 189 ret i1 %c 190 ; CHECK: ret i1 true 191 } 192 193 define i1 @sext(i32 %x) { 194 ; CHECK: @sext 195 %e1 = sext i32 %x to i64 196 %e2 = sext i32 %x to i64 197 %r = icmp eq i64 %e1, %e2 198 ret i1 %r 199 ; CHECK: ret i1 true 200 } 201 202 define i1 @sext2(i1 %x) { 203 ; CHECK: @sext2 204 %e = sext i1 %x to i32 205 %c = icmp ne i32 %e, 0 206 ret i1 %c 207 ; CHECK: ret i1 %x 208 } 209 210 define i1 @sext3() { 211 ; CHECK: @sext3 212 %e = sext i1 1 to i32 213 %c = icmp ne i32 %e, 0 214 ret i1 %c 215 ; CHECK: ret i1 true 216 } 217 218 define i1 @add(i32 %x, i32 %y) { 219 ; CHECK: @add 220 %l = lshr i32 %x, 1 221 %q = lshr i32 %y, 1 222 %r = or i32 %q, 1 223 %s = add i32 %l, %r 224 %c = icmp eq i32 %s, 0 225 ret i1 %c 226 ; CHECK: ret i1 false 227 } 228 229 define i1 @add2(i8 %x, i8 %y) { 230 ; CHECK: @add2 231 %l = or i8 %x, 128 232 %r = or i8 %y, 129 233 %s = add i8 %l, %r 234 %c = icmp eq i8 %s, 0 235 ret i1 %c 236 ; CHECK: ret i1 false 237 } 238 239 define i1 @add3(i8 %x, i8 %y) { 240 ; CHECK: @add3 241 %l = zext i8 %x to i32 242 %r = zext i8 %y to i32 243 %s = add i32 %l, %r 244 %c = icmp eq i32 %s, 0 245 ret i1 %c 246 ; CHECK: ret i1 %c 247 } 248 249 define i1 @add4(i32 %x, i32 %y) { 250 ; CHECK: @add4 251 %z = add nsw i32 %y, 1 252 %s1 = add nsw i32 %x, %y 253 %s2 = add nsw i32 %x, %z 254 %c = icmp slt i32 %s1, %s2 255 ret i1 %c 256 ; CHECK: ret i1 true 257 } 258 259 define i1 @add5(i32 %x, i32 %y) { 260 ; CHECK: @add5 261 %z = add nuw i32 %y, 1 262 %s1 = add nuw i32 %x, %z 263 %s2 = add nuw i32 %x, %y 264 %c = icmp ugt i32 %s1, %s2 265 ret i1 %c 266 ; CHECK: ret i1 true 267 } 268 269 define i1 @addpowtwo(i32 %x, i32 %y) { 270 ; CHECK: @addpowtwo 271 %l = lshr i32 %x, 1 272 %r = shl i32 1, %y 273 %s = add i32 %l, %r 274 %c = icmp eq i32 %s, 0 275 ret i1 %c 276 ; CHECK: ret i1 false 277 } 278 279 define i1 @or(i32 %x) { 280 ; CHECK: @or 281 %o = or i32 %x, 1 282 %c = icmp eq i32 %o, 0 283 ret i1 %c 284 ; CHECK: ret i1 false 285 } 286 287 define i1 @shl(i32 %x) { 288 ; CHECK: @shl 289 %s = shl i32 1, %x 290 %c = icmp eq i32 %s, 0 291 ret i1 %c 292 ; CHECK: ret i1 false 293 } 294 295 define i1 @lshr1(i32 %x) { 296 ; CHECK: @lshr1 297 %s = lshr i32 -1, %x 298 %c = icmp eq i32 %s, 0 299 ret i1 %c 300 ; CHECK: ret i1 false 301 } 302 303 define i1 @lshr2(i32 %x) { 304 ; CHECK: @lshr2 305 %s = lshr i32 %x, 30 306 %c = icmp ugt i32 %s, 8 307 ret i1 %c 308 ; CHECK: ret i1 false 309 } 310 311 define i1 @ashr1(i32 %x) { 312 ; CHECK: @ashr1 313 %s = ashr i32 -1, %x 314 %c = icmp eq i32 %s, 0 315 ret i1 %c 316 ; CHECK: ret i1 false 317 } 318 319 define i1 @ashr2(i32 %x) { 320 ; CHECK: @ashr2 321 %s = ashr i32 %x, 30 322 %c = icmp slt i32 %s, -5 323 ret i1 %c 324 ; CHECK: ret i1 false 325 } 326 327 define i1 @select1(i1 %cond) { 328 ; CHECK: @select1 329 %s = select i1 %cond, i32 1, i32 0 330 %c = icmp eq i32 %s, 1 331 ret i1 %c 332 ; CHECK: ret i1 %cond 333 } 334 335 define i1 @select2(i1 %cond) { 336 ; CHECK: @select2 337 %x = zext i1 %cond to i32 338 %s = select i1 %cond, i32 %x, i32 0 339 %c = icmp ne i32 %s, 0 340 ret i1 %c 341 ; CHECK: ret i1 %cond 342 } 343 344 define i1 @select3(i1 %cond) { 345 ; CHECK: @select3 346 %x = zext i1 %cond to i32 347 %s = select i1 %cond, i32 1, i32 %x 348 %c = icmp ne i32 %s, 0 349 ret i1 %c 350 ; CHECK: ret i1 %cond 351 } 352 353 define i1 @select4(i1 %cond) { 354 ; CHECK: @select4 355 %invert = xor i1 %cond, 1 356 %s = select i1 %invert, i32 0, i32 1 357 %c = icmp ne i32 %s, 0 358 ret i1 %c 359 ; CHECK: ret i1 %cond 360 } 361 362 define i1 @select5(i32 %x) { 363 ; CHECK: @select5 364 %c = icmp eq i32 %x, 0 365 %s = select i1 %c, i32 1, i32 %x 366 %c2 = icmp eq i32 %s, 0 367 ret i1 %c2 368 ; CHECK: ret i1 false 369 } 370 371 define i1 @select6(i32 %x) { 372 ; CHECK: @select6 373 %c = icmp sgt i32 %x, 0 374 %s = select i1 %c, i32 %x, i32 4 375 %c2 = icmp eq i32 %s, 0 376 ret i1 %c2 377 ; CHECK: ret i1 %c2 378 } 379 380 define i1 @urem1(i32 %X, i32 %Y) { 381 ; CHECK: @urem1 382 %A = urem i32 %X, %Y 383 %B = icmp ult i32 %A, %Y 384 ret i1 %B 385 ; CHECK: ret i1 true 386 } 387 388 define i1 @urem2(i32 %X, i32 %Y) { 389 ; CHECK: @urem2 390 %A = urem i32 %X, %Y 391 %B = icmp eq i32 %A, %Y 392 ret i1 %B 393 ; CHECK: ret i1 false 394 } 395 396 define i1 @urem3(i32 %X) { 397 ; CHECK: @urem3 398 %A = urem i32 %X, 10 399 %B = icmp ult i32 %A, 15 400 ret i1 %B 401 ; CHECK: ret i1 true 402 } 403 404 define i1 @urem4(i32 %X) { 405 ; CHECK: @urem4 406 %A = urem i32 %X, 15 407 %B = icmp ult i32 %A, 10 408 ret i1 %B 409 ; CHECK: ret i1 %B 410 } 411 412 define i1 @urem5(i16 %X, i32 %Y) { 413 ; CHECK: @urem5 414 %A = zext i16 %X to i32 415 %B = urem i32 %A, %Y 416 %C = icmp slt i32 %B, %Y 417 ret i1 %C 418 ; CHECK: ret i1 true 419 } 420 421 define i1 @urem6(i32 %X, i32 %Y) { 422 ; CHECK: @urem6 423 %A = urem i32 %X, %Y 424 %B = icmp ugt i32 %Y, %A 425 ret i1 %B 426 ; CHECK: ret i1 true 427 } 428 429 define i1 @srem1(i32 %X) { 430 ; CHECK: @srem1 431 %A = srem i32 %X, -5 432 %B = icmp sgt i32 %A, 5 433 ret i1 %B 434 ; CHECK: ret i1 false 435 } 436 437 ; PR9343 #15 438 ; CHECK: @srem2 439 ; CHECK: ret i1 false 440 define i1 @srem2(i16 %X, i32 %Y) { 441 %A = zext i16 %X to i32 442 %B = add nsw i32 %A, 1 443 %C = srem i32 %B, %Y 444 %D = icmp slt i32 %C, 0 445 ret i1 %D 446 } 447 448 ; CHECK: @srem3 449 ; CHECK-NEXT: ret i1 false 450 define i1 @srem3(i16 %X, i32 %Y) { 451 %A = zext i16 %X to i32 452 %B = or i32 2147483648, %A 453 %C = sub nsw i32 1, %B 454 %D = srem i32 %C, %Y 455 %E = icmp slt i32 %D, 0 456 ret i1 %E 457 } 458 459 define i1 @udiv1(i32 %X) { 460 ; CHECK: @udiv1 461 %A = udiv i32 %X, 1000000 462 %B = icmp ult i32 %A, 5000 463 ret i1 %B 464 ; CHECK: ret i1 true 465 } 466 467 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) { 468 ; CHECK: @udiv2 469 %A = udiv exact i32 10, %Z 470 %B = udiv exact i32 20, %Z 471 %C = icmp ult i32 %A, %B 472 ret i1 %C 473 ; CHECK: ret i1 true 474 } 475 476 define i1 @udiv3(i32 %X, i32 %Y) { 477 ; CHECK: @udiv3 478 %A = udiv i32 %X, %Y 479 %C = icmp ugt i32 %A, %X 480 ret i1 %C 481 ; CHECK: ret i1 false 482 } 483 484 define i1 @udiv4(i32 %X, i32 %Y) { 485 ; CHECK: @udiv4 486 %A = udiv i32 %X, %Y 487 %C = icmp ule i32 %A, %X 488 ret i1 %C 489 ; CHECK: ret i1 true 490 } 491 492 define i1 @udiv5(i32 %X) { 493 ; CHECK: @udiv5 494 %A = udiv i32 123, %X 495 %C = icmp ugt i32 %A, 124 496 ret i1 %C 497 ; CHECK: ret i1 false 498 } 499 500 ; PR11340 501 define i1 @udiv6(i32 %X) nounwind { 502 ; CHECK: @udiv6 503 %A = udiv i32 1, %X 504 %C = icmp eq i32 %A, 0 505 ret i1 %C 506 ; CHECK: ret i1 %C 507 } 508 509 510 define i1 @sdiv1(i32 %X) { 511 ; CHECK: @sdiv1 512 %A = sdiv i32 %X, 1000000 513 %B = icmp slt i32 %A, 3000 514 ret i1 %B 515 ; CHECK: ret i1 true 516 } 517 518 define i1 @or1(i32 %X) { 519 ; CHECK: @or1 520 %A = or i32 %X, 62 521 %B = icmp ult i32 %A, 50 522 ret i1 %B 523 ; CHECK: ret i1 false 524 } 525 526 define i1 @and1(i32 %X) { 527 ; CHECK: @and1 528 %A = and i32 %X, 62 529 %B = icmp ugt i32 %A, 70 530 ret i1 %B 531 ; CHECK: ret i1 false 532 } 533 534 define i1 @mul1(i32 %X) { 535 ; CHECK: @mul1 536 ; Square of a non-zero number is non-zero if there is no overflow. 537 %Y = or i32 %X, 1 538 %M = mul nuw i32 %Y, %Y 539 %C = icmp eq i32 %M, 0 540 ret i1 %C 541 ; CHECK: ret i1 false 542 } 543 544 define i1 @mul2(i32 %X) { 545 ; CHECK: @mul2 546 ; Square of a non-zero number is positive if there is no signed overflow. 547 %Y = or i32 %X, 1 548 %M = mul nsw i32 %Y, %Y 549 %C = icmp sgt i32 %M, 0 550 ret i1 %C 551 ; CHECK: ret i1 true 552 } 553 554 define i1 @mul3(i32 %X, i32 %Y) { 555 ; CHECK: @mul3 556 ; Product of non-negative numbers is non-negative if there is no signed overflow. 557 %XX = mul nsw i32 %X, %X 558 %YY = mul nsw i32 %Y, %Y 559 %M = mul nsw i32 %XX, %YY 560 %C = icmp sge i32 %M, 0 561 ret i1 %C 562 ; CHECK: ret i1 true 563 } 564 565 define <2 x i1> @vectorselect1(<2 x i1> %cond) { 566 ; CHECK: @vectorselect1 567 %invert = xor <2 x i1> %cond, <i1 1, i1 1> 568 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1> 569 %c = icmp ne <2 x i32> %s, <i32 0, i32 0> 570 ret <2 x i1> %c 571 ; CHECK: ret <2 x i1> %cond 572 } 573 574 ; PR11948 575 define <2 x i1> @vectorselectcrash(i32 %arg1) { 576 %tobool40 = icmp ne i32 %arg1, 0 577 %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1> 578 %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21> 579 ret <2 x i1> %cmp45 580 } 581 582 ; PR12013 583 define i1 @alloca_compare(i64 %idx) { 584 %sv = alloca { i32, i32, [124 x i32] } 585 %1 = getelementptr inbounds { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx 586 %2 = icmp eq i32* %1, null 587 ret i1 %2 588 ; CHECK: alloca_compare 589 ; CHECK: ret i1 false 590 } 591 592 ; PR12075 593 define i1 @infinite_gep() { 594 ret i1 1 595 596 unreachableblock: 597 %X = getelementptr i32 *%X, i32 1 598 %Y = icmp eq i32* %X, null 599 ret i1 %Y 600 } 601