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