blob: 3251ae2881b93681ba0728b3fb74d0f9f42726ea [file] [log] [blame]
Nemanja Ivanovic0d47d322017-12-15 01:38:03 +00001; XFAIL: *
Hiroshi Inoue614453b2017-09-05 04:15:17 +00002; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu | FileCheck %s
3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s
4
5; Test cases for compare elimination in PPCMIPeephole pass
6
7define void @func1(i32 signext %a) {
8; We should have only one compare instruction
9; CHECK-LABEL: @func1
10; CHECK: cmp
11; CHECK-NOT: cmp
12; CHECK: blr
13entry:
14 %cmp = icmp eq i32 %a, 100
15 br i1 %cmp, label %if.then, label %if.else
16
17if.then:
18 tail call void @dummy1()
19 br label %if.end3
20
21if.else:
22 %cmp1 = icmp slt i32 %a, 100
23 br i1 %cmp1, label %if.then2, label %if.end3
24
25if.then2:
26 tail call void @dummy2()
27 br label %if.end3
28
29if.end3:
30 ret void
31}
32
33
34define void @func2(i32 signext %a) {
35; CHECK-LABEL: @func2
36; CHECK: cmp
37; CHECK-NOT: cmp
38; CHECK: blr
39entry:
40 %cmp = icmp slt i32 %a, 100
41 br i1 %cmp, label %if.then, label %if.else
42
43if.then:
44 tail call void @dummy1()
45 br label %if.end3
46
47if.else:
48 %cmp1 = icmp eq i32 %a, 100
49 br i1 %cmp1, label %if.end3, label %if.then2
50
51if.then2:
52 tail call void @dummy2()
53 br label %if.end3
54
55if.end3:
56 ret void
57}
58
59
60define void @func3(i32 signext %a) {
61; CHECK-LABEL: @func3
62; CHECK: cmp
63; CHECK-NOT: cmp
64; CHECK: blr
65entry:
66 %cmp = icmp sgt i32 %a, 100
67 br i1 %cmp, label %if.then, label %if.else
68
69if.then:
70 tail call void @dummy1()
71 br label %if.end3
72
73if.else:
74 %cmp1 = icmp eq i32 %a, 100
75 br i1 %cmp1, label %if.then2, label %if.end3
76
77if.then2:
78 tail call void @dummy2()
79 br label %if.end3
80
81if.end3:
82 ret void
83}
84
85
86define void @func4(i32 zeroext %a) {
87; CHECK-LABEL: @func4
88; CHECK: cmp
89; CHECK-NOT: cmp
90; CHECK: blr
91entry:
92 %cmp = icmp eq i32 %a, 100
93 br i1 %cmp, label %if.then, label %if.else
94
95if.then:
96 tail call void @dummy1()
97 br label %if.end3
98
99if.else:
100 %cmp1 = icmp ult i32 %a, 100
101 br i1 %cmp1, label %if.then2, label %if.end3
102
103if.then2:
104 tail call void @dummy2()
105 br label %if.end3
106
107if.end3:
108 ret void
109}
110
111
112define void @func5(i32 zeroext %a) {
113; CHECK-LABEL: @func5
114; CHECK: cmp
115; CHECK-NOT: cmp
116; CHECK: blr
117entry:
118 %cmp = icmp ult i32 %a, 100
119 br i1 %cmp, label %if.then, label %if.else
120
121if.then:
122 tail call void @dummy1()
123 br label %if.end3
124
125if.else:
126 %cmp1 = icmp eq i32 %a, 100
127 br i1 %cmp1, label %if.end3, label %if.then2
128
129if.then2:
130 tail call void @dummy2()
131 br label %if.end3
132
133if.end3:
134 ret void
135}
136
137
138define void @func6(i32 zeroext %a) {
139; CHECK-LABEL: @func6
140; CHECK: cmp
141; CHECK-NOT: cmp
142; CHECK: blr
143entry:
144 %cmp = icmp ugt i32 %a, 100
145 br i1 %cmp, label %if.then, label %if.else
146
147if.then:
148 tail call void @dummy1()
149 br label %if.end3
150
151if.else:
152 %cmp1 = icmp eq i32 %a, 100
153 br i1 %cmp1, label %if.then2, label %if.end3
154
155if.then2:
156 tail call void @dummy2()
157 br label %if.end3
158
159if.end3:
160 ret void
161}
162
163
164define void @func7(i64 %a) {
165; CHECK-LABEL: @func7
166; CHECK: cmp
167; CHECK-NOT: cmp
168; CHECK: blr
169entry:
170 %cmp = icmp eq i64 %a, 100
171 br i1 %cmp, label %if.then, label %if.else
172
173if.then:
174 tail call void @dummy1()
175 br label %if.end3
176
177if.else:
178 %cmp1 = icmp slt i64 %a, 100
179 br i1 %cmp1, label %if.then2, label %if.end3
180
181if.then2:
182 tail call void @dummy2()
183 br label %if.end3
184
185if.end3:
186 ret void
187}
188
189
190define void @func8(i64 %a) {
191; CHECK-LABEL: @func8
192; CHECK: cmp
193; CHECK-NOT: cmp
194; CHECK: blr
195entry:
196 %cmp = icmp slt i64 %a, 100
197 br i1 %cmp, label %if.then, label %if.else
198
199if.then:
200 tail call void @dummy1()
201 br label %if.end3
202
203if.else:
204 %cmp1 = icmp eq i64 %a, 100
205 br i1 %cmp1, label %if.end3, label %if.then2
206
207if.then2:
208 tail call void @dummy2()
209 br label %if.end3
210
211if.end3:
212 ret void
213}
214
215
216define void @func9(i64 %a) {
217; CHECK-LABEL: @func9
218; CHECK: cmp
219; CHECK-NOT: cmp
220; CHECK: blr
221entry:
222 %cmp = icmp sgt i64 %a, 100
223 br i1 %cmp, label %if.then, label %if.else
224
225if.then:
226 tail call void @dummy1()
227 br label %if.end3
228
229if.else:
230 %cmp1 = icmp eq i64 %a, 100
231 br i1 %cmp1, label %if.then2, label %if.end3
232
233if.then2:
234 tail call void @dummy2()
235 br label %if.end3
236
237if.end3:
238 ret void
239}
240
241
242define void @func10(i64 %a) {
243; CHECK-LABEL: @func10
244; CHECK: cmp
245; CHECK-NOT: cmp
246; CHECK: blr
247entry:
248 %cmp = icmp eq i64 %a, 100
249 br i1 %cmp, label %if.then, label %if.else
250
251if.then:
252 tail call void @dummy1()
253 br label %if.end3
254
255if.else:
256 %cmp1 = icmp ult i64 %a, 100
257 br i1 %cmp1, label %if.then2, label %if.end3
258
259if.then2:
260 tail call void @dummy2()
261 br label %if.end3
262
263if.end3:
264 ret void
265}
266
267
268define void @func11(i64 %a) {
269; CHECK-LABEL: @func11
270; CHECK: cmp
271; CHECK-NOT: cmp
272; CHECK: blr
273entry:
274 %cmp = icmp ult i64 %a, 100
275 br i1 %cmp, label %if.then, label %if.else
276
277if.then:
278 tail call void @dummy1()
279 br label %if.end3
280
281if.else:
282 %cmp1 = icmp eq i64 %a, 100
283 br i1 %cmp1, label %if.end3, label %if.then2
284
285if.then2:
286 tail call void @dummy2()
287 br label %if.end3
288
289if.end3:
290 ret void
291}
292
293
294define void @func12(i64 %a) {
295; CHECK-LABEL: @func12
296; CHECK: cmp
297; CHECK-NOT: cmp
298; CHECK: blr
299entry:
300 %cmp = icmp ugt i64 %a, 100
301 br i1 %cmp, label %if.then, label %if.else
302
303if.then:
304 tail call void @dummy1()
305 br label %if.end3
306
307if.else:
308 %cmp1 = icmp eq i64 %a, 100
309 br i1 %cmp1, label %if.then2, label %if.end3
310
311if.then2:
312 tail call void @dummy2()
313 br label %if.end3
314
315if.end3:
316 ret void
317}
318
319
320define void @func13(i32 signext %a, i32 signext %b) {
321; CHECK-LABEL: @func13
322; CHECK: cmp
323; CHECK-NOT: cmp
324; CHECK: blr
325entry:
326 %cmp = icmp eq i32 %a, %b
327 br i1 %cmp, label %if.then, label %if.else
328
329if.then:
330 tail call void @dummy1()
331 br label %if.end3
332
333if.else:
334 %cmp1 = icmp slt i32 %a, %b
335 br i1 %cmp1, label %if.then2, label %if.end3
336
337if.then2:
338 tail call void @dummy2()
339 br label %if.end3
340
341if.end3:
342 ret void
343}
344
345
346define void @func14(i32 signext %a, i32 signext %b) {
347; CHECK-LABEL: @func14
348; CHECK: cmp
349; CHECK-NOT: cmp
350; CHECK: blr
351entry:
352 %cmp = icmp slt i32 %a, %b
353 br i1 %cmp, label %if.then, label %if.else
354
355if.then:
356 tail call void @dummy1()
357 br label %if.end3
358
359if.else:
360 %cmp1 = icmp sgt i32 %a, %b
361 br i1 %cmp1, label %if.then2, label %if.end3
362
363if.then2:
364 tail call void @dummy2()
365 br label %if.end3
366
367if.end3:
368 ret void
369}
370
371
372define void @func15(i32 signext %a, i32 signext %b) {
373; CHECK-LABEL: @func15
374; CHECK: cmp
375; CHECK-NOT: cmp
376; CHECK: blr
377entry:
378 %cmp = icmp slt i32 %b, %a
379 br i1 %cmp, label %if.then, label %if.else
380
381if.then:
382 tail call void @dummy1()
383 br label %if.end3
384
385if.else:
386 %cmp1 = icmp eq i32 %a, %b
387 br i1 %cmp1, label %if.then2, label %if.end3
388
389if.then2:
390 tail call void @dummy2()
391 br label %if.end3
392
393if.end3:
394 ret void
395}
396
397
398define void @func16(i32 zeroext %a, i32 zeroext %b) {
399; CHECK-LABEL: @func16
400; CHECK: cmp
401; CHECK-NOT: cmp
402; CHECK: blr
403entry:
404 %cmp = icmp eq i32 %a, %b
405 br i1 %cmp, label %if.then, label %if.else
406
407if.then:
408 tail call void @dummy1()
409 br label %if.end3
410
411if.else:
412 %cmp1 = icmp ult i32 %a, %b
413 br i1 %cmp1, label %if.then2, label %if.end3
414
415if.then2:
416 tail call void @dummy2()
417 br label %if.end3
418
419if.end3:
420 ret void
421}
422
423
424define void @func17(i32 zeroext %a, i32 zeroext %b) {
425; CHECK-LABEL: @func17
426; CHECK: cmp
427; CHECK-NOT: cmp
428; CHECK: blr
429entry:
430 %cmp = icmp ult i32 %a, %b
431 br i1 %cmp, label %if.then, label %if.else
432
433if.then:
434 tail call void @dummy1()
435 br label %if.end3
436
437if.else:
438 %cmp1 = icmp ugt i32 %a, %b
439 br i1 %cmp1, label %if.then2, label %if.end3
440
441if.then2:
442 tail call void @dummy2()
443 br label %if.end3
444
445if.end3:
446 ret void
447}
448
449
450define void @func18(i32 zeroext %a, i32 zeroext %b) {
451; CHECK-LABEL: @func18
452; CHECK: cmp
453; CHECK-NOT: cmp
454; CHECK: blr
455entry:
456 %cmp = icmp ult i32 %b, %a
457 br i1 %cmp, label %if.then, label %if.else
458
459if.then:
460 tail call void @dummy1()
461 br label %if.end3
462
463if.else:
464 %cmp1 = icmp eq i32 %a, %b
465 br i1 %cmp1, label %if.then2, label %if.end3
466
467if.then2:
468 tail call void @dummy2()
469 br label %if.end3
470
471if.end3:
472 ret void
473}
474
475
476define void @func19(i64 %a, i64 %b) {
477; CHECK-LABEL: @func19
478; CHECK: cmp
479; CHECK-NOT: cmp
480; CHECK: blr
481entry:
482 %cmp = icmp eq i64 %a, %b
483 br i1 %cmp, label %if.then, label %if.else
484
485if.then:
486 tail call void @dummy1()
487 br label %if.end3
488
489if.else:
490 %cmp1 = icmp slt i64 %a, %b
491 br i1 %cmp1, label %if.then2, label %if.end3
492
493if.then2:
494 tail call void @dummy2()
495 br label %if.end3
496
497if.end3:
498 ret void
499}
500
501
502define void @func20(i64 %a, i64 %b) {
503; CHECK-LABEL: @func20
504; CHECK: cmp
505; CHECK-NOT: cmp
506; CHECK: blr
507entry:
508 %cmp = icmp slt i64 %a, %b
509 br i1 %cmp, label %if.then, label %if.else
510
511if.then:
512 tail call void @dummy1()
513 br label %if.end3
514
515if.else:
516 %cmp1 = icmp sgt i64 %a, %b
517 br i1 %cmp1, label %if.then2, label %if.end3
518
519if.then2:
520 tail call void @dummy2()
521 br label %if.end3
522
523if.end3:
524 ret void
525}
526
527
528define void @func21(i64 %a, i64 %b) {
529; CHECK-LABEL: @func21
530; CHECK: cmp
531; CHECK-NOT: cmp
532; CHECK: blr
533entry:
534 %cmp = icmp slt i64 %b, %a
535 br i1 %cmp, label %if.then, label %if.else
536
537if.then:
538 tail call void @dummy1()
539 br label %if.end3
540
541if.else:
542 %cmp1 = icmp eq i64 %a, %b
543 br i1 %cmp1, label %if.then2, label %if.end3
544
545if.then2:
546 tail call void @dummy2()
547 br label %if.end3
548
549if.end3:
550 ret void
551}
552
553
554define void @func22(i64 %a, i64 %b) {
555; CHECK-LABEL: @func22
556; CHECK: cmp
557; CHECK-NOT: cmp
558; CHECK: blr
559entry:
560 %cmp = icmp eq i64 %a, %b
561 br i1 %cmp, label %if.then, label %if.else
562
563if.then:
564 tail call void @dummy1()
565 br label %if.end3
566
567if.else:
568 %cmp1 = icmp ult i64 %a, %b
569 br i1 %cmp1, label %if.then2, label %if.end3
570
571if.then2:
572 tail call void @dummy2()
573 br label %if.end3
574
575if.end3:
576 ret void
577}
578
579
580define void @func23(i64 %a, i64 %b) {
581; CHECK-LABEL: @func23
582; CHECK: cmp
583; CHECK-NOT: cmp
584; CHECK: blr
585entry:
586 %cmp = icmp ult i64 %a, %b
587 br i1 %cmp, label %if.then, label %if.else
588
589if.then:
590 tail call void @dummy1()
591 br label %if.end3
592
593if.else:
594 %cmp1 = icmp ugt i64 %a, %b
595 br i1 %cmp1, label %if.then2, label %if.end3
596
597if.then2:
598 tail call void @dummy2()
599 br label %if.end3
600
601if.end3:
602 ret void
603}
604
605
606define void @func24(i64 %a, i64 %b) {
607; CHECK-LABEL: @func24
608; CHECK: cmp
609; CHECK-NOT: cmp
610; CHECK: blr
611entry:
612 %cmp = icmp ult i64 %b, %a
613 br i1 %cmp, label %if.then, label %if.else
614
615if.then:
616 tail call void @dummy1()
617 br label %if.end3
618
619if.else:
620 %cmp1 = icmp eq i64 %a, %b
621 br i1 %cmp1, label %if.then2, label %if.end3
622
623if.then2:
624 tail call void @dummy2()
625 br label %if.end3
626
627if.end3:
628 ret void
629}
630
631
632define void @func25(i64 %a, i64 %b) {
633; CHECK-LABEL: @func25
634; CHECK: cmp
635; CHECK-NOT: cmp
636; CHECK: blr
637entry:
638 %cmp = icmp slt i64 %b, %a
639 br i1 %cmp, label %if.then, label %if.else, !prof !1
640
641if.then:
642 tail call void @dummy1()
643 br label %if.end6
644
645if.else:
646 %cmp2 = icmp eq i64 %a, %b
647 br i1 %cmp2, label %if.then4, label %if.else5
648
649if.then4:
650 tail call void @dummy2()
651 br label %if.end6
652
653if.else5:
654 tail call void @dummy3()
655 br label %if.end6
656
657if.end6:
658 ret void
659}
660
661
662define void @func26(i32 signext %a) {
663; CHECK-LABEL: @func26
664; CHECK: cmp
665; CHECK-NOT: cmp
666; CHECK: blr
667entry:
668 %cmp = icmp sgt i32 %a, 0
669 br i1 %cmp, label %if.then, label %if.else, !prof !2
670
671if.then:
672 tail call void @dummy1()
673 br label %if.end9
674
675if.else:
676 %cmp2 = icmp eq i32 %a, 0
677 br i1 %cmp2, label %if.then7, label %if.else8, !prof !2
678
679if.then7:
680 tail call void @dummy2()
681 br label %if.end9
682
683if.else8:
684 tail call void @dummy3()
685 br label %if.end9
686
687if.end9:
688 ret void
689}
690
691@g1 = external local_unnamed_addr global i32, align 4
692@g2 = external local_unnamed_addr global i32, align 4
693
694define void @func27(i32 signext %a) {
695; CHECK-LABEL: @func27
696; CHECK: cmp
697; CHECK: beq
698; CHECK-NOT: cmp
699; CHECK: bgelr
700; CHECK: blr
701entry:
702 %cmp = icmp eq i32 %a, 0
703 br i1 %cmp, label %if.end3.sink.split, label %if.else
704
705if.else:
706 %cmp1 = icmp slt i32 %a, 0
707 br i1 %cmp1, label %if.end3.sink.split, label %if.end
708
709if.end3.sink.split:
710 %g2.sink = phi i32* [ @g2, %if.else ], [ @g1, %entry ]
711 store i32 0, i32* %g2.sink, align 4
712 br label %if.end
713
714if.end:
715 ret void
716}
717
Hiroshi Inoue79c0bec2017-09-28 08:38:19 +0000718; partially redundant case
719define void @func28(i32 signext %a) {
720; CHECK-LABEL: @func28
721; CHECK: cmplwi [[REG1:[0-9]+]], [[REG2:[0-9]+]]
722; CHECK: .[[LABEL1:[A-Z0-9_]+]]:
723; CHECK-NOT: cmp
724; CHECK: bne 0, .[[LABEL2:[A-Z0-9_]+]]
725; CHECK: bl dummy1
726; CHECK: .[[LABEL2]]:
727; CHECK: cmpwi [[REG1]], [[REG2]]
728; CHECK: bgt 0, .[[LABEL1]]
729; CHECK: blr
730entry:
731 br label %do.body
732
733do.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
737
738if.then:
739 tail call void @dummy1() #2
740 br label %if.end
741
742if.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
746
747do.end:
748 ret void
749}
750
Hiroshi Inoue614453b2017-09-05 04:15:17 +0000751declare void @dummy1()
752declare void @dummy2()
753declare void @dummy3()
Hiroshi Inoue79c0bec2017-09-28 08:38:19 +0000754declare signext i32 @func(i32 signext)
Hiroshi Inoue614453b2017-09-05 04:15:17 +0000755
756!1 = !{!"branch_weights", i32 2000, i32 1}
757!2 = !{!"branch_weights", i32 1, i32 2000}