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