Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / implied-cond-matching.ll
blob4cdef29a04cba9fdaafb421a4bc69e36740f893d
1 ; RUN: opt %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s
3 declare void @dead()
4 declare void @alive()
5 declare void @is(i1)
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 ; }
16 ; CHECK-LABEL: @test_swapped_ops
17 ; CHECK-NOT: call void @dead()
18 ; CHECK: call void @alive()
19 ; CHECK: ret
20 define void @test_swapped_ops(i32 %a, i32 %b) {
21 entry:
22   %cmp = icmp ugt i32 %a, %b
23   br i1 %cmp, label %if.then, label %if.end3
25 if.then:
26   %cmp1 = icmp ugt i32 %b, %a
27   br i1 %cmp1, label %if.then2, label %if.end
29 if.then2:
30   call void @dead()
31   br label %if.end
33 if.end:
34   call void @alive()
35   br label %if.end3
37 if.end3:
38   ret void
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 ; }
49 ; CHECK-LABEL: @test_swapped_pred
50 ; CHECK: call void @alive()
51 ; CHECK-NEXT: call void @alive()
52 ; CHECK: ret
53 define void @test_swapped_pred(i32 %a, i32 %b) {
54 entry:
55   %cmp = icmp ugt i32 %a, %b
56   br i1 %cmp, label %if.then, label %if.end3
58 if.then:
59   call void @alive()
60   %cmp1 = icmp ult i32 %b, %a
61   br i1 %cmp1, label %if.then2, label %if.end3
63 if.then2:
64   call void @alive()
65   br label %if.end3
67 if.end3:
68   ret void
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)
75 define void @test_eq_eq(i32 %a, i32 %b) {
76   %cmp1 = icmp eq i32 %a, %b
77   br i1 %cmp1, label %taken, label %untaken
79 taken:
80   %cmp2 = icmp eq i32 %a, %b
81   br i1 %cmp2, label %eq_eq_istrue, label %eq_eq_isfalse
83 eq_eq_istrue:
84   call void @is(i1 true)
85   ret void
87 eq_eq_isfalse:
88   call void @is(i1 false)
89   ret void
91 untaken:
92   ret void
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)
99 define void @test_eq_ne(i32 %a, i32 %b) {
100   %cmp1 = icmp eq i32 %a, %b
101   br i1 %cmp1, label %taken, label %untaken
103 taken:
104   %cmp2 = icmp ne i32 %a, %b
105   br i1 %cmp2, label %eq_ne_istrue, label %eq_ne_isfalse
107 eq_ne_istrue:
108   call void @is(i1 true)
109   ret void
111 eq_ne_isfalse:
112   call void @is(i1 false)
113   ret void
115 untaken:
116   ret void
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)
123 define void @test_eq_ugt(i32 %a, i32 %b) {
124   %cmp1 = icmp eq i32 %a, %b
125   br i1 %cmp1, label %taken, label %untaken
127 taken:
128   %cmp2 = icmp ugt i32 %a, %b
129   br i1 %cmp2, label %eq_ugt_istrue, label %eq_ugt_isfalse
131 eq_ugt_istrue:
132   call void @is(i1 true)
133   ret void
135 eq_ugt_isfalse:
136   call void @is(i1 false)
137   ret void
139 untaken:
140   ret void
143 ; A == B implies A >=u B is true.
144 ; CHECK-LABEL: @test_eq_uge
145 ; CHECK: call void @is(i1 true)
146 ; CHECK-NOT: call void @is(i1 false)
147 define void @test_eq_uge(i32 %a, i32 %b) {
148   %cmp1 = icmp eq i32 %a, %b
149   br i1 %cmp1, label %taken, label %untaken
151 taken:
152   %cmp2 = icmp uge i32 %a, %b
153   br i1 %cmp2, label %eq_uge_istrue, label %eq_uge_isfalse
155 eq_uge_istrue:
156   call void @is(i1 true)
157   ret void
159 eq_uge_isfalse:
160   call void @is(i1 false)
161   ret void
163 untaken:
164   ret void
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)
171 define void @test_eq_ult(i32 %a, i32 %b) {
172   %cmp1 = icmp eq i32 %a, %b
173   br i1 %cmp1, label %taken, label %untaken
175 taken:
176   %cmp2 = icmp ult i32 %a, %b
177   br i1 %cmp2, label %eq_ult_istrue, label %eq_ult_isfalse
179 eq_ult_istrue:
180   call void @is(i1 true)
181   ret void
183 eq_ult_isfalse:
184   call void @is(i1 false)
185   ret void
187 untaken:
188   ret void
191 ; A == B implies A <=u B is true.
192 ; CHECK-LABEL: @test_eq_ule
193 ; CHECK: call void @is(i1 true)
194 ; CHECK-NOT: call void @is(i1 false)
195 define void @test_eq_ule(i32 %a, i32 %b) {
196   %cmp1 = icmp eq i32 %a, %b
197   br i1 %cmp1, label %taken, label %untaken
199 taken:
200   %cmp2 = icmp ule i32 %a, %b
201   br i1 %cmp2, label %eq_ule_istrue, label %eq_ule_isfalse
203 eq_ule_istrue:
204   call void @is(i1 true)
205   ret void
207 eq_ule_isfalse:
208   call void @is(i1 false)
209   ret void
211 untaken:
212   ret void
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)
219 define void @test_eq_sgt(i32 %a, i32 %b) {
220   %cmp1 = icmp eq i32 %a, %b
221   br i1 %cmp1, label %taken, label %untaken
223 taken:
224   %cmp2 = icmp sgt i32 %a, %b
225   br i1 %cmp2, label %eq_sgt_istrue, label %eq_sgt_isfalse
227 eq_sgt_istrue:
228   call void @is(i1 true)
229   ret void
231 eq_sgt_isfalse:
232   call void @is(i1 false)
233   ret void
235 untaken:
236   ret void
239 ; A == B implies A >=s B is true.
240 ; CHECK-LABEL: @test_eq_sge
241 ; CHECK: call void @is(i1 true)
242 ; CHECK-NOT: call void @is(i1 false)
243 define void @test_eq_sge(i32 %a, i32 %b) {
244   %cmp1 = icmp eq i32 %a, %b
245   br i1 %cmp1, label %taken, label %untaken
247 taken:
248   %cmp2 = icmp sge i32 %a, %b
249   br i1 %cmp2, label %eq_sge_istrue, label %eq_sge_isfalse
251 eq_sge_istrue:
252   call void @is(i1 true)
253   ret void
255 eq_sge_isfalse:
256   call void @is(i1 false)
257   ret void
259 untaken:
260   ret void
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)
267 define void @test_eq_slt(i32 %a, i32 %b) {
268   %cmp1 = icmp eq i32 %a, %b
269   br i1 %cmp1, label %taken, label %untaken
271 taken:
272   %cmp2 = icmp slt i32 %a, %b
273   br i1 %cmp2, label %eq_slt_istrue, label %eq_slt_isfalse
275 eq_slt_istrue:
276   call void @is(i1 true)
277   ret void
279 eq_slt_isfalse:
280   call void @is(i1 false)
281   ret void
283 untaken:
284   ret void
287 ; A == B implies A <=s B is true.
288 ; CHECK-LABEL: @test_eq_sle
289 ; CHECK: call void @is(i1 true)
290 ; CHECK-NOT: call void @is(i1 false)
291 define void @test_eq_sle(i32 %a, i32 %b) {
292   %cmp1 = icmp eq i32 %a, %b
293   br i1 %cmp1, label %taken, label %untaken
295 taken:
296   %cmp2 = icmp sle i32 %a, %b
297   br i1 %cmp2, label %eq_sle_istrue, label %eq_sle_isfalse
299 eq_sle_istrue:
300   call void @is(i1 true)
301   ret void
303 eq_sle_isfalse:
304   call void @is(i1 false)
305   ret void
307 untaken:
308   ret void
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)
315 define void @test_ne_ne(i32 %a, i32 %b) {
316   %cmp1 = icmp ne i32 %a, %b
317   br i1 %cmp1, label %taken, label %untaken
319 taken:
320   %cmp2 = icmp ne i32 %a, %b
321   br i1 %cmp2, label %ne_ne_istrue, label %ne_ne_isfalse
323 ne_ne_istrue:
324   call void @is(i1 true)
325   ret void
327 ne_ne_isfalse:
328   call void @is(i1 false)
329   ret void
331 untaken:
332   ret void
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)
339 define void @test_ne_ugt(i32 %a, i32 %b) {
340   %cmp1 = icmp ne i32 %a, %b
341   br i1 %cmp1, label %taken, label %untaken
343 taken:
344   %cmp2 = icmp ugt i32 %a, %b
345   br i1 %cmp2, label %ne_ugt_istrue, label %ne_ugt_isfalse
347 ne_ugt_istrue:
348   call void @is(i1 true)
349   ret void
351 ne_ugt_isfalse:
352   call void @is(i1 false)
353   ret void
355 untaken:
356   ret void
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)
363 define void @test_ne_uge(i32 %a, i32 %b) {
364   %cmp1 = icmp ne i32 %a, %b
365   br i1 %cmp1, label %taken, label %untaken
367 taken:
368   %cmp2 = icmp uge i32 %a, %b
369   br i1 %cmp2, label %ne_uge_istrue, label %ne_uge_isfalse
371 ne_uge_istrue:
372   call void @is(i1 true)
373   ret void
375 ne_uge_isfalse:
376   call void @is(i1 false)
377   ret void
379 untaken:
380   ret void
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)
387 define void @test_ne_ult(i32 %a, i32 %b) {
388   %cmp1 = icmp ne i32 %a, %b
389   br i1 %cmp1, label %taken, label %untaken
391 taken:
392   %cmp2 = icmp ult i32 %a, %b
393   br i1 %cmp2, label %ne_ult_istrue, label %ne_ult_isfalse
395 ne_ult_istrue:
396   call void @is(i1 true)
397   ret void
399 ne_ult_isfalse:
400   call void @is(i1 false)
401   ret void
403 untaken:
404   ret void
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)
411 define void @test_ne_ule(i32 %a, i32 %b) {
412   %cmp1 = icmp ne i32 %a, %b
413   br i1 %cmp1, label %taken, label %untaken
415 taken:
416   %cmp2 = icmp ule i32 %a, %b
417   br i1 %cmp2, label %ne_ule_istrue, label %ne_ule_isfalse
419 ne_ule_istrue:
420   call void @is(i1 true)
421   ret void
423 ne_ule_isfalse:
424   call void @is(i1 false)
425   ret void
427 untaken:
428   ret void
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)
435 define void @test_ne_sgt(i32 %a, i32 %b) {
436   %cmp1 = icmp ne i32 %a, %b
437   br i1 %cmp1, label %taken, label %untaken
439 taken:
440   %cmp2 = icmp sgt i32 %a, %b
441   br i1 %cmp2, label %ne_sgt_istrue, label %ne_sgt_isfalse
443 ne_sgt_istrue:
444   call void @is(i1 true)
445   ret void
447 ne_sgt_isfalse:
448   call void @is(i1 false)
449   ret void
451 untaken:
452   ret void
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)
459 define void @test_ne_sge(i32 %a, i32 %b) {
460   %cmp1 = icmp ne i32 %a, %b
461   br i1 %cmp1, label %taken, label %untaken
463 taken:
464   %cmp2 = icmp sge i32 %a, %b
465   br i1 %cmp2, label %ne_sge_istrue, label %ne_sge_isfalse
467 ne_sge_istrue:
468   call void @is(i1 true)
469   ret void
471 ne_sge_isfalse:
472   call void @is(i1 false)
473   ret void
475 untaken:
476   ret void
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)
483 define void @test_ne_slt(i32 %a, i32 %b) {
484   %cmp1 = icmp ne i32 %a, %b
485   br i1 %cmp1, label %taken, label %untaken
487 taken:
488   %cmp2 = icmp slt i32 %a, %b
489   br i1 %cmp2, label %ne_slt_istrue, label %ne_slt_isfalse
491 ne_slt_istrue:
492   call void @is(i1 true)
493   ret void
495 ne_slt_isfalse:
496   call void @is(i1 false)
497   ret void
499 untaken:
500   ret void
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)
507 define void @test_ne_sle(i32 %a, i32 %b) {
508   %cmp1 = icmp ne i32 %a, %b
509   br i1 %cmp1, label %taken, label %untaken
511 taken:
512   %cmp2 = icmp sle i32 %a, %b
513   br i1 %cmp2, label %ne_sle_istrue, label %ne_sle_isfalse
515 ne_sle_istrue:
516   call void @is(i1 true)
517   ret void
519 ne_sle_isfalse:
520   call void @is(i1 false)
521   ret void
523 untaken:
524   ret void
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)
531 define void @test_ugt_ugt(i32 %a, i32 %b) {
532   %cmp1 = icmp ugt i32 %a, %b
533   br i1 %cmp1, label %taken, label %untaken
535 taken:
536   %cmp2 = icmp ugt i32 %a, %b
537   br i1 %cmp2, label %ugt_ugt_istrue, label %ugt_ugt_isfalse
539 ugt_ugt_istrue:
540   call void @is(i1 true)
541   ret void
543 ugt_ugt_isfalse:
544   call void @is(i1 false)
545   ret void
547 untaken:
548   ret void
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)
555 define void @test_ugt_uge(i32 %a, i32 %b) {
556   %cmp1 = icmp ugt i32 %a, %b
557   br i1 %cmp1, label %taken, label %untaken
559 taken:
560   %cmp2 = icmp uge i32 %a, %b
561   br i1 %cmp2, label %ugt_uge_istrue, label %ugt_uge_isfalse
563 ugt_uge_istrue:
564   call void @is(i1 true)
565   ret void
567 ugt_uge_isfalse:
568   call void @is(i1 false)
569   ret void
571 untaken:
572   ret void
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)
579 define void @test_ugt_ult(i32 %a, i32 %b) {
580   %cmp1 = icmp ugt i32 %a, %b
581   br i1 %cmp1, label %taken, label %untaken
583 taken:
584   %cmp2 = icmp ult i32 %a, %b
585   br i1 %cmp2, label %ugt_ult_istrue, label %ugt_ult_isfalse
587 ugt_ult_istrue:
588   call void @is(i1 true)
589   ret void
591 ugt_ult_isfalse:
592   call void @is(i1 false)
593   ret void
595 untaken:
596   ret void
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)
603 define void @test_ugt_ule(i32 %a, i32 %b) {
604   %cmp1 = icmp ugt i32 %a, %b
605   br i1 %cmp1, label %taken, label %untaken
607 taken:
608   %cmp2 = icmp ule i32 %a, %b
609   br i1 %cmp2, label %ugt_ule_istrue, label %ugt_ule_isfalse
611 ugt_ule_istrue:
612   call void @is(i1 true)
613   ret void
615 ugt_ule_isfalse:
616   call void @is(i1 false)
617   ret void
619 untaken:
620   ret void
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)
627 define void @test_uge_uge(i32 %a, i32 %b) {
628   %cmp1 = icmp uge i32 %a, %b
629   br i1 %cmp1, label %taken, label %untaken
631 taken:
632   %cmp2 = icmp uge i32 %a, %b
633   br i1 %cmp2, label %uge_uge_istrue, label %uge_uge_isfalse
635 uge_uge_istrue:
636   call void @is(i1 true)
637   ret void
639 uge_uge_isfalse:
640   call void @is(i1 false)
641   ret void
643 untaken:
644   ret void
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)
651 define void @test_uge_ult(i32 %a, i32 %b) {
652   %cmp1 = icmp uge i32 %a, %b
653   br i1 %cmp1, label %taken, label %untaken
655 taken:
656   %cmp2 = icmp ult i32 %a, %b
657   br i1 %cmp2, label %uge_ult_istrue, label %uge_ult_isfalse
659 uge_ult_istrue:
660   call void @is(i1 true)
661   ret void
663 uge_ult_isfalse:
664   call void @is(i1 false)
665   ret void
667 untaken:
668   ret void
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)
675 define void @test_uge_ule(i32 %a, i32 %b) {
676   %cmp1 = icmp uge i32 %a, %b
677   br i1 %cmp1, label %taken, label %untaken
679 taken:
680   %cmp2 = icmp ule i32 %a, %b
681   br i1 %cmp2, label %uge_ule_istrue, label %uge_ule_isfalse
683 uge_ule_istrue:
684   call void @is(i1 true)
685   ret void
687 uge_ule_isfalse:
688   call void @is(i1 false)
689   ret void
691 untaken:
692   ret void
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)
699 define void @test_ult_ult(i32 %a, i32 %b) {
700   %cmp1 = icmp ult i32 %a, %b
701   br i1 %cmp1, label %taken, label %untaken
703 taken:
704   %cmp2 = icmp ult i32 %a, %b
705   br i1 %cmp2, label %ult_ult_istrue, label %ult_ult_isfalse
707 ult_ult_istrue:
708   call void @is(i1 true)
709   ret void
711 ult_ult_isfalse:
712   call void @is(i1 false)
713   ret void
715 untaken:
716   ret void
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)
723 define void @test_ult_ule(i32 %a, i32 %b) {
724   %cmp1 = icmp ult i32 %a, %b
725   br i1 %cmp1, label %taken, label %untaken
727 taken:
728   %cmp2 = icmp ule i32 %a, %b
729   br i1 %cmp2, label %ult_ule_istrue, label %ult_ule_isfalse
731 ult_ule_istrue:
732   call void @is(i1 true)
733   ret void
735 ult_ule_isfalse:
736   call void @is(i1 false)
737   ret void
739 untaken:
740   ret void
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)
747 define void @test_ule_ule(i32 %a, i32 %b) {
748   %cmp1 = icmp ule i32 %a, %b
749   br i1 %cmp1, label %taken, label %untaken
751 taken:
752   %cmp2 = icmp ule i32 %a, %b
753   br i1 %cmp2, label %ule_ule_istrue, label %ule_ule_isfalse
755 ule_ule_istrue:
756   call void @is(i1 true)
757   ret void
759 ule_ule_isfalse:
760   call void @is(i1 false)
761   ret void
763 untaken:
764   ret void
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)
771 define void @test_sgt_sgt(i32 %a, i32 %b) {
772   %cmp1 = icmp sgt i32 %a, %b
773   br i1 %cmp1, label %taken, label %untaken
775 taken:
776   %cmp2 = icmp sgt i32 %a, %b
777   br i1 %cmp2, label %sgt_sgt_istrue, label %sgt_sgt_isfalse
779 sgt_sgt_istrue:
780   call void @is(i1 true)
781   ret void
783 sgt_sgt_isfalse:
784   call void @is(i1 false)
785   ret void
787 untaken:
788   ret void
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)
795 define void @test_sgt_sge(i32 %a, i32 %b) {
796   %cmp1 = icmp sgt i32 %a, %b
797   br i1 %cmp1, label %taken, label %untaken
799 taken:
800   %cmp2 = icmp sge i32 %a, %b
801   br i1 %cmp2, label %sgt_sge_istrue, label %sgt_sge_isfalse
803 sgt_sge_istrue:
804   call void @is(i1 true)
805   ret void
807 sgt_sge_isfalse:
808   call void @is(i1 false)
809   ret void
811 untaken:
812   ret void
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)
819 define void @test_sgt_slt(i32 %a, i32 %b) {
820   %cmp1 = icmp sgt i32 %a, %b
821   br i1 %cmp1, label %taken, label %untaken
823 taken:
824   %cmp2 = icmp slt i32 %a, %b
825   br i1 %cmp2, label %sgt_slt_istrue, label %sgt_slt_isfalse
827 sgt_slt_istrue:
828   call void @is(i1 true)
829   ret void
831 sgt_slt_isfalse:
832   call void @is(i1 false)
833   ret void
835 untaken:
836   ret void
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)
843 define void @test_sgt_sle(i32 %a, i32 %b) {
844   %cmp1 = icmp sgt i32 %a, %b
845   br i1 %cmp1, label %taken, label %untaken
847 taken:
848   %cmp2 = icmp sle i32 %a, %b
849   br i1 %cmp2, label %sgt_sle_istrue, label %sgt_sle_isfalse
851 sgt_sle_istrue:
852   call void @is(i1 true)
853   ret void
855 sgt_sle_isfalse:
856   call void @is(i1 false)
857   ret void
859 untaken:
860   ret void
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)
867 define void @test_sge_sge(i32 %a, i32 %b) {
868   %cmp1 = icmp sge i32 %a, %b
869   br i1 %cmp1, label %taken, label %untaken
871 taken:
872   %cmp2 = icmp sge i32 %a, %b
873   br i1 %cmp2, label %sge_sge_istrue, label %sge_sge_isfalse
875 sge_sge_istrue:
876   call void @is(i1 true)
877   ret void
879 sge_sge_isfalse:
880   call void @is(i1 false)
881   ret void
883 untaken:
884   ret void
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)
891 define void @test_sge_slt(i32 %a, i32 %b) {
892   %cmp1 = icmp sge i32 %a, %b
893   br i1 %cmp1, label %taken, label %untaken
895 taken:
896   %cmp2 = icmp slt i32 %a, %b
897   br i1 %cmp2, label %sge_slt_istrue, label %sge_slt_isfalse
899 sge_slt_istrue:
900   call void @is(i1 true)
901   ret void
903 sge_slt_isfalse:
904   call void @is(i1 false)
905   ret void
907 untaken:
908   ret void
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)
915 define void @test_sge_sle(i32 %a, i32 %b) {
916   %cmp1 = icmp sge i32 %a, %b
917   br i1 %cmp1, label %taken, label %untaken
919 taken:
920   %cmp2 = icmp sle i32 %a, %b
921   br i1 %cmp2, label %sge_sle_istrue, label %sge_sle_isfalse
923 sge_sle_istrue:
924   call void @is(i1 true)
925   ret void
927 sge_sle_isfalse:
928   call void @is(i1 false)
929   ret void
931 untaken:
932   ret void
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)
939 define void @test_slt_slt(i32 %a, i32 %b) {
940   %cmp1 = icmp slt i32 %a, %b
941   br i1 %cmp1, label %taken, label %untaken
943 taken:
944   %cmp2 = icmp slt i32 %a, %b
945   br i1 %cmp2, label %slt_slt_istrue, label %slt_slt_isfalse
947 slt_slt_istrue:
948   call void @is(i1 true)
949   ret void
951 slt_slt_isfalse:
952   call void @is(i1 false)
953   ret void
955 untaken:
956   ret void
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)
963 define void @test_slt_sle(i32 %a, i32 %b) {
964   %cmp1 = icmp slt i32 %a, %b
965   br i1 %cmp1, label %taken, label %untaken
967 taken:
968   %cmp2 = icmp sle i32 %a, %b
969   br i1 %cmp2, label %slt_sle_istrue, label %slt_sle_isfalse
971 slt_sle_istrue:
972   call void @is(i1 true)
973   ret void
975 slt_sle_isfalse:
976   call void @is(i1 false)
977   ret void
979 untaken:
980   ret void
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)
987 define void @test_sle_sle(i32 %a, i32 %b) {
988   %cmp1 = icmp sle i32 %a, %b
989   br i1 %cmp1, label %taken, label %untaken
991 taken:
992   %cmp2 = icmp sle i32 %a, %b
993   br i1 %cmp2, label %sle_sle_istrue, label %sle_sle_isfalse
995 sle_sle_istrue:
996   call void @is(i1 true)
997   ret void
999 sle_sle_isfalse:
1000   call void @is(i1 false)
1001   ret void
1003 untaken:
1004   ret void
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)
1011 define void @test_uge_ult_const(i32 %a, i32 %b) {
1012   %cmp1 = icmp uge i32 %a, 5
1013   br i1 %cmp1, label %taken, label %untaken
1015 taken:
1016   %cmp2 = icmp ult i32 %a, 5
1017   br i1 %cmp2, label %istrue, label %isfalse
1019 istrue:
1020   call void @is(i1 true)
1021   ret void
1023 isfalse:
1024   call void @is(i1 false)
1025   ret void
1027 untaken:
1028   ret void