1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4declare void @use(i1)
5
6define void @test_1_variable_constraint(i8 %x, i8 %y, i8 %z) {
7; CHECK-LABEL: @test_1_variable_constraint(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
10; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
11; CHECK:       bb1:
12; CHECK-NEXT:    [[T_1:%.*]] = icmp uge i8 [[X]], [[Y]]
13; CHECK-NEXT:    call void @use(i1 true)
14; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[X]], 10
15; CHECK-NEXT:    call void @use(i1 [[C_2]])
16; CHECK-NEXT:    [[C_3:%.*]] = icmp uge i8 [[Y]], [[X]]
17; CHECK-NEXT:    call void @use(i1 [[C_3]])
18; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i8 10, [[X]]
19; CHECK-NEXT:    call void @use(i1 [[C_4]])
20; CHECK-NEXT:    ret void
21; CHECK:       bb2:
22; CHECK-NEXT:    [[T_2:%.*]] = icmp uge i8 [[Y]], [[X]]
23; CHECK-NEXT:    call void @use(i1 true)
24; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[X]], [[Y]]
25; CHECK-NEXT:    call void @use(i1 false)
26; CHECK-NEXT:    [[C_5:%.*]] = icmp uge i8 [[X]], 10
27; CHECK-NEXT:    call void @use(i1 [[C_5]])
28; CHECK-NEXT:    [[C_6:%.*]] = icmp uge i8 10, [[X]]
29; CHECK-NEXT:    call void @use(i1 [[C_6]])
30; CHECK-NEXT:    ret void
31;
32entry:
33  %c.1 = icmp uge i8 %x, %y
34  br i1 %c.1, label %bb1, label %bb2
35
36bb1:
37  %t.1 = icmp uge i8 %x, %y
38  call void @use(i1 %t.1)
39  %c.2 = icmp uge i8 %x, 10
40  call void @use(i1 %c.2)
41  %c.3 = icmp uge i8 %y, %x
42  call void @use(i1 %c.3)
43  %c.4 = icmp uge i8 10, %x
44  call void @use(i1 %c.4)
45  ret void
46
47bb2:
48  %t.2 = icmp uge i8 %y, %x
49  call void @use(i1 %t.2)
50  %f.1 = icmp uge i8 %x, %y
51  call void @use(i1 %f.1)
52  %c.5 = icmp uge i8 %x, 10
53  call void @use(i1 %c.5)
54  %c.6 = icmp uge i8 10, %x
55  call void @use(i1 %c.6)
56  ret void
57}
58
59define void @test_1_constant_constraint(i8 %x) {
60; CHECK-LABEL: @test_1_constant_constraint(
61; CHECK-NEXT:  entry:
62; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], 10
63; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
64; CHECK:       bb1:
65; CHECK-NEXT:    [[T_1:%.*]] = icmp uge i8 [[X]], 10
66; CHECK-NEXT:    call void @use(i1 true)
67; CHECK-NEXT:    [[T_2:%.*]] = icmp uge i8 [[X]], 9
68; CHECK-NEXT:    call void @use(i1 true)
69; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[X]], 11
70; CHECK-NEXT:    call void @use(i1 [[C_2]])
71; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i8 10, [[X]]
72; CHECK-NEXT:    call void @use(i1 [[C_4]])
73; CHECK-NEXT:    ret void
74; CHECK:       bb2:
75; CHECK-NEXT:    [[T_3:%.*]] = icmp uge i8 11, [[X]]
76; CHECK-NEXT:    call void @use(i1 true)
77; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[X]], 10
78; CHECK-NEXT:    call void @use(i1 false)
79; CHECK-NEXT:    [[F_1_1:%.*]] = icmp uge i8 [[X]], 10
80; CHECK-NEXT:    call void @use(i1 false)
81; CHECK-NEXT:    [[C_5:%.*]] = icmp uge i8 [[X]], 9
82; CHECK-NEXT:    call void @use(i1 [[C_5]])
83; CHECK-NEXT:    [[C_6:%.*]] = icmp uge i8 1, [[X]]
84; CHECK-NEXT:    call void @use(i1 [[C_6]])
85; CHECK-NEXT:    ret void
86;
87entry:
88  %c.1 = icmp uge i8 %x, 10
89  br i1 %c.1, label %bb1, label %bb2
90
91bb1:
92  %t.1 = icmp uge i8 %x, 10
93  call void @use(i1 %t.1)
94  %t.2 = icmp uge i8 %x, 9
95  call void @use(i1 %t.2)
96  %c.2 = icmp uge i8 %x, 11
97  call void @use(i1 %c.2)
98  %c.4 = icmp uge i8 10, %x
99  call void @use(i1 %c.4)
100  ret void
101
102bb2:
103  %t.3 = icmp uge i8 11, %x
104  call void @use(i1 %t.3)
105  %f.1 = icmp uge i8 %x, 10
106  call void @use(i1 %f.1)
107
108
109  %f.1.1 = icmp uge i8 %x, 10
110  call void @use(i1 %f.1.1)
111  %c.5 = icmp uge i8 %x, 9
112  call void @use(i1 %c.5)
113  %c.6 = icmp uge i8 1, %x
114  call void @use(i1 %c.6)
115  ret void
116}
117
118define i8 @test1(i8 %x, i8 %y, i8 %z) {
119; CHECK-LABEL: @test1(
120; CHECK-NEXT:  entry:
121; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
122; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]]
123; CHECK:       bb1:
124; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[Y]], [[Z:%.*]]
125; CHECK-NEXT:    br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]]
126; CHECK:       bb2:
127; CHECK-NEXT:    [[C_3:%.*]] = icmp uge i8 [[X]], [[Z]]
128; CHECK-NEXT:    br i1 true, label [[BB3:%.*]], label [[EXIT]]
129; CHECK:       bb3:
130; CHECK-NEXT:    ret i8 10
131; CHECK:       exit:
132; CHECK-NEXT:    ret i8 20
133;
134entry:
135  %c.1 = icmp uge i8 %x, %y
136  br i1 %c.1, label %bb1, label %exit
137
138bb1:
139  %c.2 = icmp uge i8 %y, %z
140  br i1 %c.2, label %bb2, label %exit
141
142bb2:
143  %c.3 = icmp uge i8 %x, %z
144  br i1 %c.3, label %bb3, label %exit
145
146bb3:
147  ret i8 10
148
149exit:
150  ret i8 20
151}
152
153
154define i8 @test2(i8 %x, i8 %y, i8 %z, i8 %a) {
155; CHECK-LABEL: @test2(
156; CHECK-NEXT:  entry:
157; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
158; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]]
159; CHECK:       bb1:
160; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[Y]], [[Z:%.*]]
161; CHECK-NEXT:    br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]]
162; CHECK:       bb2:
163; CHECK-NEXT:    [[C_3:%.*]] = icmp uge i8 [[X]], [[A:%.*]]
164; CHECK-NEXT:    br i1 [[C_3]], label [[BB3:%.*]], label [[EXIT]]
165; CHECK:       bb3:
166; CHECK-NEXT:    ret i8 10
167; CHECK:       exit:
168; CHECK-NEXT:    ret i8 20
169;
170entry:
171  %c.1 = icmp uge i8 %x, %y
172  br i1 %c.1, label %bb1, label %exit
173
174bb1:
175  %c.2 = icmp uge i8 %y, %z
176  br i1 %c.2, label %bb2, label %exit
177
178bb2:
179  %c.3 = icmp uge i8 %x, %a
180  br i1 %c.3, label %bb3, label %exit
181
182bb3:
183  ret i8 10
184
185exit:
186  ret i8 20
187}
188
189
190define i8 @test3(i8 %x, i8 %y) {
191; CHECK-LABEL: @test3(
192; CHECK-NEXT:  entry:
193; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], 10
194; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]]
195; CHECK:       bb1:
196; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[Y:%.*]], 20
197; CHECK-NEXT:    br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]]
198; CHECK:       bb2:
199; CHECK-NEXT:    ret i8 10
200; CHECK:       exit:
201; CHECK-NEXT:    ret i8 20
202;
203entry:
204  %c.1 = icmp uge i8 %x, 10
205  br i1 %c.1, label %bb1, label %exit
206
207bb1:
208  %c.2 = icmp uge i8 %y, 20
209  br i1 %c.2, label %bb2, label %exit
210
211bb2:
212  ret i8 10
213
214exit:
215  ret i8 20
216}
217
218define i8 @test4(i8 %x, i8 %y, i8 %z) {
219; CHECK-LABEL: @test4(
220; CHECK-NEXT:  entry:
221; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
222; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[EXIT:%.*]]
223; CHECK:       bb1:
224; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[Y]], [[Z:%.*]]
225; CHECK-NEXT:    br i1 [[C_2]], label [[BB2:%.*]], label [[EXIT]]
226; CHECK:       bb2:
227; CHECK-NEXT:    [[T_1:%.*]] = icmp uge i8 [[X]], [[Z]]
228; CHECK-NEXT:    call void @use(i1 true)
229; CHECK-NEXT:    [[U_1:%.*]] = icmp eq i8 [[X]], [[Z]]
230; CHECK-NEXT:    call void @use(i1 [[U_1]])
231; CHECK-NEXT:    ret i8 10
232; CHECK:       exit:
233; CHECK-NEXT:    ret i8 20
234;
235entry:
236  %c.1 = icmp uge i8 %x, %y
237  br i1 %c.1, label %bb1, label %exit
238
239bb1:
240  %c.2 = icmp uge i8 %y, %z
241  br i1 %c.2, label %bb2, label %exit
242
243bb2:
244  %t.1 = icmp uge i8 %x, %z
245  call void @use(i1 %t.1)
246  %u.1 = icmp eq i8 %x, %z
247  call void @use(i1 %u.1)
248  ret i8 10
249
250
251exit:
252  ret i8 20
253}
254