1; RUN: opt < %s -instcombine -S | FileCheck %s 2 3target datalayout = 4"e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 5 6define i32 @test1(i32 %X) { 7entry: 8 icmp slt i32 %X, 0 ; <i1>:0 [#uses=1] 9 zext i1 %0 to i32 ; <i32>:1 [#uses=1] 10 ret i32 %1 11; CHECK-LABEL: @test1( 12; CHECK: lshr i32 %X, 31 13; CHECK-NEXT: ret i32 14} 15 16define i32 @test2(i32 %X) { 17entry: 18 icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1] 19 zext i1 %0 to i32 ; <i32>:1 [#uses=1] 20 ret i32 %1 21; CHECK-LABEL: @test2( 22; CHECK: lshr i32 %X, 31 23; CHECK-NEXT: xor i32 24; CHECK-NEXT: ret i32 25} 26 27define i32 @test3(i32 %X) { 28entry: 29 icmp slt i32 %X, 0 ; <i1>:0 [#uses=1] 30 sext i1 %0 to i32 ; <i32>:1 [#uses=1] 31 ret i32 %1 32; CHECK-LABEL: @test3( 33; CHECK: ashr i32 %X, 31 34; CHECK-NEXT: ret i32 35} 36 37define i32 @test4(i32 %X) { 38entry: 39 icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1] 40 sext i1 %0 to i32 ; <i32>:1 [#uses=1] 41 ret i32 %1 42; CHECK-LABEL: @test4( 43; CHECK: ashr i32 %X, 31 44; CHECK-NEXT: xor i32 45; CHECK-NEXT: ret i32 46} 47 48; PR4837 49define <2 x i1> @test5(<2 x i64> %x) { 50entry: 51 %V = icmp eq <2 x i64> %x, undef 52 ret <2 x i1> %V 53; CHECK-LABEL: @test5( 54; CHECK: ret <2 x i1> <i1 true, i1 true> 55} 56 57define i32 @test6(i32 %a, i32 %b) { 58 %c = icmp sle i32 %a, -1 59 %d = zext i1 %c to i32 60 %e = sub i32 0, %d 61 %f = and i32 %e, %b 62 ret i32 %f 63; CHECK-LABEL: @test6( 64; CHECK-NEXT: ashr i32 %a, 31 65; CHECK-NEXT: %f = and i32 %e, %b 66; CHECK-NEXT: ret i32 %f 67} 68 69 70define i1 @test7(i32 %x) { 71entry: 72 %a = add i32 %x, -1 73 %b = icmp ult i32 %a, %x 74 ret i1 %b 75; CHECK-LABEL: @test7( 76; CHECK: %b = icmp ne i32 %x, 0 77; CHECK: ret i1 %b 78} 79 80define i1 @test8(i32 %x){ 81entry: 82 %a = add i32 %x, -1 83 %b = icmp eq i32 %a, %x 84 ret i1 %b 85; CHECK-LABEL: @test8( 86; CHECK: ret i1 false 87} 88 89define i1 @test9(i32 %x) { 90entry: 91 %a = add i32 %x, -2 92 %b = icmp ugt i32 %x, %a 93 ret i1 %b 94; CHECK-LABEL: @test9( 95; CHECK: icmp ugt i32 %x, 1 96; CHECK: ret i1 %b 97} 98 99define i1 @test10(i32 %x){ 100entry: 101 %a = add i32 %x, -1 102 %b = icmp slt i32 %a, %x 103 ret i1 %b 104; CHECK-LABEL: @test10( 105; CHECK: %b = icmp ne i32 %x, -2147483648 106; CHECK: ret i1 %b 107} 108 109define i1 @test11(i32 %x) { 110 %a = add nsw i32 %x, 8 111 %b = icmp slt i32 %x, %a 112 ret i1 %b 113; CHECK-LABEL: @test11( 114; CHECK: ret i1 true 115} 116 117; PR6195 118define i1 @test12(i1 %A) { 119 %S = select i1 %A, i64 -4294967295, i64 8589934591 120 %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S 121 ret i1 %B 122; CHECK-LABEL: @test12( 123; CHECK-NEXT: = xor i1 %A, true 124; CHECK-NEXT: ret i1 125} 126 127; PR6481 128define i1 @test13(i8 %X) nounwind readnone { 129entry: 130 %cmp = icmp slt i8 undef, %X 131 ret i1 %cmp 132; CHECK-LABEL: @test13( 133; CHECK: ret i1 false 134} 135 136define i1 @test14(i8 %X) nounwind readnone { 137entry: 138 %cmp = icmp slt i8 undef, -128 139 ret i1 %cmp 140; CHECK-LABEL: @test14( 141; CHECK: ret i1 false 142} 143 144define i1 @test15() nounwind readnone { 145entry: 146 %cmp = icmp eq i8 undef, -128 147 ret i1 %cmp 148; CHECK-LABEL: @test15( 149; CHECK: ret i1 undef 150} 151 152define i1 @test16() nounwind readnone { 153entry: 154 %cmp = icmp ne i8 undef, -128 155 ret i1 %cmp 156; CHECK-LABEL: @test16( 157; CHECK: ret i1 undef 158} 159 160define i1 @test17(i32 %x) nounwind { 161 %shl = shl i32 1, %x 162 %and = and i32 %shl, 8 163 %cmp = icmp eq i32 %and, 0 164 ret i1 %cmp 165; CHECK-LABEL: @test17( 166; CHECK-NEXT: %cmp = icmp ne i32 %x, 3 167} 168 169 170define i1 @test18(i32 %x) nounwind { 171 %sh = lshr i32 8, %x 172 %and = and i32 %sh, 1 173 %cmp = icmp eq i32 %and, 0 174 ret i1 %cmp 175; CHECK-LABEL: @test18( 176; CHECK-NEXT: %cmp = icmp ne i32 %x, 3 177} 178 179define i1 @test19(i32 %x) nounwind { 180 %shl = shl i32 1, %x 181 %and = and i32 %shl, 8 182 %cmp = icmp eq i32 %and, 8 183 ret i1 %cmp 184; CHECK-LABEL: @test19( 185; CHECK-NEXT: %cmp = icmp eq i32 %x, 3 186} 187 188define i1 @test20(i32 %x) nounwind { 189 %shl = shl i32 1, %x 190 %and = and i32 %shl, 8 191 %cmp = icmp ne i32 %and, 0 192 ret i1 %cmp 193; CHECK-LABEL: @test20( 194; CHECK-NEXT: %cmp = icmp eq i32 %x, 3 195} 196 197define i1 @test21(i8 %x, i8 %y) { 198; CHECK-LABEL: @test21( 199; CHECK-NOT: or i8 200; CHECK: icmp ugt 201 %A = or i8 %x, 1 202 %B = icmp ugt i8 %A, 3 203 ret i1 %B 204} 205 206define i1 @test22(i8 %x, i8 %y) { 207; CHECK-LABEL: @test22( 208; CHECK-NOT: or i8 209; CHECK: icmp ult 210 %A = or i8 %x, 1 211 %B = icmp ult i8 %A, 4 212 ret i1 %B 213} 214 215; PR2740 216; CHECK-LABEL: @test23( 217; CHECK: icmp sgt i32 %x, 1328634634 218define i1 @test23(i32 %x) nounwind { 219 %i3 = sdiv i32 %x, -1328634635 220 %i4 = icmp eq i32 %i3, -1 221 ret i1 %i4 222} 223 224@X = global [1000 x i32] zeroinitializer 225 226; PR8882 227; CHECK-LABEL: @test24( 228; CHECK: %cmp = icmp eq i64 %i, 1000 229; CHECK: ret i1 %cmp 230define i1 @test24(i64 %i) { 231 %p1 = getelementptr inbounds i32* getelementptr inbounds ([1000 x i32]* @X, i64 0, i64 0), i64 %i 232 %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32]* @X, i64 1, i64 0) 233 ret i1 %cmp 234} 235 236@X_as1 = addrspace(1) global [1000 x i32] zeroinitializer 237 238; CHECK: @test24_as1 239; CHECK: trunc i64 %i to i16 240; CHECK: %cmp = icmp eq i16 %1, 1000 241; CHECK: ret i1 %cmp 242define i1 @test24_as1(i64 %i) { 243 %p1 = getelementptr inbounds i32 addrspace(1)* getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 0, i64 0), i64 %i 244 %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0) 245 ret i1 %cmp 246} 247 248; CHECK-LABEL: @test25( 249; X + Z > Y + Z -> X > Y if there is no overflow. 250; CHECK: %c = icmp sgt i32 %x, %y 251; CHECK: ret i1 %c 252define i1 @test25(i32 %x, i32 %y, i32 %z) { 253 %lhs = add nsw i32 %x, %z 254 %rhs = add nsw i32 %y, %z 255 %c = icmp sgt i32 %lhs, %rhs 256 ret i1 %c 257} 258 259; CHECK-LABEL: @test26( 260; X + Z > Y + Z -> X > Y if there is no overflow. 261; CHECK: %c = icmp ugt i32 %x, %y 262; CHECK: ret i1 %c 263define i1 @test26(i32 %x, i32 %y, i32 %z) { 264 %lhs = add nuw i32 %x, %z 265 %rhs = add nuw i32 %y, %z 266 %c = icmp ugt i32 %lhs, %rhs 267 ret i1 %c 268} 269 270; CHECK-LABEL: @test27( 271; X - Z > Y - Z -> X > Y if there is no overflow. 272; CHECK: %c = icmp sgt i32 %x, %y 273; CHECK: ret i1 %c 274define i1 @test27(i32 %x, i32 %y, i32 %z) { 275 %lhs = sub nsw i32 %x, %z 276 %rhs = sub nsw i32 %y, %z 277 %c = icmp sgt i32 %lhs, %rhs 278 ret i1 %c 279} 280 281; CHECK-LABEL: @test28( 282; X - Z > Y - Z -> X > Y if there is no overflow. 283; CHECK: %c = icmp ugt i32 %x, %y 284; CHECK: ret i1 %c 285define i1 @test28(i32 %x, i32 %y, i32 %z) { 286 %lhs = sub nuw i32 %x, %z 287 %rhs = sub nuw i32 %y, %z 288 %c = icmp ugt i32 %lhs, %rhs 289 ret i1 %c 290} 291 292; CHECK-LABEL: @test29( 293; X + Y > X -> Y > 0 if there is no overflow. 294; CHECK: %c = icmp sgt i32 %y, 0 295; CHECK: ret i1 %c 296define i1 @test29(i32 %x, i32 %y) { 297 %lhs = add nsw i32 %x, %y 298 %c = icmp sgt i32 %lhs, %x 299 ret i1 %c 300} 301 302; CHECK-LABEL: @test30( 303; X + Y > X -> Y > 0 if there is no overflow. 304; CHECK: %c = icmp ne i32 %y, 0 305; CHECK: ret i1 %c 306define i1 @test30(i32 %x, i32 %y) { 307 %lhs = add nuw i32 %x, %y 308 %c = icmp ugt i32 %lhs, %x 309 ret i1 %c 310} 311 312; CHECK-LABEL: @test31( 313; X > X + Y -> 0 > Y if there is no overflow. 314; CHECK: %c = icmp slt i32 %y, 0 315; CHECK: ret i1 %c 316define i1 @test31(i32 %x, i32 %y) { 317 %rhs = add nsw i32 %x, %y 318 %c = icmp sgt i32 %x, %rhs 319 ret i1 %c 320} 321 322; CHECK-LABEL: @test32( 323; X > X + Y -> 0 > Y if there is no overflow. 324; CHECK: ret i1 false 325define i1 @test32(i32 %x, i32 %y) { 326 %rhs = add nuw i32 %x, %y 327 %c = icmp ugt i32 %x, %rhs 328 ret i1 %c 329} 330 331; CHECK-LABEL: @test33( 332; X - Y > X -> 0 > Y if there is no overflow. 333; CHECK: %c = icmp slt i32 %y, 0 334; CHECK: ret i1 %c 335define i1 @test33(i32 %x, i32 %y) { 336 %lhs = sub nsw i32 %x, %y 337 %c = icmp sgt i32 %lhs, %x 338 ret i1 %c 339} 340 341; CHECK-LABEL: @test34( 342; X - Y > X -> 0 > Y if there is no overflow. 343; CHECK: ret i1 false 344define i1 @test34(i32 %x, i32 %y) { 345 %lhs = sub nuw i32 %x, %y 346 %c = icmp ugt i32 %lhs, %x 347 ret i1 %c 348} 349 350; CHECK-LABEL: @test35( 351; X > X - Y -> Y > 0 if there is no overflow. 352; CHECK: %c = icmp sgt i32 %y, 0 353; CHECK: ret i1 %c 354define i1 @test35(i32 %x, i32 %y) { 355 %rhs = sub nsw i32 %x, %y 356 %c = icmp sgt i32 %x, %rhs 357 ret i1 %c 358} 359 360; CHECK-LABEL: @test36( 361; X > X - Y -> Y > 0 if there is no overflow. 362; CHECK: %c = icmp ne i32 %y, 0 363; CHECK: ret i1 %c 364define i1 @test36(i32 %x, i32 %y) { 365 %rhs = sub nuw i32 %x, %y 366 %c = icmp ugt i32 %x, %rhs 367 ret i1 %c 368} 369 370; CHECK-LABEL: @test37( 371; X - Y > X - Z -> Z > Y if there is no overflow. 372; CHECK: %c = icmp sgt i32 %z, %y 373; CHECK: ret i1 %c 374define i1 @test37(i32 %x, i32 %y, i32 %z) { 375 %lhs = sub nsw i32 %x, %y 376 %rhs = sub nsw i32 %x, %z 377 %c = icmp sgt i32 %lhs, %rhs 378 ret i1 %c 379} 380 381; CHECK-LABEL: @test38( 382; X - Y > X - Z -> Z > Y if there is no overflow. 383; CHECK: %c = icmp ugt i32 %z, %y 384; CHECK: ret i1 %c 385define i1 @test38(i32 %x, i32 %y, i32 %z) { 386 %lhs = sub nuw i32 %x, %y 387 %rhs = sub nuw i32 %x, %z 388 %c = icmp ugt i32 %lhs, %rhs 389 ret i1 %c 390} 391 392; PR9343 #1 393; CHECK-LABEL: @test39( 394; CHECK: %B = icmp eq i32 %X, 0 395define i1 @test39(i32 %X, i32 %Y) { 396 %A = ashr exact i32 %X, %Y 397 %B = icmp eq i32 %A, 0 398 ret i1 %B 399} 400 401; CHECK-LABEL: @test40( 402; CHECK: %B = icmp ne i32 %X, 0 403define i1 @test40(i32 %X, i32 %Y) { 404 %A = lshr exact i32 %X, %Y 405 %B = icmp ne i32 %A, 0 406 ret i1 %B 407} 408 409; PR9343 #3 410; CHECK-LABEL: @test41( 411; CHECK: ret i1 true 412define i1 @test41(i32 %X, i32 %Y) { 413 %A = urem i32 %X, %Y 414 %B = icmp ugt i32 %Y, %A 415 ret i1 %B 416} 417 418; CHECK-LABEL: @test42( 419; CHECK: %B = icmp sgt i32 %Y, -1 420define i1 @test42(i32 %X, i32 %Y) { 421 %A = srem i32 %X, %Y 422 %B = icmp slt i32 %A, %Y 423 ret i1 %B 424} 425 426; CHECK-LABEL: @test43( 427; CHECK: %B = icmp slt i32 %Y, 0 428define i1 @test43(i32 %X, i32 %Y) { 429 %A = srem i32 %X, %Y 430 %B = icmp slt i32 %Y, %A 431 ret i1 %B 432} 433 434; CHECK-LABEL: @test44( 435; CHECK: %B = icmp sgt i32 %Y, -1 436define i1 @test44(i32 %X, i32 %Y) { 437 %A = srem i32 %X, %Y 438 %B = icmp slt i32 %A, %Y 439 ret i1 %B 440} 441 442; CHECK-LABEL: @test45( 443; CHECK: %B = icmp slt i32 %Y, 0 444define i1 @test45(i32 %X, i32 %Y) { 445 %A = srem i32 %X, %Y 446 %B = icmp slt i32 %Y, %A 447 ret i1 %B 448} 449 450; PR9343 #4 451; CHECK-LABEL: @test46( 452; CHECK: %C = icmp ult i32 %X, %Y 453define i1 @test46(i32 %X, i32 %Y, i32 %Z) { 454 %A = ashr exact i32 %X, %Z 455 %B = ashr exact i32 %Y, %Z 456 %C = icmp ult i32 %A, %B 457 ret i1 %C 458} 459 460; PR9343 #5 461; CHECK-LABEL: @test47( 462; CHECK: %C = icmp ugt i32 %X, %Y 463define i1 @test47(i32 %X, i32 %Y, i32 %Z) { 464 %A = ashr exact i32 %X, %Z 465 %B = ashr exact i32 %Y, %Z 466 %C = icmp ugt i32 %A, %B 467 ret i1 %C 468} 469 470; PR9343 #8 471; CHECK-LABEL: @test48( 472; CHECK: %C = icmp eq i32 %X, %Y 473define i1 @test48(i32 %X, i32 %Y, i32 %Z) { 474 %A = sdiv exact i32 %X, %Z 475 %B = sdiv exact i32 %Y, %Z 476 %C = icmp eq i32 %A, %B 477 ret i1 %C 478} 479 480; PR8469 481; CHECK-LABEL: @test49( 482; CHECK: ret <2 x i1> <i1 true, i1 true> 483define <2 x i1> @test49(<2 x i32> %tmp3) { 484entry: 485 %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3> 486 %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4> 487 ret <2 x i1> %cmp 488} 489 490; PR9343 #7 491; CHECK-LABEL: @test50( 492; CHECK: ret i1 true 493define i1 @test50(i16 %X, i32 %Y) { 494 %A = zext i16 %X to i32 495 %B = srem i32 %A, %Y 496 %C = icmp sgt i32 %B, -1 497 ret i1 %C 498} 499 500; CHECK-LABEL: @test51( 501; CHECK: ret i1 %C 502define i1 @test51(i32 %X, i32 %Y) { 503 %A = and i32 %X, 2147483648 504 %B = srem i32 %A, %Y 505 %C = icmp sgt i32 %B, -1 506 ret i1 %C 507} 508 509; CHECK-LABEL: @test52( 510; CHECK-NEXT: and i32 %x1, 16711935 511; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863 512; CHECK-NEXT: ret i1 513define i1 @test52(i32 %x1) nounwind { 514 %conv = and i32 %x1, 255 515 %cmp = icmp eq i32 %conv, 127 516 %tmp2 = lshr i32 %x1, 16 517 %tmp3 = trunc i32 %tmp2 to i8 518 %cmp15 = icmp eq i8 %tmp3, 76 519 520 %A = and i1 %cmp, %cmp15 521 ret i1 %A 522} 523 524; PR9838 525; CHECK-LABEL: @test53( 526; CHECK-NEXT: sdiv exact 527; CHECK-NEXT: sdiv 528; CHECK-NEXT: icmp 529define i1 @test53(i32 %a, i32 %b) nounwind { 530 %x = sdiv exact i32 %a, 30 531 %y = sdiv i32 %b, 30 532 %z = icmp eq i32 %x, %y 533 ret i1 %z 534} 535 536; CHECK-LABEL: @test54( 537; CHECK-NEXT: %and = and i8 %a, -64 538; CHECK-NEXT: icmp eq i8 %and, -128 539define i1 @test54(i8 %a) nounwind { 540 %ext = zext i8 %a to i32 541 %and = and i32 %ext, 192 542 %ret = icmp eq i32 %and, 128 543 ret i1 %ret 544} 545 546; CHECK-LABEL: @test55( 547; CHECK-NEXT: icmp eq i32 %a, -123 548define i1 @test55(i32 %a) { 549 %sub = sub i32 0, %a 550 %cmp = icmp eq i32 %sub, 123 551 ret i1 %cmp 552} 553 554; CHECK-LABEL: @test56( 555; CHECK-NEXT: icmp eq i32 %a, -113 556define i1 @test56(i32 %a) { 557 %sub = sub i32 10, %a 558 %cmp = icmp eq i32 %sub, 123 559 ret i1 %cmp 560} 561 562; PR10267 Don't make icmps more expensive when no other inst is subsumed. 563declare void @foo(i32) 564; CHECK-LABEL: @test57( 565; CHECK: %and = and i32 %a, -2 566; CHECK: %cmp = icmp ne i32 %and, 0 567define i1 @test57(i32 %a) { 568 %and = and i32 %a, -2 569 %cmp = icmp ne i32 %and, 0 570 call void @foo(i32 %and) 571 ret i1 %cmp 572} 573 574; rdar://problem/10482509 575; CHECK-LABEL: @cmpabs1( 576; CHECK-NEXT: icmp ne 577define zeroext i1 @cmpabs1(i64 %val) { 578 %sub = sub nsw i64 0, %val 579 %cmp = icmp slt i64 %val, 0 580 %sub.val = select i1 %cmp, i64 %sub, i64 %val 581 %tobool = icmp ne i64 %sub.val, 0 582 ret i1 %tobool 583} 584 585; CHECK-LABEL: @cmpabs2( 586; CHECK-NEXT: icmp ne 587define zeroext i1 @cmpabs2(i64 %val) { 588 %sub = sub nsw i64 0, %val 589 %cmp = icmp slt i64 %val, 0 590 %sub.val = select i1 %cmp, i64 %val, i64 %sub 591 %tobool = icmp ne i64 %sub.val, 0 592 ret i1 %tobool 593} 594 595; CHECK-LABEL: @test58( 596; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592) 597define void @test58() nounwind { 598 %cast = bitcast <1 x i64> <i64 36029346783166592> to i64 599 %call = call i32 @test58_d( i64 %cast) nounwind 600 ret void 601} 602declare i32 @test58_d(i64) 603 604define i1 @test59(i8* %foo) { 605 %bit = bitcast i8* %foo to i32* 606 %gep1 = getelementptr inbounds i32* %bit, i64 2 607 %gep2 = getelementptr inbounds i8* %foo, i64 10 608 %cast1 = bitcast i32* %gep1 to i8* 609 %cmp = icmp ult i8* %cast1, %gep2 610 %use = ptrtoint i8* %cast1 to i64 611 %call = call i32 @test58_d(i64 %use) nounwind 612 ret i1 %cmp 613; CHECK-LABEL: @test59( 614; CHECK: ret i1 true 615} 616 617define i1 @test59_as1(i8 addrspace(1)* %foo) { 618 %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)* 619 %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 2 620 %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 10 621 %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)* 622 %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2 623 %use = ptrtoint i8 addrspace(1)* %cast1 to i64 624 %call = call i32 @test58_d(i64 %use) nounwind 625 ret i1 %cmp 626; CHECK: @test59_as1 627; CHECK: %[[GEP:.+]] = getelementptr inbounds i8 addrspace(1)* %foo, i16 8 628; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16 629; CHECK: ret i1 true 630} 631 632define i1 @test60(i8* %foo, i64 %i, i64 %j) { 633 %bit = bitcast i8* %foo to i32* 634 %gep1 = getelementptr inbounds i32* %bit, i64 %i 635 %gep2 = getelementptr inbounds i8* %foo, i64 %j 636 %cast1 = bitcast i32* %gep1 to i8* 637 %cmp = icmp ult i8* %cast1, %gep2 638 ret i1 %cmp 639; CHECK-LABEL: @test60( 640; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2 641; CHECK-NEXT: icmp slt i64 %gep1.idx, %j 642; CHECK-NEXT: ret i1 643} 644 645define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) { 646 %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)* 647 %gep1 = getelementptr inbounds i32 addrspace(1)* %bit, i64 %i 648 %gep2 = getelementptr inbounds i8 addrspace(1)* %foo, i64 %j 649 %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)* 650 %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2 651 ret i1 %cmp 652; CHECK: @test60_as1 653; CHECK: trunc i64 %i to i16 654; CHECK: trunc i64 %j to i16 655; CHECK: %gep1.idx = shl nuw i16 %{{.+}}, 2 656; CHECK-NEXT: icmp sgt i16 %{{.+}}, %gep1.idx 657; CHECK-NEXT: ret i1 658} 659 660define i1 @test61(i8* %foo, i64 %i, i64 %j) { 661 %bit = bitcast i8* %foo to i32* 662 %gep1 = getelementptr i32* %bit, i64 %i 663 %gep2 = getelementptr i8* %foo, i64 %j 664 %cast1 = bitcast i32* %gep1 to i8* 665 %cmp = icmp ult i8* %cast1, %gep2 666 ret i1 %cmp 667; Don't transform non-inbounds GEPs. 668; CHECK-LABEL: @test61( 669; CHECK: icmp ult i8* %cast1, %gep2 670; CHECK-NEXT: ret i1 671} 672 673define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) { 674 %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)* 675 %gep1 = getelementptr i32 addrspace(1)* %bit, i16 %i 676 %gep2 = getelementptr i8 addrspace(1)* %foo, i16 %j 677 %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)* 678 %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2 679 ret i1 %cmp 680; Don't transform non-inbounds GEPs. 681; CHECK: @test61_as1 682; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2 683; CHECK-NEXT: ret i1 684} 685 686define i1 @test62(i8* %a) { 687 %arrayidx1 = getelementptr inbounds i8* %a, i64 1 688 %arrayidx2 = getelementptr inbounds i8* %a, i64 10 689 %cmp = icmp slt i8* %arrayidx1, %arrayidx2 690 ret i1 %cmp 691; CHECK-LABEL: @test62( 692; CHECK-NEXT: ret i1 true 693} 694 695define i1 @test62_as1(i8 addrspace(1)* %a) { 696; CHECK-LABEL: @test62_as1( 697; CHECK-NEXT: ret i1 true 698 %arrayidx1 = getelementptr inbounds i8 addrspace(1)* %a, i64 1 699 %arrayidx2 = getelementptr inbounds i8 addrspace(1)* %a, i64 10 700 %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2 701 ret i1 %cmp 702} 703 704define i1 @test63(i8 %a, i32 %b) nounwind { 705 %z = zext i8 %a to i32 706 %t = and i32 %b, 255 707 %c = icmp eq i32 %z, %t 708 ret i1 %c 709; CHECK-LABEL: @test63( 710; CHECK-NEXT: %1 = trunc i32 %b to i8 711; CHECK-NEXT: %c = icmp eq i8 %1, %a 712; CHECK-NEXT: ret i1 %c 713} 714 715define i1 @test64(i8 %a, i32 %b) nounwind { 716 %t = and i32 %b, 255 717 %z = zext i8 %a to i32 718 %c = icmp eq i32 %t, %z 719 ret i1 %c 720; CHECK-LABEL: @test64( 721; CHECK-NEXT: %1 = trunc i32 %b to i8 722; CHECK-NEXT: %c = icmp eq i8 %1, %a 723; CHECK-NEXT: ret i1 %c 724} 725 726define i1 @test65(i64 %A, i64 %B) { 727 %s1 = add i64 %A, %B 728 %s2 = add i64 %A, %B 729 %cmp = icmp eq i64 %s1, %s2 730; CHECK-LABEL: @test65( 731; CHECK-NEXT: ret i1 true 732 ret i1 %cmp 733} 734 735define i1 @test66(i64 %A, i64 %B) { 736 %s1 = add i64 %A, %B 737 %s2 = add i64 %B, %A 738 %cmp = icmp eq i64 %s1, %s2 739; CHECK-LABEL: @test66( 740; CHECK-NEXT: ret i1 true 741 ret i1 %cmp 742} 743 744; CHECK-LABEL: @test67( 745; CHECK: %and = and i32 %x, 96 746; CHECK: %cmp = icmp ne i32 %and, 0 747define i1 @test67(i32 %x) nounwind uwtable { 748 %and = and i32 %x, 127 749 %cmp = icmp sgt i32 %and, 31 750 ret i1 %cmp 751} 752 753; CHECK-LABEL: @test68( 754; CHECK: %cmp = icmp ugt i32 %and, 30 755define i1 @test68(i32 %x) nounwind uwtable { 756 %and = and i32 %x, 127 757 %cmp = icmp sgt i32 %and, 30 758 ret i1 %cmp 759} 760 761; PR14708 762; CHECK-LABEL: @test69( 763; CHECK: %1 = and i32 %c, -33 764; CHECK: %2 = icmp eq i32 %1, 65 765; CHECK: ret i1 %2 766define i1 @test69(i32 %c) nounwind uwtable { 767 %1 = icmp eq i32 %c, 97 768 %2 = icmp eq i32 %c, 65 769 %3 = or i1 %1, %2 770 ret i1 %3 771} 772 773; PR15940 774; CHECK-LABEL: @test70( 775; CHECK-NEXT: %A = srem i32 5, %X 776; CHECK-NEXT: %C = icmp ne i32 %A, 2 777; CHECK-NEXT: ret i1 %C 778define i1 @test70(i32 %X) { 779 %A = srem i32 5, %X 780 %B = add i32 %A, 2 781 %C = icmp ne i32 %B, 4 782 ret i1 %C 783} 784 785; CHECK-LABEL: @icmp_sext16trunc( 786; CHECK-NEXT: %1 = trunc i32 %x to i16 787; CHECK-NEXT: %cmp = icmp slt i16 %1, 36 788define i1 @icmp_sext16trunc(i32 %x) { 789 %trunc = trunc i32 %x to i16 790 %sext = sext i16 %trunc to i32 791 %cmp = icmp slt i32 %sext, 36 792 ret i1 %cmp 793} 794 795; CHECK-LABEL: @icmp_sext8trunc( 796; CHECK-NEXT: %1 = trunc i32 %x to i8 797; CHECK-NEXT: %cmp = icmp slt i8 %1, 36 798define i1 @icmp_sext8trunc(i32 %x) { 799 %trunc = trunc i32 %x to i8 800 %sext = sext i8 %trunc to i32 801 %cmp = icmp slt i32 %sext, 36 802 ret i1 %cmp 803} 804 805; CHECK-LABEL: @icmp_shl16( 806; CHECK-NEXT: %1 = trunc i32 %x to i16 807; CHECK-NEXT: %cmp = icmp slt i16 %1, 36 808define i1 @icmp_shl16(i32 %x) { 809 %shl = shl i32 %x, 16 810 %cmp = icmp slt i32 %shl, 2359296 811 ret i1 %cmp 812} 813 814; CHECK-LABEL: @icmp_shl24( 815; CHECK-NEXT: %1 = trunc i32 %x to i8 816; CHECK-NEXT: %cmp = icmp slt i8 %1, 36 817define i1 @icmp_shl24(i32 %x) { 818 %shl = shl i32 %x, 24 819 %cmp = icmp slt i32 %shl, 603979776 820 ret i1 %cmp 821} 822 823; If the (shl x, C) preserved the sign and this is a sign test, 824; compare the LHS operand instead 825; CHECK-LABEL: @icmp_shl_nsw_sgt( 826; CHECK-NEXT: icmp sgt i32 %x, 0 827define i1 @icmp_shl_nsw_sgt(i32 %x) { 828 %shl = shl nsw i32 %x, 21 829 %cmp = icmp sgt i32 %shl, 0 830 ret i1 %cmp 831} 832 833; CHECK-LABEL: @icmp_shl_nsw_sge0( 834; CHECK-NEXT: icmp sgt i32 %x, -1 835define i1 @icmp_shl_nsw_sge0(i32 %x) { 836 %shl = shl nsw i32 %x, 21 837 %cmp = icmp sge i32 %shl, 0 838 ret i1 %cmp 839} 840 841; CHECK-LABEL: @icmp_shl_nsw_sge1( 842; CHECK-NEXT: icmp sgt i32 %x, 0 843define i1 @icmp_shl_nsw_sge1(i32 %x) { 844 %shl = shl nsw i32 %x, 21 845 %cmp = icmp sge i32 %shl, 1 846 ret i1 %cmp 847} 848 849; Checks for icmp (eq|ne) (shl x, C), 0 850; CHECK-LABEL: @icmp_shl_nsw_eq( 851; CHECK-NEXT: icmp eq i32 %x, 0 852define i1 @icmp_shl_nsw_eq(i32 %x) { 853 %mul = shl nsw i32 %x, 5 854 %cmp = icmp eq i32 %mul, 0 855 ret i1 %cmp 856} 857 858; CHECK-LABEL: @icmp_shl_eq( 859; CHECK-NOT: icmp eq i32 %mul, 0 860define i1 @icmp_shl_eq(i32 %x) { 861 %mul = shl i32 %x, 5 862 %cmp = icmp eq i32 %mul, 0 863 ret i1 %cmp 864} 865 866; CHECK-LABEL: @icmp_shl_nsw_ne( 867; CHECK-NEXT: icmp ne i32 %x, 0 868define i1 @icmp_shl_nsw_ne(i32 %x) { 869 %mul = shl nsw i32 %x, 7 870 %cmp = icmp ne i32 %mul, 0 871 ret i1 %cmp 872} 873 874; CHECK-LABEL: @icmp_shl_ne( 875; CHECK-NOT: icmp ne i32 %x, 0 876define i1 @icmp_shl_ne(i32 %x) { 877 %mul = shl i32 %x, 7 878 %cmp = icmp ne i32 %mul, 0 879 ret i1 %cmp 880} 881 882; If the (mul x, C) preserved the sign and this is sign test, 883; compare the LHS operand instead 884; CHECK-LABEL: @icmp_mul_nsw( 885; CHECK-NEXT: icmp sgt i32 %x, 0 886define i1 @icmp_mul_nsw(i32 %x) { 887 %mul = mul nsw i32 %x, 12 888 %cmp = icmp sgt i32 %mul, 0 889 ret i1 %cmp 890} 891 892; CHECK-LABEL: @icmp_mul_nsw1( 893; CHECK-NEXT: icmp slt i32 %x, 0 894define i1 @icmp_mul_nsw1(i32 %x) { 895 %mul = mul nsw i32 %x, 12 896 %cmp = icmp sle i32 %mul, -1 897 ret i1 %cmp 898} 899 900; CHECK-LABEL: @icmp_mul_nsw_neg( 901; CHECK-NEXT: icmp slt i32 %x, 1 902define i1 @icmp_mul_nsw_neg(i32 %x) { 903 %mul = mul nsw i32 %x, -12 904 %cmp = icmp sge i32 %mul, 0 905 ret i1 %cmp 906} 907 908; CHECK-LABEL: @icmp_mul_nsw_neg1( 909; CHECK-NEXT: icmp slt i32 %x, 0 910define i1 @icmp_mul_nsw_neg1(i32 %x) { 911 %mul = mul nsw i32 %x, -12 912 %cmp = icmp sge i32 %mul, 1 913 ret i1 %cmp 914} 915 916; CHECK-LABEL: @icmp_mul_nsw_0( 917; CHECK-NOT: icmp sgt i32 %x, 0 918define i1 @icmp_mul_nsw_0(i32 %x) { 919 %mul = mul nsw i32 %x, 0 920 %cmp = icmp sgt i32 %mul, 0 921 ret i1 %cmp 922} 923 924; CHECK-LABEL: @icmp_mul( 925; CHECK-NEXT: %mul = mul i32 %x, -12 926define i1 @icmp_mul(i32 %x) { 927 %mul = mul i32 %x, -12 928 %cmp = icmp sge i32 %mul, 0 929 ret i1 %cmp 930} 931 932; Checks for icmp (eq|ne) (mul x, C), 0 933; CHECK-LABEL: @icmp_mul_neq0( 934; CHECK-NEXT: icmp ne i32 %x, 0 935define i1 @icmp_mul_neq0(i32 %x) { 936 %mul = mul nsw i32 %x, -12 937 %cmp = icmp ne i32 %mul, 0 938 ret i1 %cmp 939} 940 941; CHECK-LABEL: @icmp_mul_eq0( 942; CHECK-NEXT: icmp eq i32 %x, 0 943define i1 @icmp_mul_eq0(i32 %x) { 944 %mul = mul nsw i32 %x, 12 945 %cmp = icmp eq i32 %mul, 0 946 ret i1 %cmp 947} 948 949; CHECK-LABEL: @icmp_mul0_eq0( 950; CHECK-NEXT: ret i1 true 951define i1 @icmp_mul0_eq0(i32 %x) { 952 %mul = mul i32 %x, 0 953 %cmp = icmp eq i32 %mul, 0 954 ret i1 %cmp 955} 956 957; CHECK-LABEL: @icmp_mul0_ne0( 958; CHECK-NEXT: ret i1 false 959define i1 @icmp_mul0_ne0(i32 %x) { 960 %mul = mul i32 %x, 0 961 %cmp = icmp ne i32 %mul, 0 962 ret i1 %cmp 963} 964 965; CHECK-LABEL: @icmp_sub1_sge( 966; CHECK-NEXT: icmp sgt i32 %x, %y 967define i1 @icmp_sub1_sge(i32 %x, i32 %y) { 968 %sub = add nsw i32 %x, -1 969 %cmp = icmp sge i32 %sub, %y 970 ret i1 %cmp 971} 972 973; CHECK-LABEL: @icmp_add1_sgt( 974; CHECK-NEXT: icmp sge i32 %x, %y 975define i1 @icmp_add1_sgt(i32 %x, i32 %y) { 976 %add = add nsw i32 %x, 1 977 %cmp = icmp sgt i32 %add, %y 978 ret i1 %cmp 979} 980 981; CHECK-LABEL: @icmp_sub1_slt( 982; CHECK-NEXT: icmp sle i32 %x, %y 983define i1 @icmp_sub1_slt(i32 %x, i32 %y) { 984 %sub = add nsw i32 %x, -1 985 %cmp = icmp slt i32 %sub, %y 986 ret i1 %cmp 987} 988 989; CHECK-LABEL: @icmp_add1_sle( 990; CHECK-NEXT: icmp slt i32 %x, %y 991define i1 @icmp_add1_sle(i32 %x, i32 %y) { 992 %add = add nsw i32 %x, 1 993 %cmp = icmp sle i32 %add, %y 994 ret i1 %cmp 995} 996 997; CHECK-LABEL: @icmp_add20_sge_add57( 998; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add nsw i32 %y, 37 999; CHECK-NEXT: icmp sle i32 [[ADD]], %x 1000define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) { 1001 %1 = add nsw i32 %x, 20 1002 %2 = add nsw i32 %y, 57 1003 %cmp = icmp sge i32 %1, %2 1004 ret i1 %cmp 1005} 1006 1007; CHECK-LABEL: @icmp_sub57_sge_sub20( 1008; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add nsw i32 %x, -37 1009; CHECK-NEXT: icmp sge i32 [[SUB]], %y 1010define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) { 1011 %1 = add nsw i32 %x, -57 1012 %2 = add nsw i32 %y, -20 1013 %cmp = icmp sge i32 %1, %2 1014 ret i1 %cmp 1015} 1016 1017; CHECK-LABEL: @icmp_and_shl_neg_ne_0( 1018; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B 1019; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A 1020; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 0 1021; CHECK-NEXT: ret i1 [[CMP]] 1022define i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) { 1023 %neg = xor i32 %A, -1 1024 %shl = shl i32 1, %B 1025 %and = and i32 %shl, %neg 1026 %cmp = icmp ne i32 %and, 0 1027 ret i1 %cmp 1028} 1029 1030; CHECK-LABEL: @icmp_and_shl_neg_eq_0( 1031; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B 1032; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A 1033; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0 1034; CHECK-NEXT: ret i1 [[CMP]] 1035define i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) { 1036 %neg = xor i32 %A, -1 1037 %shl = shl i32 1, %B 1038 %and = and i32 %shl, %neg 1039 %cmp = icmp eq i32 %and, 0 1040 ret i1 %cmp 1041} 1042 1043; CHECK-LABEL: @icmp_add_and_shr_ne_0( 1044; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, 240 1045; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 224 1046; CHECK-NEXT: ret i1 [[CMP]] 1047define i1 @icmp_add_and_shr_ne_0(i32 %X) { 1048 %shr = lshr i32 %X, 4 1049 %and = and i32 %shr, 15 1050 %add = add i32 %and, -14 1051 %tobool = icmp ne i32 %add, 0 1052 ret i1 %tobool 1053} 1054 1055; PR16244 1056; CHECK-LABEL: define i1 @test71( 1057; CHECK-NEXT: ret i1 false 1058define i1 @test71(i8* %x) { 1059 %a = getelementptr i8* %x, i64 8 1060 %b = getelementptr inbounds i8* %x, i64 8 1061 %c = icmp ugt i8* %a, %b 1062 ret i1 %c 1063} 1064 1065define i1 @test71_as1(i8 addrspace(1)* %x) { 1066; CHECK-LABEL: @test71_as1( 1067; CHECK-NEXT: ret i1 false 1068 %a = getelementptr i8 addrspace(1)* %x, i64 8 1069 %b = getelementptr inbounds i8 addrspace(1)* %x, i64 8 1070 %c = icmp ugt i8 addrspace(1)* %a, %b 1071 ret i1 %c 1072} 1073 1074; CHECK-LABEL: @icmp_shl_1_V_ult_32( 1075; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5 1076; CHECK-NEXT: ret i1 [[CMP]] 1077define i1 @icmp_shl_1_V_ult_32(i32 %V) { 1078 %shl = shl i32 1, %V 1079 %cmp = icmp ult i32 %shl, 32 1080 ret i1 %cmp 1081} 1082 1083; CHECK-LABEL: @icmp_shl_1_V_eq_32( 1084; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 5 1085; CHECK-NEXT: ret i1 [[CMP]] 1086define i1 @icmp_shl_1_V_eq_32(i32 %V) { 1087 %shl = shl i32 1, %V 1088 %cmp = icmp eq i32 %shl, 32 1089 ret i1 %cmp 1090} 1091 1092; CHECK-LABEL: @icmp_shl_1_V_eq_31( 1093; CHECK-NEXT: ret i1 false 1094define i1 @icmp_shl_1_V_eq_31(i32 %V) { 1095 %shl = shl i32 1, %V 1096 %cmp = icmp eq i32 %shl, 31 1097 ret i1 %cmp 1098} 1099 1100; CHECK-LABEL: @icmp_shl_1_V_ne_31( 1101; CHECK-NEXT: ret i1 true 1102define i1 @icmp_shl_1_V_ne_31(i32 %V) { 1103 %shl = shl i32 1, %V 1104 %cmp = icmp ne i32 %shl, 31 1105 ret i1 %cmp 1106} 1107 1108; CHECK-LABEL: @icmp_shl_1_V_ult_30( 1109; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5 1110; CHECK-NEXT: ret i1 [[CMP]] 1111define i1 @icmp_shl_1_V_ult_30(i32 %V) { 1112 %shl = shl i32 1, %V 1113 %cmp = icmp ult i32 %shl, 30 1114 ret i1 %cmp 1115} 1116 1117; CHECK-LABEL: @icmp_shl_1_V_ugt_30( 1118; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4 1119; CHECK-NEXT: ret i1 [[CMP]] 1120define i1 @icmp_shl_1_V_ugt_30(i32 %V) { 1121 %shl = shl i32 1, %V 1122 %cmp = icmp ugt i32 %shl, 30 1123 ret i1 %cmp 1124} 1125 1126; CHECK-LABEL: @icmp_shl_1_V_ule_30( 1127; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5 1128; CHECK-NEXT: ret i1 [[CMP]] 1129define i1 @icmp_shl_1_V_ule_30(i32 %V) { 1130 %shl = shl i32 1, %V 1131 %cmp = icmp ule i32 %shl, 30 1132 ret i1 %cmp 1133} 1134 1135; CHECK-LABEL: @icmp_shl_1_V_uge_30( 1136; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4 1137; CHECK-NEXT: ret i1 [[CMP]] 1138define i1 @icmp_shl_1_V_uge_30(i32 %V) { 1139 %shl = shl i32 1, %V 1140 %cmp = icmp uge i32 %shl, 30 1141 ret i1 %cmp 1142} 1143 1144; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648( 1145; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 31 1146; CHECK-NEXT: ret i1 [[CMP]] 1147define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) { 1148 %shl = shl i32 1, %V 1149 %cmp = icmp uge i32 %shl, 2147483648 1150 ret i1 %cmp 1151} 1152 1153; CHECK-LABEL: @icmp_shl_1_V_ugt_2147483648( 1154; CHECK-NEXT: ret i1 false 1155define i1 @icmp_shl_1_V_ugt_2147483648(i32 %V) { 1156 %shl = shl i32 1, %V 1157 %cmp = icmp ugt i32 %shl, 2147483648 1158 ret i1 %cmp 1159} 1160 1161; CHECK-LABEL: @icmp_shl_1_V_ule_2147483648( 1162; CHECK-NEXT: ret i1 true 1163define i1 @icmp_shl_1_V_ule_2147483648(i32 %V) { 1164 %shl = shl i32 1, %V 1165 %cmp = icmp ule i32 %shl, 2147483648 1166 ret i1 %cmp 1167} 1168 1169; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648( 1170; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31 1171; CHECK-NEXT: ret i1 [[CMP]] 1172define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) { 1173 %shl = shl i32 1, %V 1174 %cmp = icmp ult i32 %shl, 2147483648 1175 ret i1 %cmp 1176} 1177 1178; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B( 1179; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add i64 %b, -1 1180; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp uge i64 [[SUB]], %a 1181; CHECK-NEXT: ret i1 [[CMP]] 1182define i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) { 1183 %1 = icmp eq i64 %b, 0 1184 %2 = icmp ult i64 %a, %b 1185 %3 = or i1 %1, %2 1186 ret i1 %3 1187} 1188 1189; CHECK-LABEL: @icmp_add_ult_2( 1190; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2 1191; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14 1192; CHECK-NEXT: ret i1 [[CMP]] 1193define i1 @icmp_add_ult_2(i32 %X) { 1194 %add = add i32 %X, -14 1195 %cmp = icmp ult i32 %add, 2 1196 ret i1 %cmp 1197} 1198 1199; CHECK: @icmp_add_X_-14_ult_2 1200; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2 1201; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14 1202; CHECK-NEXT: ret i1 [[CMP]] 1203define i1 @icmp_add_X_-14_ult_2(i32 %X) { 1204 %add = add i32 %X, -14 1205 %cmp = icmp ult i32 %add, 2 1206 ret i1 %cmp 1207} 1208 1209; CHECK-LABEL: @icmp_sub_3_X_ult_2( 1210; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1 1211; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3 1212; CHECK-NEXT: ret i1 [[CMP]] 1213define i1 @icmp_sub_3_X_ult_2(i32 %X) { 1214 %add = sub i32 3, %X 1215 %cmp = icmp ult i32 %add, 2 1216 ret i1 %cmp 1217} 1218 1219; CHECK: @icmp_add_X_-14_uge_2 1220; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2 1221; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14 1222; CHECK-NEXT: ret i1 [[CMP]] 1223define i1 @icmp_add_X_-14_uge_2(i32 %X) { 1224 %add = add i32 %X, -14 1225 %cmp = icmp uge i32 %add, 2 1226 ret i1 %cmp 1227} 1228 1229; CHECK-LABEL: @icmp_sub_3_X_uge_2( 1230; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1 1231; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3 1232; CHECK-NEXT: ret i1 [[CMP]] 1233define i1 @icmp_sub_3_X_uge_2(i32 %X) { 1234 %add = sub i32 3, %X 1235 %cmp = icmp uge i32 %add, 2 1236 ret i1 %cmp 1237} 1238 1239; CHECK: @icmp_and_X_-16_eq-16 1240; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17 1241; CHECK-NEXT: ret i1 [[CMP]] 1242define i1 @icmp_and_X_-16_eq-16(i32 %X) { 1243 %and = and i32 %X, -16 1244 %cmp = icmp eq i32 %and, -16 1245 ret i1 %cmp 1246} 1247 1248; CHECK: @icmp_and_X_-16_ne-16 1249; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -16 1250; CHECK-NEXT: ret i1 [[CMP]] 1251define i1 @icmp_and_X_-16_ne-16(i32 %X) { 1252 %and = and i32 %X, -16 1253 %cmp = icmp ne i32 %and, -16 1254 ret i1 %cmp 1255} 1256 1257; CHECK: @icmp_sub_-1_X_ult_4 1258; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -5 1259; CHECK-NEXT: ret i1 [[CMP]] 1260define i1 @icmp_sub_-1_X_ult_4(i32 %X) { 1261 %sub = sub i32 -1, %X 1262 %cmp = icmp ult i32 %sub, 4 1263 ret i1 %cmp 1264} 1265 1266; CHECK: @icmp_sub_-1_X_uge_4 1267; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -4 1268; CHECK-NEXT: ret i1 [[CMP]] 1269define i1 @icmp_sub_-1_X_uge_4(i32 %X) { 1270 %sub = sub i32 -1, %X 1271 %cmp = icmp uge i32 %sub, 4 1272 ret i1 %cmp 1273} 1274 1275; CHECK-LABEL: @icmp_swap_operands_for_cse 1276; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y 1277; CHECK-NEXT: br i1 [[CMP]], label %true, label %false 1278; CHECK: ret i1 1279define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) { 1280entry: 1281 %sub = sub i32 %X, %Y 1282 %cmp = icmp ugt i32 %Y, %X 1283 br i1 %cmp, label %true, label %false 1284true: 1285 %restrue = trunc i32 %sub to i1 1286 br label %end 1287false: 1288 %shift = lshr i32 %sub, 4 1289 %resfalse = trunc i32 %shift to i1 1290 br label %end 1291end: 1292 %res = phi i1 [%restrue, %true], [%resfalse, %false] 1293 ret i1 %res 1294} 1295 1296; CHECK-LABEL: @icmp_swap_operands_for_cse2 1297; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y 1298; CHECK-NEXT: br i1 [[CMP]], label %true, label %false 1299; CHECK: ret i1 1300define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) { 1301entry: 1302 %cmp = icmp ugt i32 %Y, %X 1303 br i1 %cmp, label %true, label %false 1304true: 1305 %sub = sub i32 %X, %Y 1306 %sub1 = sub i32 %X, %Y 1307 %add = add i32 %sub, %sub1 1308 %restrue = trunc i32 %add to i1 1309 br label %end 1310false: 1311 %sub2 = sub i32 %Y, %X 1312 %resfalse = trunc i32 %sub2 to i1 1313 br label %end 1314end: 1315 %res = phi i1 [%restrue, %true], [%resfalse, %false] 1316 ret i1 %res 1317} 1318 1319; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse 1320; CHECK: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %Y, %X 1321; CHECK-NEXT: br i1 [[CMP]], label %true, label %false 1322; CHECK: ret i1 1323define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) { 1324entry: 1325 %cmp = icmp ugt i32 %Y, %X 1326 br i1 %cmp, label %true, label %false 1327true: 1328 %sub = sub i32 %X, %Y 1329 %restrue = trunc i32 %sub to i1 1330 br label %end 1331false: 1332 %sub2 = sub i32 %Y, %X 1333 %resfalse = trunc i32 %sub2 to i1 1334 br label %end 1335end: 1336 %res = phi i1 [%restrue, %true], [%resfalse, %false] 1337 ret i1 %res 1338} 1339 1340; CHECK-LABEL: @icmp_lshr_lshr_eq 1341; CHECK: %z.unshifted = xor i32 %a, %b 1342; CHECK: %z = icmp ult i32 %z.unshifted, 1073741824 1343define i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind { 1344 %x = lshr i32 %a, 30 1345 %y = lshr i32 %b, 30 1346 %z = icmp eq i32 %x, %y 1347 ret i1 %z 1348} 1349 1350; CHECK-LABEL: @icmp_ashr_ashr_ne 1351; CHECK: %z.unshifted = xor i32 %a, %b 1352; CHECK: %z = icmp ugt i32 %z.unshifted, 255 1353define i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind { 1354 %x = ashr i32 %a, 8 1355 %y = ashr i32 %b, 8 1356 %z = icmp ne i32 %x, %y 1357 ret i1 %z 1358} 1359