brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.8 KiB · 871cc5d Raw
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