blob: 33fc016bd3862374bdf18ad959974bd14124cde3 [file] [log] [blame]
Chad Rosier3456cb52016-04-22 17:14:12 +00001; RUN: opt %s -S -simplifycfg | FileCheck %s
2
3declare void @dead()
4declare void @alive()
5declare void @is(i1)
6
7; Test same condition with swapped operands.
8; void test_swapped_ops(unsigned a, unsigned b) {
9; if (a > b) {
10; if (b > a) <- always false
11; dead();
12; alive();
13; }
14; }
15;
16; CHECK-LABEL: @test_swapped_ops
17; CHECK-NOT: call void @dead()
18; CHECK: call void @alive()
19; CHECK: ret
20define void @test_swapped_ops(i32 %a, i32 %b) {
21entry:
22 %cmp = icmp ugt i32 %a, %b
23 br i1 %cmp, label %if.then, label %if.end3
24
25if.then:
26 %cmp1 = icmp ugt i32 %b, %a
27 br i1 %cmp1, label %if.then2, label %if.end
28
29if.then2:
30 call void @dead()
31 br label %if.end
32
33if.end:
34 call void @alive()
35 br label %if.end3
36
37if.end3:
38 ret void
39}
40
41; void test_swapped_pred(unsigned a, unsigned b) {
42; if (a > b) {
43; alive();
44; if (b < a) <- always true; remove branch
45; alive();
46; }
47; }
48;
49; CHECK-LABEL: @test_swapped_pred
50; CHECK: call void @alive()
51; CHECK-NEXT: call void @alive()
52; CHECK: ret
53define void @test_swapped_pred(i32 %a, i32 %b) {
54entry:
55 %cmp = icmp ugt i32 %a, %b
56 br i1 %cmp, label %if.then, label %if.end3
57
58if.then:
59 call void @alive()
60 %cmp1 = icmp ult i32 %b, %a
61 br i1 %cmp1, label %if.then2, label %if.end3
62
63if.then2:
64 call void @alive()
65 br label %if.end3
66
67if.end3:
68 ret void
69}
70
71; A == B implies A == B is true.
72; CHECK-LABEL: @test_eq_eq
73; CHECK: call void @is(i1 true)
74; CHECK-NOT: call void @is(i1 false)
75define void @test_eq_eq(i32 %a, i32 %b) {
76 %cmp1 = icmp eq i32 %a, %b
77 br i1 %cmp1, label %taken, label %untaken
78
79taken:
80 %cmp2 = icmp eq i32 %a, %b
81 br i1 %cmp2, label %eq_eq_istrue, label %eq_eq_isfalse
82
83eq_eq_istrue:
84 call void @is(i1 true)
85 ret void
86
87eq_eq_isfalse:
88 call void @is(i1 false)
89 ret void
90
91untaken:
92 ret void
93}
94
95; A == B implies A != B is false.
96; CHECK-LABEL: @test_eq_ne
97; CHECK-NOT: call void @is(i1 true)
98; CHECK: call void @is(i1 false)
99define void @test_eq_ne(i32 %a, i32 %b) {
100 %cmp1 = icmp eq i32 %a, %b
101 br i1 %cmp1, label %taken, label %untaken
102
103taken:
104 %cmp2 = icmp ne i32 %a, %b
105 br i1 %cmp2, label %eq_ne_istrue, label %eq_ne_isfalse
106
107eq_ne_istrue:
108 call void @is(i1 true)
109 ret void
110
111eq_ne_isfalse:
112 call void @is(i1 false)
113 ret void
114
115untaken:
116 ret void
117}
118
119; A == B implies A >u B is false.
120; CHECK-LABEL: @test_eq_ugt
121; CHECK-NOT: call void @is(i1 true)
122; CHECK: call void @is(i1 false)
123define void @test_eq_ugt(i32 %a, i32 %b) {
124 %cmp1 = icmp eq i32 %a, %b
125 br i1 %cmp1, label %taken, label %untaken
126
127taken:
128 %cmp2 = icmp ugt i32 %a, %b
129 br i1 %cmp2, label %eq_ugt_istrue, label %eq_ugt_isfalse
130
131eq_ugt_istrue:
132 call void @is(i1 true)
133 ret void
134
135eq_ugt_isfalse:
136 call void @is(i1 false)
137 ret void
138
139untaken:
140 ret void
141}
142
Chad Rosier1a601592016-04-22 17:57:34 +0000143; A == B implies A >=u B is true.
Chad Rosier3456cb52016-04-22 17:14:12 +0000144; CHECK-LABEL: @test_eq_uge
145; CHECK: call void @is(i1 true)
Chad Rosier1a601592016-04-22 17:57:34 +0000146; CHECK-NOT: call void @is(i1 false)
Chad Rosier3456cb52016-04-22 17:14:12 +0000147define void @test_eq_uge(i32 %a, i32 %b) {
148 %cmp1 = icmp eq i32 %a, %b
149 br i1 %cmp1, label %taken, label %untaken
150
151taken:
152 %cmp2 = icmp uge i32 %a, %b
153 br i1 %cmp2, label %eq_uge_istrue, label %eq_uge_isfalse
154
155eq_uge_istrue:
156 call void @is(i1 true)
157 ret void
158
159eq_uge_isfalse:
160 call void @is(i1 false)
161 ret void
162
163untaken:
164 ret void
165}
166
167; A == B implies A <u B is false.
168; CHECK-LABEL: @test_eq_ult
169; CHECK-NOT: call void @is(i1 true)
170; CHECK: call void @is(i1 false)
171define void @test_eq_ult(i32 %a, i32 %b) {
172 %cmp1 = icmp eq i32 %a, %b
173 br i1 %cmp1, label %taken, label %untaken
174
175taken:
176 %cmp2 = icmp ult i32 %a, %b
177 br i1 %cmp2, label %eq_ult_istrue, label %eq_ult_isfalse
178
179eq_ult_istrue:
180 call void @is(i1 true)
181 ret void
182
183eq_ult_isfalse:
184 call void @is(i1 false)
185 ret void
186
187untaken:
188 ret void
189}
190
Chad Rosier1a601592016-04-22 17:57:34 +0000191; A == B implies A <=u B is true.
Chad Rosier3456cb52016-04-22 17:14:12 +0000192; CHECK-LABEL: @test_eq_ule
193; CHECK: call void @is(i1 true)
Chad Rosier1a601592016-04-22 17:57:34 +0000194; CHECK-NOT: call void @is(i1 false)
Chad Rosier3456cb52016-04-22 17:14:12 +0000195define void @test_eq_ule(i32 %a, i32 %b) {
196 %cmp1 = icmp eq i32 %a, %b
197 br i1 %cmp1, label %taken, label %untaken
198
199taken:
200 %cmp2 = icmp ule i32 %a, %b
201 br i1 %cmp2, label %eq_ule_istrue, label %eq_ule_isfalse
202
203eq_ule_istrue:
204 call void @is(i1 true)
205 ret void
206
207eq_ule_isfalse:
208 call void @is(i1 false)
209 ret void
210
211untaken:
212 ret void
213}
214
215; A == B implies A >s B is false.
216; CHECK-LABEL: @test_eq_sgt
217; CHECK-NOT: call void @is(i1 true)
218; CHECK: call void @is(i1 false)
219define void @test_eq_sgt(i32 %a, i32 %b) {
220 %cmp1 = icmp eq i32 %a, %b
221 br i1 %cmp1, label %taken, label %untaken
222
223taken:
224 %cmp2 = icmp sgt i32 %a, %b
225 br i1 %cmp2, label %eq_sgt_istrue, label %eq_sgt_isfalse
226
227eq_sgt_istrue:
228 call void @is(i1 true)
229 ret void
230
231eq_sgt_isfalse:
232 call void @is(i1 false)
233 ret void
234
235untaken:
236 ret void
237}
238
Chad Rosier1a601592016-04-22 17:57:34 +0000239; A == B implies A >=s B is true.
Chad Rosier3456cb52016-04-22 17:14:12 +0000240; CHECK-LABEL: @test_eq_sge
241; CHECK: call void @is(i1 true)
Chad Rosier1a601592016-04-22 17:57:34 +0000242; CHECK-NOT: call void @is(i1 false)
Chad Rosier3456cb52016-04-22 17:14:12 +0000243define void @test_eq_sge(i32 %a, i32 %b) {
244 %cmp1 = icmp eq i32 %a, %b
245 br i1 %cmp1, label %taken, label %untaken
246
247taken:
248 %cmp2 = icmp sge i32 %a, %b
249 br i1 %cmp2, label %eq_sge_istrue, label %eq_sge_isfalse
250
251eq_sge_istrue:
252 call void @is(i1 true)
253 ret void
254
255eq_sge_isfalse:
256 call void @is(i1 false)
257 ret void
258
259untaken:
260 ret void
261}
262
263; A == B implies A <s B is false.
264; CHECK-LABEL: @test_eq_slt
265; CHECK-NOT: call void @is(i1 true)
266; CHECK: call void @is(i1 false)
267define void @test_eq_slt(i32 %a, i32 %b) {
268 %cmp1 = icmp eq i32 %a, %b
269 br i1 %cmp1, label %taken, label %untaken
270
271taken:
272 %cmp2 = icmp slt i32 %a, %b
273 br i1 %cmp2, label %eq_slt_istrue, label %eq_slt_isfalse
274
275eq_slt_istrue:
276 call void @is(i1 true)
277 ret void
278
279eq_slt_isfalse:
280 call void @is(i1 false)
281 ret void
282
283untaken:
284 ret void
285}
286
Chad Rosier1a601592016-04-22 17:57:34 +0000287; A == B implies A <=s B is true.
Chad Rosier3456cb52016-04-22 17:14:12 +0000288; CHECK-LABEL: @test_eq_sle
289; CHECK: call void @is(i1 true)
Chad Rosier1a601592016-04-22 17:57:34 +0000290; CHECK-NOT: call void @is(i1 false)
Chad Rosier3456cb52016-04-22 17:14:12 +0000291define void @test_eq_sle(i32 %a, i32 %b) {
292 %cmp1 = icmp eq i32 %a, %b
293 br i1 %cmp1, label %taken, label %untaken
294
295taken:
296 %cmp2 = icmp sle i32 %a, %b
297 br i1 %cmp2, label %eq_sle_istrue, label %eq_sle_isfalse
298
299eq_sle_istrue:
300 call void @is(i1 true)
301 ret void
302
303eq_sle_isfalse:
304 call void @is(i1 false)
305 ret void
306
307untaken:
308 ret void
309}
310
311; A != B implies A != B is true.
312; CHECK-LABEL: @test_ne_ne
313; CHECK: call void @is(i1 true)
314; CHECK-NOT: call void @is(i1 false)
315define void @test_ne_ne(i32 %a, i32 %b) {
316 %cmp1 = icmp ne i32 %a, %b
317 br i1 %cmp1, label %taken, label %untaken
318
319taken:
320 %cmp2 = icmp ne i32 %a, %b
321 br i1 %cmp2, label %ne_ne_istrue, label %ne_ne_isfalse
322
323ne_ne_istrue:
324 call void @is(i1 true)
325 ret void
326
327ne_ne_isfalse:
328 call void @is(i1 false)
329 ret void
330
331untaken:
332 ret void
333}
334
335; A != B implies A >u B is unknown to be true or false.
336; CHECK-LABEL: @test_ne_ugt
337; CHECK: call void @is(i1 true)
338; CHECK: call void @is(i1 false)
339define void @test_ne_ugt(i32 %a, i32 %b) {
340 %cmp1 = icmp ne i32 %a, %b
341 br i1 %cmp1, label %taken, label %untaken
342
343taken:
344 %cmp2 = icmp ugt i32 %a, %b
345 br i1 %cmp2, label %ne_ugt_istrue, label %ne_ugt_isfalse
346
347ne_ugt_istrue:
348 call void @is(i1 true)
349 ret void
350
351ne_ugt_isfalse:
352 call void @is(i1 false)
353 ret void
354
355untaken:
356 ret void
357}
358
359; A != B implies A >=u B is unknown to be true or false.
360; CHECK-LABEL: @test_ne_uge
361; CHECK: call void @is(i1 true)
362; CHECK: call void @is(i1 false)
363define void @test_ne_uge(i32 %a, i32 %b) {
364 %cmp1 = icmp ne i32 %a, %b
365 br i1 %cmp1, label %taken, label %untaken
366
367taken:
368 %cmp2 = icmp uge i32 %a, %b
369 br i1 %cmp2, label %ne_uge_istrue, label %ne_uge_isfalse
370
371ne_uge_istrue:
372 call void @is(i1 true)
373 ret void
374
375ne_uge_isfalse:
376 call void @is(i1 false)
377 ret void
378
379untaken:
380 ret void
381}
382
383; A != B implies A <u B is unknown to be true or false.
384; CHECK-LABEL: @test_ne_ult
385; CHECK: call void @is(i1 true)
386; CHECK: call void @is(i1 false)
387define void @test_ne_ult(i32 %a, i32 %b) {
388 %cmp1 = icmp ne i32 %a, %b
389 br i1 %cmp1, label %taken, label %untaken
390
391taken:
392 %cmp2 = icmp ult i32 %a, %b
393 br i1 %cmp2, label %ne_ult_istrue, label %ne_ult_isfalse
394
395ne_ult_istrue:
396 call void @is(i1 true)
397 ret void
398
399ne_ult_isfalse:
400 call void @is(i1 false)
401 ret void
402
403untaken:
404 ret void
405}
406
407; A != B implies A <=u B is unknown to be true or false.
408; CHECK-LABEL: @test_ne_ule
409; CHECK: call void @is(i1 true)
410; CHECK: call void @is(i1 false)
411define void @test_ne_ule(i32 %a, i32 %b) {
412 %cmp1 = icmp ne i32 %a, %b
413 br i1 %cmp1, label %taken, label %untaken
414
415taken:
416 %cmp2 = icmp ule i32 %a, %b
417 br i1 %cmp2, label %ne_ule_istrue, label %ne_ule_isfalse
418
419ne_ule_istrue:
420 call void @is(i1 true)
421 ret void
422
423ne_ule_isfalse:
424 call void @is(i1 false)
425 ret void
426
427untaken:
428 ret void
429}
430
431; A != B implies A >s B is unknown to be true or false.
432; CHECK-LABEL: @test_ne_sgt
433; CHECK: call void @is(i1 true)
434; CHECK: call void @is(i1 false)
435define void @test_ne_sgt(i32 %a, i32 %b) {
436 %cmp1 = icmp ne i32 %a, %b
437 br i1 %cmp1, label %taken, label %untaken
438
439taken:
440 %cmp2 = icmp sgt i32 %a, %b
441 br i1 %cmp2, label %ne_sgt_istrue, label %ne_sgt_isfalse
442
443ne_sgt_istrue:
444 call void @is(i1 true)
445 ret void
446
447ne_sgt_isfalse:
448 call void @is(i1 false)
449 ret void
450
451untaken:
452 ret void
453}
454
455; A != B implies A >=s B is unknown to be true or false.
456; CHECK-LABEL: @test_ne_sge
457; CHECK: call void @is(i1 true)
458; CHECK: call void @is(i1 false)
459define void @test_ne_sge(i32 %a, i32 %b) {
460 %cmp1 = icmp ne i32 %a, %b
461 br i1 %cmp1, label %taken, label %untaken
462
463taken:
464 %cmp2 = icmp sge i32 %a, %b
465 br i1 %cmp2, label %ne_sge_istrue, label %ne_sge_isfalse
466
467ne_sge_istrue:
468 call void @is(i1 true)
469 ret void
470
471ne_sge_isfalse:
472 call void @is(i1 false)
473 ret void
474
475untaken:
476 ret void
477}
478
479; A != B implies A <s B is unknown to be true or false.
480; CHECK-LABEL: @test_ne_slt
481; CHECK: call void @is(i1 true)
482; CHECK: call void @is(i1 false)
483define void @test_ne_slt(i32 %a, i32 %b) {
484 %cmp1 = icmp ne i32 %a, %b
485 br i1 %cmp1, label %taken, label %untaken
486
487taken:
488 %cmp2 = icmp slt i32 %a, %b
489 br i1 %cmp2, label %ne_slt_istrue, label %ne_slt_isfalse
490
491ne_slt_istrue:
492 call void @is(i1 true)
493 ret void
494
495ne_slt_isfalse:
496 call void @is(i1 false)
497 ret void
498
499untaken:
500 ret void
501}
502
503; A != B implies A <=s B is unknown to be true or false.
504; CHECK-LABEL: @test_ne_sle
505; CHECK: call void @is(i1 true)
506; CHECK: call void @is(i1 false)
507define void @test_ne_sle(i32 %a, i32 %b) {
508 %cmp1 = icmp ne i32 %a, %b
509 br i1 %cmp1, label %taken, label %untaken
510
511taken:
512 %cmp2 = icmp sle i32 %a, %b
513 br i1 %cmp2, label %ne_sle_istrue, label %ne_sle_isfalse
514
515ne_sle_istrue:
516 call void @is(i1 true)
517 ret void
518
519ne_sle_isfalse:
520 call void @is(i1 false)
521 ret void
522
523untaken:
524 ret void
525}
526
527; A >u B implies A >u B is true.
528; CHECK-LABEL: @test_ugt_ugt
529; CHECK: call void @is(i1 true)
530; CHECK-NOT: call void @is(i1 false)
531define void @test_ugt_ugt(i32 %a, i32 %b) {
532 %cmp1 = icmp ugt i32 %a, %b
533 br i1 %cmp1, label %taken, label %untaken
534
535taken:
536 %cmp2 = icmp ugt i32 %a, %b
537 br i1 %cmp2, label %ugt_ugt_istrue, label %ugt_ugt_isfalse
538
539ugt_ugt_istrue:
540 call void @is(i1 true)
541 ret void
542
543ugt_ugt_isfalse:
544 call void @is(i1 false)
545 ret void
546
547untaken:
548 ret void
549}
550
551; A >u B implies A >=u B is true.
552; CHECK-LABEL: @test_ugt_uge
553; CHECK: call void @is(i1 true)
554; CHECK-NOT: call void @is(i1 false)
555define void @test_ugt_uge(i32 %a, i32 %b) {
556 %cmp1 = icmp ugt i32 %a, %b
557 br i1 %cmp1, label %taken, label %untaken
558
559taken:
560 %cmp2 = icmp uge i32 %a, %b
561 br i1 %cmp2, label %ugt_uge_istrue, label %ugt_uge_isfalse
562
563ugt_uge_istrue:
564 call void @is(i1 true)
565 ret void
566
567ugt_uge_isfalse:
568 call void @is(i1 false)
569 ret void
570
571untaken:
572 ret void
573}
574
575; A >u B implies A <u B is false.
576; CHECK-LABEL: @test_ugt_ult
577; CHECK-NOT: call void @is(i1 true)
578; CHECK: call void @is(i1 false)
579define void @test_ugt_ult(i32 %a, i32 %b) {
580 %cmp1 = icmp ugt i32 %a, %b
581 br i1 %cmp1, label %taken, label %untaken
582
583taken:
584 %cmp2 = icmp ult i32 %a, %b
585 br i1 %cmp2, label %ugt_ult_istrue, label %ugt_ult_isfalse
586
587ugt_ult_istrue:
588 call void @is(i1 true)
589 ret void
590
591ugt_ult_isfalse:
592 call void @is(i1 false)
593 ret void
594
595untaken:
596 ret void
597}
598
599; A >u B implies A <=u B is false.
600; CHECK-LABEL: @test_ugt_ule
601; CHECK-NOT: call void @is(i1 true)
602; CHECK: call void @is(i1 false)
603define void @test_ugt_ule(i32 %a, i32 %b) {
604 %cmp1 = icmp ugt i32 %a, %b
605 br i1 %cmp1, label %taken, label %untaken
606
607taken:
608 %cmp2 = icmp ule i32 %a, %b
609 br i1 %cmp2, label %ugt_ule_istrue, label %ugt_ule_isfalse
610
611ugt_ule_istrue:
612 call void @is(i1 true)
613 ret void
614
615ugt_ule_isfalse:
616 call void @is(i1 false)
617 ret void
618
619untaken:
620 ret void
621}
622
623; A >=u B implies A >=u B is true.
624; CHECK-LABEL: @test_uge_uge
625; CHECK: call void @is(i1 true)
626; CHECK-NOT: call void @is(i1 false)
627define void @test_uge_uge(i32 %a, i32 %b) {
628 %cmp1 = icmp uge i32 %a, %b
629 br i1 %cmp1, label %taken, label %untaken
630
631taken:
632 %cmp2 = icmp uge i32 %a, %b
633 br i1 %cmp2, label %uge_uge_istrue, label %uge_uge_isfalse
634
635uge_uge_istrue:
636 call void @is(i1 true)
637 ret void
638
639uge_uge_isfalse:
640 call void @is(i1 false)
641 ret void
642
643untaken:
644 ret void
645}
646
647; A >=u B implies A <u B is false.
648; CHECK-LABEL: @test_uge_ult
649; CHECK-NOT: call void @is(i1 true)
650; CHECK: call void @is(i1 false)
651define void @test_uge_ult(i32 %a, i32 %b) {
652 %cmp1 = icmp uge i32 %a, %b
653 br i1 %cmp1, label %taken, label %untaken
654
655taken:
656 %cmp2 = icmp ult i32 %a, %b
657 br i1 %cmp2, label %uge_ult_istrue, label %uge_ult_isfalse
658
659uge_ult_istrue:
660 call void @is(i1 true)
661 ret void
662
663uge_ult_isfalse:
664 call void @is(i1 false)
665 ret void
666
667untaken:
668 ret void
669}
670
671; A >=u B implies A <=u B is unknown to be true or false.
672; CHECK-LABEL: @test_uge_ule
673; CHECK: call void @is(i1 true)
674; CHECK: call void @is(i1 false)
675define void @test_uge_ule(i32 %a, i32 %b) {
676 %cmp1 = icmp uge i32 %a, %b
677 br i1 %cmp1, label %taken, label %untaken
678
679taken:
680 %cmp2 = icmp ule i32 %a, %b
681 br i1 %cmp2, label %uge_ule_istrue, label %uge_ule_isfalse
682
683uge_ule_istrue:
684 call void @is(i1 true)
685 ret void
686
687uge_ule_isfalse:
688 call void @is(i1 false)
689 ret void
690
691untaken:
692 ret void
693}
694
695; A <u B implies A <u B is true.
696; CHECK-LABEL: @test_ult_ult
697; CHECK: call void @is(i1 true)
698; CHECK-NOT: call void @is(i1 false)
699define void @test_ult_ult(i32 %a, i32 %b) {
700 %cmp1 = icmp ult i32 %a, %b
701 br i1 %cmp1, label %taken, label %untaken
702
703taken:
704 %cmp2 = icmp ult i32 %a, %b
705 br i1 %cmp2, label %ult_ult_istrue, label %ult_ult_isfalse
706
707ult_ult_istrue:
708 call void @is(i1 true)
709 ret void
710
711ult_ult_isfalse:
712 call void @is(i1 false)
713 ret void
714
715untaken:
716 ret void
717}
718
719; A <u B implies A <=u B is true.
720; CHECK-LABEL: @test_ult_ule
721; CHECK: call void @is(i1 true)
722; CHECK-NOT: call void @is(i1 false)
723define void @test_ult_ule(i32 %a, i32 %b) {
724 %cmp1 = icmp ult i32 %a, %b
725 br i1 %cmp1, label %taken, label %untaken
726
727taken:
728 %cmp2 = icmp ule i32 %a, %b
729 br i1 %cmp2, label %ult_ule_istrue, label %ult_ule_isfalse
730
731ult_ule_istrue:
732 call void @is(i1 true)
733 ret void
734
735ult_ule_isfalse:
736 call void @is(i1 false)
737 ret void
738
739untaken:
740 ret void
741}
742
743; A <=u B implies A <=u B is true.
744; CHECK-LABEL: @test_ule_ule
745; CHECK: call void @is(i1 true)
746; CHECK-NOT: call void @is(i1 false)
747define void @test_ule_ule(i32 %a, i32 %b) {
748 %cmp1 = icmp ule i32 %a, %b
749 br i1 %cmp1, label %taken, label %untaken
750
751taken:
752 %cmp2 = icmp ule i32 %a, %b
753 br i1 %cmp2, label %ule_ule_istrue, label %ule_ule_isfalse
754
755ule_ule_istrue:
756 call void @is(i1 true)
757 ret void
758
759ule_ule_isfalse:
760 call void @is(i1 false)
761 ret void
762
763untaken:
764 ret void
765}
766
767; A >s B implies A >s B is true.
768; CHECK-LABEL: @test_sgt_sgt
769; CHECK: call void @is(i1 true)
770; CHECK-NOT: call void @is(i1 false)
771define void @test_sgt_sgt(i32 %a, i32 %b) {
772 %cmp1 = icmp sgt i32 %a, %b
773 br i1 %cmp1, label %taken, label %untaken
774
775taken:
776 %cmp2 = icmp sgt i32 %a, %b
777 br i1 %cmp2, label %sgt_sgt_istrue, label %sgt_sgt_isfalse
778
779sgt_sgt_istrue:
780 call void @is(i1 true)
781 ret void
782
783sgt_sgt_isfalse:
784 call void @is(i1 false)
785 ret void
786
787untaken:
788 ret void
789}
790
791; A >s B implies A >=s B is true.
792; CHECK-LABEL: @test_sgt_sge
793; CHECK: call void @is(i1 true)
794; CHECK-NOT: call void @is(i1 false)
795define void @test_sgt_sge(i32 %a, i32 %b) {
796 %cmp1 = icmp sgt i32 %a, %b
797 br i1 %cmp1, label %taken, label %untaken
798
799taken:
800 %cmp2 = icmp sge i32 %a, %b
801 br i1 %cmp2, label %sgt_sge_istrue, label %sgt_sge_isfalse
802
803sgt_sge_istrue:
804 call void @is(i1 true)
805 ret void
806
807sgt_sge_isfalse:
808 call void @is(i1 false)
809 ret void
810
811untaken:
812 ret void
813}
814
815; A >s B implies A <s B is false.
816; CHECK-LABEL: @test_sgt_slt
817; CHECK-NOT: call void @is(i1 true)
818; CHECK: call void @is(i1 false)
819define void @test_sgt_slt(i32 %a, i32 %b) {
820 %cmp1 = icmp sgt i32 %a, %b
821 br i1 %cmp1, label %taken, label %untaken
822
823taken:
824 %cmp2 = icmp slt i32 %a, %b
825 br i1 %cmp2, label %sgt_slt_istrue, label %sgt_slt_isfalse
826
827sgt_slt_istrue:
828 call void @is(i1 true)
829 ret void
830
831sgt_slt_isfalse:
832 call void @is(i1 false)
833 ret void
834
835untaken:
836 ret void
837}
838
839; A >s B implies A <=s B is false.
840; CHECK-LABEL: @test_sgt_sle
841; CHECK-NOT: call void @is(i1 true)
842; CHECK: call void @is(i1 false)
843define void @test_sgt_sle(i32 %a, i32 %b) {
844 %cmp1 = icmp sgt i32 %a, %b
845 br i1 %cmp1, label %taken, label %untaken
846
847taken:
848 %cmp2 = icmp sle i32 %a, %b
849 br i1 %cmp2, label %sgt_sle_istrue, label %sgt_sle_isfalse
850
851sgt_sle_istrue:
852 call void @is(i1 true)
853 ret void
854
855sgt_sle_isfalse:
856 call void @is(i1 false)
857 ret void
858
859untaken:
860 ret void
861}
862
863; A >=s B implies A >=s B is true.
864; CHECK-LABEL: @test_sge_sge
865; CHECK: call void @is(i1 true)
866; CHECK-NOT: call void @is(i1 false)
867define void @test_sge_sge(i32 %a, i32 %b) {
868 %cmp1 = icmp sge i32 %a, %b
869 br i1 %cmp1, label %taken, label %untaken
870
871taken:
872 %cmp2 = icmp sge i32 %a, %b
873 br i1 %cmp2, label %sge_sge_istrue, label %sge_sge_isfalse
874
875sge_sge_istrue:
876 call void @is(i1 true)
877 ret void
878
879sge_sge_isfalse:
880 call void @is(i1 false)
881 ret void
882
883untaken:
884 ret void
885}
886
887; A >=s B implies A <s B is false.
888; CHECK-LABEL: @test_sge_slt
889; CHECK-NOT: call void @is(i1 true)
890; CHECK: call void @is(i1 false)
891define void @test_sge_slt(i32 %a, i32 %b) {
892 %cmp1 = icmp sge i32 %a, %b
893 br i1 %cmp1, label %taken, label %untaken
894
895taken:
896 %cmp2 = icmp slt i32 %a, %b
897 br i1 %cmp2, label %sge_slt_istrue, label %sge_slt_isfalse
898
899sge_slt_istrue:
900 call void @is(i1 true)
901 ret void
902
903sge_slt_isfalse:
904 call void @is(i1 false)
905 ret void
906
907untaken:
908 ret void
909}
910
911; A >=s B implies A <=s B is unknown to be true or false.
912; CHECK-LABEL: @test_sge_sle
913; CHECK: call void @is(i1 true)
914; CHECK: call void @is(i1 false)
915define void @test_sge_sle(i32 %a, i32 %b) {
916 %cmp1 = icmp sge i32 %a, %b
917 br i1 %cmp1, label %taken, label %untaken
918
919taken:
920 %cmp2 = icmp sle i32 %a, %b
921 br i1 %cmp2, label %sge_sle_istrue, label %sge_sle_isfalse
922
923sge_sle_istrue:
924 call void @is(i1 true)
925 ret void
926
927sge_sle_isfalse:
928 call void @is(i1 false)
929 ret void
930
931untaken:
932 ret void
933}
934
935; A <s B implies A <s B is true.
936; CHECK-LABEL: @test_slt_slt
937; CHECK: call void @is(i1 true)
938; CHECK-NOT: call void @is(i1 false)
939define void @test_slt_slt(i32 %a, i32 %b) {
940 %cmp1 = icmp slt i32 %a, %b
941 br i1 %cmp1, label %taken, label %untaken
942
943taken:
944 %cmp2 = icmp slt i32 %a, %b
945 br i1 %cmp2, label %slt_slt_istrue, label %slt_slt_isfalse
946
947slt_slt_istrue:
948 call void @is(i1 true)
949 ret void
950
951slt_slt_isfalse:
952 call void @is(i1 false)
953 ret void
954
955untaken:
956 ret void
957}
958
959; A <s B implies A <=s B is true.
960; CHECK-LABEL: @test_slt_sle
961; CHECK: call void @is(i1 true)
962; CHECK-NOT: call void @is(i1 false)
963define void @test_slt_sle(i32 %a, i32 %b) {
964 %cmp1 = icmp slt i32 %a, %b
965 br i1 %cmp1, label %taken, label %untaken
966
967taken:
968 %cmp2 = icmp sle i32 %a, %b
969 br i1 %cmp2, label %slt_sle_istrue, label %slt_sle_isfalse
970
971slt_sle_istrue:
972 call void @is(i1 true)
973 ret void
974
975slt_sle_isfalse:
976 call void @is(i1 false)
977 ret void
978
979untaken:
980 ret void
981}
982
983; A <=s B implies A <=s B is true.
984; CHECK-LABEL: @test_sle_sle
985; CHECK: call void @is(i1 true)
986; CHECK-NOT: call void @is(i1 false)
987define void @test_sle_sle(i32 %a, i32 %b) {
988 %cmp1 = icmp sle i32 %a, %b
989 br i1 %cmp1, label %taken, label %untaken
990
991taken:
992 %cmp2 = icmp sle i32 %a, %b
993 br i1 %cmp2, label %sle_sle_istrue, label %sle_sle_isfalse
994
995sle_sle_istrue:
996 call void @is(i1 true)
997 ret void
998
999sle_sle_isfalse:
1000 call void @is(i1 false)
1001 ret void
1002
1003untaken:
1004 ret void
1005}
Chad Rosier4c4e3332016-04-25 17:41:48 +00001006
1007; A >=u 5 implies A <u 5 is false.
1008; CHECK-LABEL: @test_uge_ult_const
1009; CHECK-NOT: call void @is(i1 true)
1010; CHECK: call void @is(i1 false)
1011define void @test_uge_ult_const(i32 %a, i32 %b) {
Chad Rosierbbabc852016-04-25 18:20:27 +00001012 %cmp1 = icmp uge i32 %a, 5
Chad Rosier4c4e3332016-04-25 17:41:48 +00001013 br i1 %cmp1, label %taken, label %untaken
1014
1015taken:
Chad Rosierbbabc852016-04-25 18:20:27 +00001016 %cmp2 = icmp ult i32 %a, 5
Chad Rosier4c4e3332016-04-25 17:41:48 +00001017 br i1 %cmp2, label %istrue, label %isfalse
1018
1019istrue:
1020 call void @is(i1 true)
1021 ret void
1022
1023isfalse:
1024 call void @is(i1 false)
1025 ret void
1026
1027untaken:
1028 ret void
1029}