Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / PowerPC / cmp_elimination.ll
blob871cc5df1f5fb55fc78c71f190faaf23ab2c4863
1 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s
4 ; Test cases for compare elimination in PPCMIPeephole pass
6 define void @func1(i32 signext %a) {
7 ; We should have only one compare instruction
8 ; CHECK-LABEL: @func1
9 ; CHECK: cmp
10 ; CHECK-NOT: cmp
11 ; CHECK: blr
12 entry:
13   %cmp = icmp eq i32 %a, 100
14   br i1 %cmp, label %if.then, label %if.else
16 if.then:
17   tail call void @dummy1()
18   br label %if.end3
20 if.else:
21   %cmp1 = icmp slt i32 %a, 100
22   br i1 %cmp1, label %if.then2, label %if.end3
24 if.then2:
25   tail call void @dummy2()
26   br label %if.end3
28 if.end3:
29   ret void
33 define void @func2(i32 signext %a) {
34 ; CHECK-LABEL: @func2
35 ; CHECK: cmp
36 ; CHECK-NOT: cmp
37 ; CHECK: blr
38 entry:
39   %cmp = icmp slt i32 %a, 100
40   br i1 %cmp, label %if.then, label %if.else
42 if.then:
43   tail call void @dummy1()
44   br label %if.end3
46 if.else:
47   %cmp1 = icmp eq i32 %a, 100
48   br i1 %cmp1, label %if.end3, label %if.then2
50 if.then2:
51   tail call void @dummy2()
52   br label %if.end3
54 if.end3:
55   ret void
59 define void @func3(i32 signext %a) {
60 ; CHECK-LABEL: @func3
61 ; CHECK: cmp
62 ; CHECK-NOT: cmp
63 ; CHECK: blr
64 entry:
65   %cmp = icmp sgt i32 %a, 100
66   br i1 %cmp, label %if.then, label %if.else
68 if.then:
69   tail call void @dummy1()
70   br label %if.end3
72 if.else:
73   %cmp1 = icmp eq i32 %a, 100
74   br i1 %cmp1, label %if.then2, label %if.end3
76 if.then2:
77   tail call void @dummy2()
78   br label %if.end3
80 if.end3:
81   ret void
85 define void @func4(i32 zeroext %a) {
86 ; CHECK-LABEL: @func4
87 ; CHECK: cmp
88 ; CHECK-NOT: cmp
89 ; CHECK: blr
90 entry:
91   %cmp = icmp eq i32 %a, 100
92   br i1 %cmp, label %if.then, label %if.else
94 if.then:
95   tail call void @dummy1()
96   br label %if.end3
98 if.else:
99   %cmp1 = icmp ult i32 %a, 100
100   br i1 %cmp1, label %if.then2, label %if.end3
102 if.then2:
103   tail call void @dummy2()
104   br label %if.end3
106 if.end3:
107   ret void
111 define void @func5(i32 zeroext %a) {
112 ; CHECK-LABEL: @func5
113 ; CHECK: cmp
114 ; CHECK-NOT: cmp
115 ; CHECK: blr
116 entry:
117   %cmp = icmp ult i32 %a, 100
118   br i1 %cmp, label %if.then, label %if.else
120 if.then:
121   tail call void @dummy1()
122   br label %if.end3
124 if.else:
125   %cmp1 = icmp eq i32 %a, 100
126   br i1 %cmp1, label %if.end3, label %if.then2
128 if.then2:
129   tail call void @dummy2()
130   br label %if.end3
132 if.end3:
133   ret void
137 define void @func6(i32 zeroext %a) {
138 ; CHECK-LABEL: @func6
139 ; CHECK: cmp
140 ; CHECK-NOT: cmp
141 ; CHECK: blr
142 entry:
143   %cmp = icmp ugt i32 %a, 100
144   br i1 %cmp, label %if.then, label %if.else
146 if.then:
147   tail call void @dummy1()
148   br label %if.end3
150 if.else:
151   %cmp1 = icmp eq i32 %a, 100
152   br i1 %cmp1, label %if.then2, label %if.end3
154 if.then2:
155   tail call void @dummy2()
156   br label %if.end3
158 if.end3:
159   ret void
163 define void @func7(i64 %a) {
164 ; CHECK-LABEL: @func7
165 ; CHECK: cmp
166 ; CHECK-NOT: cmp
167 ; CHECK: blr
168 entry:
169   %cmp = icmp eq i64 %a, 100
170   br i1 %cmp, label %if.then, label %if.else
172 if.then:
173   tail call void @dummy1()
174   br label %if.end3
176 if.else:
177   %cmp1 = icmp slt i64 %a, 100
178   br i1 %cmp1, label %if.then2, label %if.end3
180 if.then2:
181   tail call void @dummy2()
182   br label %if.end3
184 if.end3:
185   ret void
189 define void @func8(i64 %a) {
190 ; CHECK-LABEL: @func8
191 ; CHECK: cmp
192 ; CHECK-NOT: cmp
193 ; CHECK: blr
194 entry:
195   %cmp = icmp slt i64 %a, 100
196   br i1 %cmp, label %if.then, label %if.else
198 if.then:
199   tail call void @dummy1()
200   br label %if.end3
202 if.else:
203   %cmp1 = icmp eq i64 %a, 100
204   br i1 %cmp1, label %if.end3, label %if.then2
206 if.then2:
207   tail call void @dummy2()
208   br label %if.end3
210 if.end3:
211   ret void
215 define void @func9(i64 %a) {
216 ; CHECK-LABEL: @func9
217 ; CHECK: cmp
218 ; CHECK-NOT: cmp
219 ; CHECK: blr
220 entry:
221   %cmp = icmp sgt i64 %a, 100
222   br i1 %cmp, label %if.then, label %if.else
224 if.then:
225   tail call void @dummy1()
226   br label %if.end3
228 if.else:
229   %cmp1 = icmp eq i64 %a, 100
230   br i1 %cmp1, label %if.then2, label %if.end3
232 if.then2:
233   tail call void @dummy2()
234   br label %if.end3
236 if.end3:
237   ret void
241 define void @func10(i64 %a) {
242 ; CHECK-LABEL: @func10
243 ; CHECK: cmp
244 ; CHECK-NOT: cmp
245 ; CHECK: blr
246 entry:
247   %cmp = icmp eq i64 %a, 100
248   br i1 %cmp, label %if.then, label %if.else
250 if.then:
251   tail call void @dummy1()
252   br label %if.end3
254 if.else:
255   %cmp1 = icmp ult i64 %a, 100
256   br i1 %cmp1, label %if.then2, label %if.end3
258 if.then2:
259   tail call void @dummy2()
260   br label %if.end3
262 if.end3:
263   ret void
267 define void @func11(i64 %a) {
268 ; CHECK-LABEL: @func11
269 ; CHECK: cmp
270 ; CHECK-NOT: cmp
271 ; CHECK: blr
272 entry:
273   %cmp = icmp ult i64 %a, 100
274   br i1 %cmp, label %if.then, label %if.else
276 if.then:
277   tail call void @dummy1()
278   br label %if.end3
280 if.else:
281   %cmp1 = icmp eq i64 %a, 100
282   br i1 %cmp1, label %if.end3, label %if.then2
284 if.then2:
285   tail call void @dummy2()
286   br label %if.end3
288 if.end3:
289   ret void
293 define void @func12(i64 %a) {
294 ; CHECK-LABEL: @func12
295 ; CHECK: cmp
296 ; CHECK-NOT: cmp
297 ; CHECK: blr
298 entry:
299   %cmp = icmp ugt i64 %a, 100
300   br i1 %cmp, label %if.then, label %if.else
302 if.then:
303   tail call void @dummy1()
304   br label %if.end3
306 if.else:
307   %cmp1 = icmp eq i64 %a, 100
308   br i1 %cmp1, label %if.then2, label %if.end3
310 if.then2:
311   tail call void @dummy2()
312   br label %if.end3
314 if.end3:
315   ret void
319 define void @func13(i32 signext %a, i32 signext %b) {
320 ; CHECK-LABEL: @func13
321 ; CHECK: cmp
322 ; CHECK-NOT: cmp
323 ; CHECK: blr
324 entry:
325   %cmp = icmp eq i32 %a, %b
326   br i1 %cmp, label %if.then, label %if.else
328 if.then:
329   tail call void @dummy1()
330   br label %if.end3
332 if.else:
333   %cmp1 = icmp slt i32 %a, %b
334   br i1 %cmp1, label %if.then2, label %if.end3
336 if.then2:
337   tail call void @dummy2()
338   br label %if.end3
340 if.end3:
341   ret void
345 define void @func14(i32 signext %a, i32 signext %b) {
346 ; CHECK-LABEL: @func14
347 ; CHECK: cmp
348 ; CHECK-NOT: cmp
349 ; CHECK: blr
350 entry:
351   %cmp = icmp slt i32 %a, %b
352   br i1 %cmp, label %if.then, label %if.else
354 if.then:
355   tail call void @dummy1()
356   br label %if.end3
358 if.else:
359   %cmp1 = icmp sgt i32 %a, %b
360   br i1 %cmp1, label %if.then2, label %if.end3
362 if.then2:
363   tail call void @dummy2()
364   br label %if.end3
366 if.end3:
367   ret void
371 define void @func15(i32 signext %a, i32 signext %b) {
372 ; CHECK-LABEL: @func15
373 ; CHECK: cmp
374 ; CHECK-NOT: cmp
375 ; CHECK: blr
376 entry:
377   %cmp = icmp slt i32 %b, %a
378   br i1 %cmp, label %if.then, label %if.else
380 if.then:
381   tail call void @dummy1()
382   br label %if.end3
384 if.else:
385   %cmp1 = icmp eq i32 %a, %b
386   br i1 %cmp1, label %if.then2, label %if.end3
388 if.then2:
389   tail call void @dummy2()
390   br label %if.end3
392 if.end3:
393   ret void
397 define void @func16(i32 zeroext %a, i32 zeroext %b) {
398 ; CHECK-LABEL: @func16
399 ; CHECK: cmp
400 ; CHECK-NOT: cmp
401 ; CHECK: blr
402 entry:
403   %cmp = icmp eq i32 %a, %b
404   br i1 %cmp, label %if.then, label %if.else
406 if.then:
407   tail call void @dummy1()
408   br label %if.end3
410 if.else:
411   %cmp1 = icmp ult i32 %a, %b
412   br i1 %cmp1, label %if.then2, label %if.end3
414 if.then2:
415   tail call void @dummy2()
416   br label %if.end3
418 if.end3:
419   ret void
423 define void @func17(i32 zeroext %a, i32 zeroext %b) {
424 ; CHECK-LABEL: @func17
425 ; CHECK: cmp
426 ; CHECK-NOT: cmp
427 ; CHECK: blr
428 entry:
429   %cmp = icmp ult i32 %a, %b
430   br i1 %cmp, label %if.then, label %if.else
432 if.then:
433   tail call void @dummy1()
434   br label %if.end3
436 if.else:
437   %cmp1 = icmp ugt i32 %a, %b
438   br i1 %cmp1, label %if.then2, label %if.end3
440 if.then2:
441   tail call void @dummy2()
442   br label %if.end3
444 if.end3:
445   ret void
449 define void @func18(i32 zeroext %a, i32 zeroext %b) {
450 ; CHECK-LABEL: @func18
451 ; CHECK: cmp
452 ; CHECK-NOT: cmp
453 ; CHECK: blr
454 entry:
455   %cmp = icmp ult i32 %b, %a
456   br i1 %cmp, label %if.then, label %if.else
458 if.then:
459   tail call void @dummy1()
460   br label %if.end3
462 if.else:
463   %cmp1 = icmp eq i32 %a, %b
464   br i1 %cmp1, label %if.then2, label %if.end3
466 if.then2:
467   tail call void @dummy2()
468   br label %if.end3
470 if.end3:
471   ret void
475 define void @func19(i64 %a, i64 %b) {
476 ; CHECK-LABEL: @func19
477 ; CHECK: cmp
478 ; CHECK-NOT: cmp
479 ; CHECK: blr
480 entry:
481   %cmp = icmp eq i64 %a, %b
482   br i1 %cmp, label %if.then, label %if.else
484 if.then:
485   tail call void @dummy1()
486   br label %if.end3
488 if.else:
489   %cmp1 = icmp slt i64 %a, %b
490   br i1 %cmp1, label %if.then2, label %if.end3
492 if.then2:
493   tail call void @dummy2()
494   br label %if.end3
496 if.end3:
497   ret void
501 define void @func20(i64 %a, i64 %b) {
502 ; CHECK-LABEL: @func20
503 ; CHECK: cmp
504 ; CHECK-NOT: cmp
505 ; CHECK: blr
506 entry:
507   %cmp = icmp slt i64 %a, %b
508   br i1 %cmp, label %if.then, label %if.else
510 if.then:
511   tail call void @dummy1()
512   br label %if.end3
514 if.else:
515   %cmp1 = icmp sgt i64 %a, %b
516   br i1 %cmp1, label %if.then2, label %if.end3
518 if.then2:
519   tail call void @dummy2()
520   br label %if.end3
522 if.end3:
523   ret void
527 define void @func21(i64 %a, i64 %b) {
528 ; CHECK-LABEL: @func21
529 ; CHECK: cmp
530 ; CHECK-NOT: cmp
531 ; CHECK: blr
532 entry:
533   %cmp = icmp slt i64 %b, %a
534   br i1 %cmp, label %if.then, label %if.else
536 if.then:
537   tail call void @dummy1()
538   br label %if.end3
540 if.else:
541   %cmp1 = icmp eq i64 %a, %b
542   br i1 %cmp1, label %if.then2, label %if.end3
544 if.then2:
545   tail call void @dummy2()
546   br label %if.end3
548 if.end3:
549   ret void
553 define void @func22(i64 %a, i64 %b) {
554 ; CHECK-LABEL: @func22
555 ; CHECK: cmp
556 ; CHECK-NOT: cmp
557 ; CHECK: blr
558 entry:
559   %cmp = icmp eq i64 %a, %b
560   br i1 %cmp, label %if.then, label %if.else
562 if.then:
563   tail call void @dummy1()
564   br label %if.end3
566 if.else:
567   %cmp1 = icmp ult i64 %a, %b
568   br i1 %cmp1, label %if.then2, label %if.end3
570 if.then2:
571   tail call void @dummy2()
572   br label %if.end3
574 if.end3:
575   ret void
579 define void @func23(i64 %a, i64 %b) {
580 ; CHECK-LABEL: @func23
581 ; CHECK: cmp
582 ; CHECK-NOT: cmp
583 ; CHECK: blr
584 entry:
585   %cmp = icmp ult i64 %a, %b
586   br i1 %cmp, label %if.then, label %if.else
588 if.then:
589   tail call void @dummy1()
590   br label %if.end3
592 if.else:
593   %cmp1 = icmp ugt i64 %a, %b
594   br i1 %cmp1, label %if.then2, label %if.end3
596 if.then2:
597   tail call void @dummy2()
598   br label %if.end3
600 if.end3:
601   ret void
605 define void @func24(i64 %a, i64 %b) {
606 ; CHECK-LABEL: @func24
607 ; CHECK: cmp
608 ; CHECK-NOT: cmp
609 ; CHECK: blr
610 entry:
611   %cmp = icmp ult i64 %b, %a
612   br i1 %cmp, label %if.then, label %if.else
614 if.then:
615   tail call void @dummy1()
616   br label %if.end3
618 if.else:
619   %cmp1 = icmp eq i64 %a, %b
620   br i1 %cmp1, label %if.then2, label %if.end3
622 if.then2:
623   tail call void @dummy2()
624   br label %if.end3
626 if.end3:
627   ret void
631 define void @func25(i64 %a, i64 %b) {
632 ; CHECK-LABEL: @func25
633 ; CHECK: cmp
634 ; CHECK-NOT: cmp
635 ; CHECK: blr
636 entry:
637   %cmp = icmp slt i64 %b, %a
638   br i1 %cmp, label %if.then, label %if.else, !prof !1
640 if.then:
641   tail call void @dummy1()
642   br label %if.end6
644 if.else:
645   %cmp2 = icmp eq i64 %a, %b
646   br i1 %cmp2, label %if.then4, label %if.else5
648 if.then4:
649   tail call void @dummy2()
650   br label %if.end6
652 if.else5:
653   tail call void @dummy3()
654   br label %if.end6
656 if.end6:
657   ret void
661 define void @func26(i32 signext %a) {
662 ; CHECK-LABEL: @func26
663 ; CHECK: cmp
664 ; CHECK-NOT: cmp
665 ; CHECK: blr
666 entry:
667   %cmp = icmp sgt i32 %a, 0
668   br i1 %cmp, label %if.then, label %if.else, !prof !2
670 if.then:
671   tail call void @dummy1()
672   br label %if.end9
674 if.else:
675   %cmp2 = icmp eq i32 %a, 0
676   br i1 %cmp2, label %if.then7, label %if.else8, !prof !2
678 if.then7:
679   tail call void @dummy2()
680   br label %if.end9
682 if.else8:
683   tail call void @dummy3()
684   br label %if.end9
686 if.end9:
687   ret void
690 @g1 = external local_unnamed_addr global i32, align 4
691 @g2 = external local_unnamed_addr global i32, align 4
693 define void @func27(i32 signext %a) {
694 ; CHECK-LABEL: @func27
695 ; CHECK: cmp
696 ; CHECK: beq
697 ; CHECK-NOT: cmp
698 ; CHECK: bgelr
699 ; CHECK: blr
700 entry:
701   %cmp = icmp eq i32 %a, 0
702   br i1 %cmp, label %if.end3.sink.split, label %if.else
704 if.else:
705   %cmp1 = icmp slt i32 %a, 0
706   br i1 %cmp1, label %if.end3.sink.split, label %if.end
708 if.end3.sink.split:
709   %g2.sink = phi ptr [ @g2, %if.else ], [ @g1, %entry ]
710   store i32 0, ptr %g2.sink, align 4
711   br label %if.end
713 if.end:
714   ret void
717 ; partially redundant case
718 define void @func28(i32 signext %a) {
719 ; CHECK-LABEL: @func28
720 ; 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: cmp
725 ; CHECK: bne     0, .[[LABEL2]]
726 ; CHECK: bl dummy1
727 ; CHECK: b .[[LABEL2]]
728 ; CHECK: .[[LABEL1]]:
729 ; CHECK: blr
730 entry:
731   br label %do.body
733 do.body:
734   %a.addr.0 = phi i32 [ %a, %entry ], [ %call, %if.end ]
735   %cmp = icmp eq i32 %a.addr.0, 0
736   br i1 %cmp, label %if.then, label %if.end
738 if.then:
739   tail call void @dummy1() #2
740   br label %if.end
742 if.end:
743   %call = tail call signext i32 @func(i32 signext %a.addr.0) #2
744   %cmp1 = icmp sgt i32 %call, 0
745   br i1 %cmp1, label %do.body, label %do.end
747 do.end:
748   ret void
751 define 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();
758 ; CHECK-LABEL: @func29
759 ; CHECK: cmp
760 ; CHECK: cmp
761 ; CHECK: blr
762 entry:
763   %cmp = icmp eq i32 %a, -1
764   br i1 %cmp, label %if.then, label %if.else
766 if.then:
767   tail call void @dummy1()
768   br label %if.end3
770 if.else:
771   %cmp1 = icmp eq i32 %a, 65535
772   br i1 %cmp1, label %if.then2, label %if.end3
774 if.then2:
775   tail call void @dummy2()
776   br label %if.end3
778 if.end3:
779   ret void
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:     cmp
785 ; CHECK:       .LBB{{.*}}:
786 ; CHECK:         cmplw
787 ; CHECK:         blt
788 define fastcc zeroext i32 @func_tailrecurse(i32 zeroext %a, i32 zeroext %b) {
789 entry:
790   br label %tailrecurse
792 tailrecurse:                                      ; preds = %tailrecurse, %entry
793   %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.tr
796   %conv = zext i1 %cmp to i32
797   %ignore = call signext i32 (i32) @func(i32 %conv)
798   br i1 %cmp, label %tailrecurse, label %if.end
800 if.end:                                           ; preds = %tailrecurse
801   %sub = sub nsw i32 %a.tr, %b.tr
802   ret i32 %sub
805 declare void @dummy1()
806 declare void @dummy2()
807 declare void @dummy3()
808 declare signext i32 @func(i32 signext)
810 !1 = !{!"branch_weights", i32 2000, i32 1}
811 !2 = !{!"branch_weights", i32 1, i32 2000}