812 lines · plain
1; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s3 4; Test cases for compare elimination in PPCMIPeephole pass5 6define void @func1(i32 signext %a) {7; We should have only one compare instruction8; CHECK-LABEL: @func19; CHECK: cmp10; CHECK-NOT: cmp11; CHECK: blr12entry:13 %cmp = icmp eq i32 %a, 10014 br i1 %cmp, label %if.then, label %if.else15 16if.then:17 tail call void @dummy1()18 br label %if.end319 20if.else:21 %cmp1 = icmp slt i32 %a, 10022 br i1 %cmp1, label %if.then2, label %if.end323 24if.then2:25 tail call void @dummy2()26 br label %if.end327 28if.end3:29 ret void30}31 32 33define void @func2(i32 signext %a) {34; CHECK-LABEL: @func235; CHECK: cmp36; CHECK-NOT: cmp37; CHECK: blr38entry:39 %cmp = icmp slt i32 %a, 10040 br i1 %cmp, label %if.then, label %if.else41 42if.then:43 tail call void @dummy1()44 br label %if.end345 46if.else:47 %cmp1 = icmp eq i32 %a, 10048 br i1 %cmp1, label %if.end3, label %if.then249 50if.then2:51 tail call void @dummy2()52 br label %if.end353 54if.end3:55 ret void56}57 58 59define void @func3(i32 signext %a) {60; CHECK-LABEL: @func361; CHECK: cmp62; CHECK-NOT: cmp63; CHECK: blr64entry:65 %cmp = icmp sgt i32 %a, 10066 br i1 %cmp, label %if.then, label %if.else67 68if.then:69 tail call void @dummy1()70 br label %if.end371 72if.else:73 %cmp1 = icmp eq i32 %a, 10074 br i1 %cmp1, label %if.then2, label %if.end375 76if.then2:77 tail call void @dummy2()78 br label %if.end379 80if.end3:81 ret void82}83 84 85define void @func4(i32 zeroext %a) {86; CHECK-LABEL: @func487; CHECK: cmp88; CHECK-NOT: cmp89; CHECK: blr90entry:91 %cmp = icmp eq i32 %a, 10092 br i1 %cmp, label %if.then, label %if.else93 94if.then:95 tail call void @dummy1()96 br label %if.end397 98if.else:99 %cmp1 = icmp ult i32 %a, 100100 br i1 %cmp1, label %if.then2, label %if.end3101 102if.then2:103 tail call void @dummy2()104 br label %if.end3105 106if.end3:107 ret void108}109 110 111define void @func5(i32 zeroext %a) {112; CHECK-LABEL: @func5113; CHECK: cmp114; CHECK-NOT: cmp115; CHECK: blr116entry:117 %cmp = icmp ult i32 %a, 100118 br i1 %cmp, label %if.then, label %if.else119 120if.then:121 tail call void @dummy1()122 br label %if.end3123 124if.else:125 %cmp1 = icmp eq i32 %a, 100126 br i1 %cmp1, label %if.end3, label %if.then2127 128if.then2:129 tail call void @dummy2()130 br label %if.end3131 132if.end3:133 ret void134}135 136 137define void @func6(i32 zeroext %a) {138; CHECK-LABEL: @func6139; CHECK: cmp140; CHECK-NOT: cmp141; CHECK: blr142entry:143 %cmp = icmp ugt i32 %a, 100144 br i1 %cmp, label %if.then, label %if.else145 146if.then:147 tail call void @dummy1()148 br label %if.end3149 150if.else:151 %cmp1 = icmp eq i32 %a, 100152 br i1 %cmp1, label %if.then2, label %if.end3153 154if.then2:155 tail call void @dummy2()156 br label %if.end3157 158if.end3:159 ret void160}161 162 163define void @func7(i64 %a) {164; CHECK-LABEL: @func7165; CHECK: cmp166; CHECK-NOT: cmp167; CHECK: blr168entry:169 %cmp = icmp eq i64 %a, 100170 br i1 %cmp, label %if.then, label %if.else171 172if.then:173 tail call void @dummy1()174 br label %if.end3175 176if.else:177 %cmp1 = icmp slt i64 %a, 100178 br i1 %cmp1, label %if.then2, label %if.end3179 180if.then2:181 tail call void @dummy2()182 br label %if.end3183 184if.end3:185 ret void186}187 188 189define void @func8(i64 %a) {190; CHECK-LABEL: @func8191; CHECK: cmp192; CHECK-NOT: cmp193; CHECK: blr194entry:195 %cmp = icmp slt i64 %a, 100196 br i1 %cmp, label %if.then, label %if.else197 198if.then:199 tail call void @dummy1()200 br label %if.end3201 202if.else:203 %cmp1 = icmp eq i64 %a, 100204 br i1 %cmp1, label %if.end3, label %if.then2205 206if.then2:207 tail call void @dummy2()208 br label %if.end3209 210if.end3:211 ret void212}213 214 215define void @func9(i64 %a) {216; CHECK-LABEL: @func9217; CHECK: cmp218; CHECK-NOT: cmp219; CHECK: blr220entry:221 %cmp = icmp sgt i64 %a, 100222 br i1 %cmp, label %if.then, label %if.else223 224if.then:225 tail call void @dummy1()226 br label %if.end3227 228if.else:229 %cmp1 = icmp eq i64 %a, 100230 br i1 %cmp1, label %if.then2, label %if.end3231 232if.then2:233 tail call void @dummy2()234 br label %if.end3235 236if.end3:237 ret void238}239 240 241define void @func10(i64 %a) {242; CHECK-LABEL: @func10243; CHECK: cmp244; CHECK-NOT: cmp245; CHECK: blr246entry:247 %cmp = icmp eq i64 %a, 100248 br i1 %cmp, label %if.then, label %if.else249 250if.then:251 tail call void @dummy1()252 br label %if.end3253 254if.else:255 %cmp1 = icmp ult i64 %a, 100256 br i1 %cmp1, label %if.then2, label %if.end3257 258if.then2:259 tail call void @dummy2()260 br label %if.end3261 262if.end3:263 ret void264}265 266 267define void @func11(i64 %a) {268; CHECK-LABEL: @func11269; CHECK: cmp270; CHECK-NOT: cmp271; CHECK: blr272entry:273 %cmp = icmp ult i64 %a, 100274 br i1 %cmp, label %if.then, label %if.else275 276if.then:277 tail call void @dummy1()278 br label %if.end3279 280if.else:281 %cmp1 = icmp eq i64 %a, 100282 br i1 %cmp1, label %if.end3, label %if.then2283 284if.then2:285 tail call void @dummy2()286 br label %if.end3287 288if.end3:289 ret void290}291 292 293define void @func12(i64 %a) {294; CHECK-LABEL: @func12295; CHECK: cmp296; CHECK-NOT: cmp297; CHECK: blr298entry:299 %cmp = icmp ugt i64 %a, 100300 br i1 %cmp, label %if.then, label %if.else301 302if.then:303 tail call void @dummy1()304 br label %if.end3305 306if.else:307 %cmp1 = icmp eq i64 %a, 100308 br i1 %cmp1, label %if.then2, label %if.end3309 310if.then2:311 tail call void @dummy2()312 br label %if.end3313 314if.end3:315 ret void316}317 318 319define void @func13(i32 signext %a, i32 signext %b) {320; CHECK-LABEL: @func13321; CHECK: cmp322; CHECK-NOT: cmp323; CHECK: blr324entry:325 %cmp = icmp eq i32 %a, %b326 br i1 %cmp, label %if.then, label %if.else327 328if.then:329 tail call void @dummy1()330 br label %if.end3331 332if.else:333 %cmp1 = icmp slt i32 %a, %b334 br i1 %cmp1, label %if.then2, label %if.end3335 336if.then2:337 tail call void @dummy2()338 br label %if.end3339 340if.end3:341 ret void342}343 344 345define void @func14(i32 signext %a, i32 signext %b) {346; CHECK-LABEL: @func14347; CHECK: cmp348; CHECK-NOT: cmp349; CHECK: blr350entry:351 %cmp = icmp slt i32 %a, %b352 br i1 %cmp, label %if.then, label %if.else353 354if.then:355 tail call void @dummy1()356 br label %if.end3357 358if.else:359 %cmp1 = icmp sgt i32 %a, %b360 br i1 %cmp1, label %if.then2, label %if.end3361 362if.then2:363 tail call void @dummy2()364 br label %if.end3365 366if.end3:367 ret void368}369 370 371define void @func15(i32 signext %a, i32 signext %b) {372; CHECK-LABEL: @func15373; CHECK: cmp374; CHECK-NOT: cmp375; CHECK: blr376entry:377 %cmp = icmp slt i32 %b, %a378 br i1 %cmp, label %if.then, label %if.else379 380if.then:381 tail call void @dummy1()382 br label %if.end3383 384if.else:385 %cmp1 = icmp eq i32 %a, %b386 br i1 %cmp1, label %if.then2, label %if.end3387 388if.then2:389 tail call void @dummy2()390 br label %if.end3391 392if.end3:393 ret void394}395 396 397define void @func16(i32 zeroext %a, i32 zeroext %b) {398; CHECK-LABEL: @func16399; CHECK: cmp400; CHECK-NOT: cmp401; CHECK: blr402entry:403 %cmp = icmp eq i32 %a, %b404 br i1 %cmp, label %if.then, label %if.else405 406if.then:407 tail call void @dummy1()408 br label %if.end3409 410if.else:411 %cmp1 = icmp ult i32 %a, %b412 br i1 %cmp1, label %if.then2, label %if.end3413 414if.then2:415 tail call void @dummy2()416 br label %if.end3417 418if.end3:419 ret void420}421 422 423define void @func17(i32 zeroext %a, i32 zeroext %b) {424; CHECK-LABEL: @func17425; CHECK: cmp426; CHECK-NOT: cmp427; CHECK: blr428entry:429 %cmp = icmp ult i32 %a, %b430 br i1 %cmp, label %if.then, label %if.else431 432if.then:433 tail call void @dummy1()434 br label %if.end3435 436if.else:437 %cmp1 = icmp ugt i32 %a, %b438 br i1 %cmp1, label %if.then2, label %if.end3439 440if.then2:441 tail call void @dummy2()442 br label %if.end3443 444if.end3:445 ret void446}447 448 449define void @func18(i32 zeroext %a, i32 zeroext %b) {450; CHECK-LABEL: @func18451; CHECK: cmp452; CHECK-NOT: cmp453; CHECK: blr454entry:455 %cmp = icmp ult i32 %b, %a456 br i1 %cmp, label %if.then, label %if.else457 458if.then:459 tail call void @dummy1()460 br label %if.end3461 462if.else:463 %cmp1 = icmp eq i32 %a, %b464 br i1 %cmp1, label %if.then2, label %if.end3465 466if.then2:467 tail call void @dummy2()468 br label %if.end3469 470if.end3:471 ret void472}473 474 475define void @func19(i64 %a, i64 %b) {476; CHECK-LABEL: @func19477; CHECK: cmp478; CHECK-NOT: cmp479; CHECK: blr480entry:481 %cmp = icmp eq i64 %a, %b482 br i1 %cmp, label %if.then, label %if.else483 484if.then:485 tail call void @dummy1()486 br label %if.end3487 488if.else:489 %cmp1 = icmp slt i64 %a, %b490 br i1 %cmp1, label %if.then2, label %if.end3491 492if.then2:493 tail call void @dummy2()494 br label %if.end3495 496if.end3:497 ret void498}499 500 501define void @func20(i64 %a, i64 %b) {502; CHECK-LABEL: @func20503; CHECK: cmp504; CHECK-NOT: cmp505; CHECK: blr506entry:507 %cmp = icmp slt i64 %a, %b508 br i1 %cmp, label %if.then, label %if.else509 510if.then:511 tail call void @dummy1()512 br label %if.end3513 514if.else:515 %cmp1 = icmp sgt i64 %a, %b516 br i1 %cmp1, label %if.then2, label %if.end3517 518if.then2:519 tail call void @dummy2()520 br label %if.end3521 522if.end3:523 ret void524}525 526 527define void @func21(i64 %a, i64 %b) {528; CHECK-LABEL: @func21529; CHECK: cmp530; CHECK-NOT: cmp531; CHECK: blr532entry:533 %cmp = icmp slt i64 %b, %a534 br i1 %cmp, label %if.then, label %if.else535 536if.then:537 tail call void @dummy1()538 br label %if.end3539 540if.else:541 %cmp1 = icmp eq i64 %a, %b542 br i1 %cmp1, label %if.then2, label %if.end3543 544if.then2:545 tail call void @dummy2()546 br label %if.end3547 548if.end3:549 ret void550}551 552 553define void @func22(i64 %a, i64 %b) {554; CHECK-LABEL: @func22555; CHECK: cmp556; CHECK-NOT: cmp557; CHECK: blr558entry:559 %cmp = icmp eq i64 %a, %b560 br i1 %cmp, label %if.then, label %if.else561 562if.then:563 tail call void @dummy1()564 br label %if.end3565 566if.else:567 %cmp1 = icmp ult i64 %a, %b568 br i1 %cmp1, label %if.then2, label %if.end3569 570if.then2:571 tail call void @dummy2()572 br label %if.end3573 574if.end3:575 ret void576}577 578 579define void @func23(i64 %a, i64 %b) {580; CHECK-LABEL: @func23581; CHECK: cmp582; CHECK-NOT: cmp583; CHECK: blr584entry:585 %cmp = icmp ult i64 %a, %b586 br i1 %cmp, label %if.then, label %if.else587 588if.then:589 tail call void @dummy1()590 br label %if.end3591 592if.else:593 %cmp1 = icmp ugt i64 %a, %b594 br i1 %cmp1, label %if.then2, label %if.end3595 596if.then2:597 tail call void @dummy2()598 br label %if.end3599 600if.end3:601 ret void602}603 604 605define void @func24(i64 %a, i64 %b) {606; CHECK-LABEL: @func24607; CHECK: cmp608; CHECK-NOT: cmp609; CHECK: blr610entry:611 %cmp = icmp ult i64 %b, %a612 br i1 %cmp, label %if.then, label %if.else613 614if.then:615 tail call void @dummy1()616 br label %if.end3617 618if.else:619 %cmp1 = icmp eq i64 %a, %b620 br i1 %cmp1, label %if.then2, label %if.end3621 622if.then2:623 tail call void @dummy2()624 br label %if.end3625 626if.end3:627 ret void628}629 630 631define void @func25(i64 %a, i64 %b) {632; CHECK-LABEL: @func25633; CHECK: cmp634; CHECK-NOT: cmp635; CHECK: blr636entry:637 %cmp = icmp slt i64 %b, %a638 br i1 %cmp, label %if.then, label %if.else, !prof !1639 640if.then:641 tail call void @dummy1()642 br label %if.end6643 644if.else:645 %cmp2 = icmp eq i64 %a, %b646 br i1 %cmp2, label %if.then4, label %if.else5647 648if.then4:649 tail call void @dummy2()650 br label %if.end6651 652if.else5:653 tail call void @dummy3()654 br label %if.end6655 656if.end6:657 ret void658}659 660 661define void @func26(i32 signext %a) {662; CHECK-LABEL: @func26663; CHECK: cmp664; CHECK-NOT: cmp665; CHECK: blr666entry:667 %cmp = icmp sgt i32 %a, 0668 br i1 %cmp, label %if.then, label %if.else, !prof !2669 670if.then:671 tail call void @dummy1()672 br label %if.end9673 674if.else:675 %cmp2 = icmp eq i32 %a, 0676 br i1 %cmp2, label %if.then7, label %if.else8, !prof !2677 678if.then7:679 tail call void @dummy2()680 br label %if.end9681 682if.else8:683 tail call void @dummy3()684 br label %if.end9685 686if.end9:687 ret void688}689 690@g1 = external local_unnamed_addr global i32, align 4691@g2 = external local_unnamed_addr global i32, align 4692 693define void @func27(i32 signext %a) {694; CHECK-LABEL: @func27695; CHECK: cmp696; CHECK: beq697; CHECK-NOT: cmp698; CHECK: bgelr699; CHECK: blr700entry:701 %cmp = icmp eq i32 %a, 0702 br i1 %cmp, label %if.end3.sink.split, label %if.else703 704if.else:705 %cmp1 = icmp slt i32 %a, 0706 br i1 %cmp1, label %if.end3.sink.split, label %if.end707 708if.end3.sink.split:709 %g2.sink = phi ptr [ @g2, %if.else ], [ @g1, %entry ]710 store i32 0, ptr %g2.sink, align 4711 br label %if.end712 713if.end:714 ret void715}716 717; partially redundant case718define void @func28(i32 signext %a) {719; CHECK-LABEL: @func28720; CHECK: cmplwi [[REG1:[0-9]+]], [[REG2:[0-9]+]]721; CHECK: .[[LABEL2:[A-Z0-9_]+]]:722; CHECK: cmpwi [[REG1]], [[REG2]]723; CHECK: ble 0, .[[LABEL1:[A-Z0-9_]+]]724; CHECK-NOT: cmp725; CHECK: bne 0, .[[LABEL2]]726; CHECK: bl dummy1727; CHECK: b .[[LABEL2]]728; CHECK: .[[LABEL1]]:729; CHECK: blr730entry:731 br label %do.body732 733do.body:734 %a.addr.0 = phi i32 [ %a, %entry ], [ %call, %if.end ]735 %cmp = icmp eq i32 %a.addr.0, 0736 br i1 %cmp, label %if.then, label %if.end737 738if.then:739 tail call void @dummy1() #2740 br label %if.end741 742if.end:743 %call = tail call signext i32 @func(i32 signext %a.addr.0) #2744 %cmp1 = icmp sgt i32 %call, 0745 br i1 %cmp1, label %do.body, label %do.end746 747do.end:748 ret void749}750 751define void @func29(i32 signext %a) {752; We cannot merge two compares due to difference in sign extension behaviors.753; equivalent C code example:754; int a = .. ;755; if (a == -1) dummy1();756; if (a == (uint16_t)-1) dummy2();757 758; CHECK-LABEL: @func29759; CHECK: cmp760; CHECK: cmp761; CHECK: blr762entry:763 %cmp = icmp eq i32 %a, -1764 br i1 %cmp, label %if.then, label %if.else765 766if.then:767 tail call void @dummy1()768 br label %if.end3769 770if.else:771 %cmp1 = icmp eq i32 %a, 65535772 br i1 %cmp1, label %if.then2, label %if.end3773 774if.then2:775 tail call void @dummy2()776 br label %if.end3777 778if.end3:779 ret void780}781 782;; The result of %cmp may change in a tail call. Don't lift %cmp to the entry block.783; CHECK-LABEL: func_tailrecurse:784; CHECK-NOT: cmp785; CHECK: .LBB{{.*}}:786; CHECK: cmplw787; CHECK: blt788define fastcc zeroext i32 @func_tailrecurse(i32 zeroext %a, i32 zeroext %b) {789entry:790 br label %tailrecurse791 792tailrecurse: ; preds = %tailrecurse, %entry793 %a.tr = phi i32 [ %a, %entry ], [ %b.tr, %tailrecurse ]794 %b.tr = phi i32 [ %b, %entry ], [ %a.tr, %tailrecurse ]795 %cmp = icmp ult i32 %a.tr, %b.tr796 %conv = zext i1 %cmp to i32797 %ignore = call signext i32 (i32) @func(i32 %conv)798 br i1 %cmp, label %tailrecurse, label %if.end799 800if.end: ; preds = %tailrecurse801 %sub = sub nsw i32 %a.tr, %b.tr802 ret i32 %sub803}804 805declare void @dummy1()806declare void @dummy2()807declare void @dummy3()808declare signext i32 @func(i32 signext)809 810!1 = !{!"branch_weights", i32 2000, i32 1}811!2 = !{!"branch_weights", i32 1, i32 2000}812