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