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