2 ; RUN: opt < %s -simplifycfg -dce -S | FileCheck %s
4 ; Test that when == is true, all 6 comparisons evaluate to true or false
5 ; ie, a == b implies a > b is false, but a >= b is true, and so on
6 define void @testEqTrue(i32 %a, i32 %b) {
8 ; CHECK: icmp eq i32 %a, %b
9 ; CHECK: call void @_Z1gi(i32 0)
10 ; a == b implies a == b
11 ; CHECK-NEXT: call void @_Z1gi(i32 1)
12 ; a == b implies a >= b
13 ; CHECK-NEXT: call void @_Z1gi(i32 3)
14 ; a == b implies a <= b
15 ; CHECK-NEXT: call void @_Z1gi(i32 4)
18 %cmp = icmp eq i32 %a, %b
19 br i1 %cmp, label %if.then, label %if.end18
21 if.then: ; preds = %entry
22 call void @_Z1gi(i32 0)
23 %cmp1 = icmp eq i32 %a, %b
24 br i1 %cmp1, label %if.then2, label %if.end
26 if.then2: ; preds = %if.then
27 call void @_Z1gi(i32 1)
30 if.end: ; preds = %if.then2, %if.then
31 %cmp3 = icmp ne i32 %a, %b
32 br i1 %cmp3, label %if.then4, label %if.end5
34 if.then4: ; preds = %if.end
35 call void @_Z1gi(i32 2)
38 if.end5: ; preds = %if.then4, %if.end
39 %cmp6 = icmp sge i32 %a, %b
40 br i1 %cmp6, label %if.then7, label %if.end8
42 if.then7: ; preds = %if.end5
43 call void @_Z1gi(i32 3)
46 if.end8: ; preds = %if.then7, %if.end5
47 %cmp9 = icmp sle i32 %a, %b
48 br i1 %cmp9, label %if.then10, label %if.end11
50 if.then10: ; preds = %if.end8
51 call void @_Z1gi(i32 4)
54 if.end11: ; preds = %if.then10, %if.end8
55 %cmp12 = icmp sgt i32 %a, %b
56 br i1 %cmp12, label %if.then13, label %if.end14
58 if.then13: ; preds = %if.end11
59 call void @_Z1gi(i32 5)
62 if.end14: ; preds = %if.then13, %if.end11
63 %cmp15 = icmp slt i32 %a, %b
64 br i1 %cmp15, label %if.then16, label %if.end18
66 if.then16: ; preds = %if.end14
67 call void @_Z1gi(i32 6)
70 if.end18: ; preds = %if.end14, %if.then16, %entry
74 ; Test that when == is false, all 6 comparisons evaluate to true or false
75 ; ie, a == b implies a > b is false, but a >= b is true, and so on
76 define void @testEqFalse(i32 %a, i32 %b) {
78 ; CHECK: icmp eq i32 %a, %b
79 ; CHECK: call void @_Z1gi(i32 0)
80 ; CHECK-NOT: call void @_Z1gi(i32 1)
82 ; CHECK: call void @_Z1gi(i32 2)
84 ; CHECK: call void @_Z1gi(i32 3)
86 ; CHECK: call void @_Z1gi(i32 4)
88 ; CHECK: call void @_Z1gi(i32 5)
90 ; CHECK: call void @_Z1gi(i32 6)
93 %cmp = icmp eq i32 %a, %b
94 br i1 %cmp, label %if.then, label %if.else
96 if.then: ; preds = %entry
97 call void @_Z1gi(i32 0)
101 %cmp1 = icmp eq i32 %a, %b
102 br i1 %cmp1, label %if.then2, label %if.end
104 if.then2: ; preds = %if.then
105 call void @_Z1gi(i32 1)
108 if.end: ; preds = %if.then2, %if.then
109 %cmp3 = icmp ne i32 %a, %b
110 br i1 %cmp3, label %if.then4, label %if.end5
112 if.then4: ; preds = %if.end
113 call void @_Z1gi(i32 2)
116 if.end5: ; preds = %if.then4, %if.end
117 %cmp6 = icmp sge i32 %a, %b
118 br i1 %cmp6, label %if.then7, label %if.end8
120 if.then7: ; preds = %if.end5
121 call void @_Z1gi(i32 3)
124 if.end8: ; preds = %if.then7, %if.end5
125 %cmp9 = icmp sle i32 %a, %b
126 br i1 %cmp9, label %if.then10, label %if.end11
128 if.then10: ; preds = %if.end8
129 call void @_Z1gi(i32 4)
132 if.end11: ; preds = %if.then10, %if.end8
133 %cmp12 = icmp sgt i32 %a, %b
134 br i1 %cmp12, label %if.then13, label %if.end14
136 if.then13: ; preds = %if.end11
137 call void @_Z1gi(i32 5)
140 if.end14: ; preds = %if.then13, %if.end11
141 %cmp15 = icmp slt i32 %a, %b
142 br i1 %cmp15, label %if.then16, label %if.end18
144 if.then16: ; preds = %if.end14
145 call void @_Z1gi(i32 6)
148 if.end18: ; preds = %if.end14, %if.then16, %entry
152 declare void @_Z1gi(i32)