173
|
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
2 ; RUN: opt -S -codegenprepare < %s | FileCheck %s
|
|
3
|
|
4 target triple = "x86_64-unknown-linux-gnu"
|
|
5
|
|
6 define void @f1(i32 %a) {
|
|
7 ; CHECK-LABEL: @f1(
|
|
8 ; CHECK-NEXT: [[FR:%.*]] = freeze i32 [[A:%.*]]
|
|
9 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[FR]], 0
|
|
10 ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
11 ; CHECK: A:
|
|
12 ; CHECK-NEXT: call void @g1()
|
|
13 ; CHECK-NEXT: ret void
|
|
14 ; CHECK: B:
|
|
15 ; CHECK-NEXT: call void @g2()
|
|
16 ; CHECK-NEXT: ret void
|
|
17 ;
|
|
18 %c = icmp eq i32 %a, 0
|
|
19 %fr = freeze i1 %c
|
|
20 br i1 %fr, label %A, label %B
|
|
21 A:
|
|
22 call void @g1()
|
|
23 ret void
|
|
24 B:
|
|
25 call void @g2()
|
|
26 ret void
|
|
27 }
|
|
28
|
|
29 define void @f2(i32 %a) {
|
|
30 ; CHECK-LABEL: @f2(
|
|
31 ; CHECK-NEXT: [[FR:%.*]] = freeze i32 [[A:%.*]]
|
|
32 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 0, [[FR]]
|
|
33 ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
34 ; CHECK: A:
|
|
35 ; CHECK-NEXT: call void @g1()
|
|
36 ; CHECK-NEXT: ret void
|
|
37 ; CHECK: B:
|
|
38 ; CHECK-NEXT: call void @g2()
|
|
39 ; CHECK-NEXT: ret void
|
|
40 ;
|
|
41 %c = icmp eq i32 0, %a
|
|
42 %fr = freeze i1 %c
|
|
43 br i1 %fr, label %A, label %B
|
|
44 A:
|
|
45 call void @g1()
|
|
46 ret void
|
|
47 B:
|
|
48 call void @g2()
|
|
49 ret void
|
|
50 }
|
|
51
|
|
52 define void @f3(i32 %a) {
|
|
53 ; CHECK-LABEL: @f3(
|
|
54 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 0, 1
|
|
55 ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
56 ; CHECK: A:
|
|
57 ; CHECK-NEXT: call void @g1()
|
|
58 ; CHECK-NEXT: ret void
|
|
59 ; CHECK: B:
|
|
60 ; CHECK-NEXT: call void @g2()
|
|
61 ; CHECK-NEXT: ret void
|
|
62 ;
|
|
63 %c = icmp eq i32 0, 1
|
|
64 %fr = freeze i1 %c
|
|
65 br i1 %fr, label %A, label %B
|
|
66 A:
|
|
67 call void @g1()
|
|
68 ret void
|
|
69 B:
|
|
70 call void @g2()
|
|
71 ret void
|
|
72 }
|
|
73
|
|
74 define i1 @ptrcmp(i8* %p) {
|
|
75 ; CHECK-LABEL: @ptrcmp(
|
|
76 ; CHECK-NEXT: [[FR:%.*]] = freeze i8* [[P:%.*]]
|
|
77 ; CHECK-NEXT: [[C:%.*]] = icmp eq i8* [[FR]], null
|
|
78 ; CHECK-NEXT: ret i1 [[C]]
|
|
79 ;
|
|
80 %c = icmp eq i8* %p, null
|
|
81 %fr = freeze i1 %c
|
|
82 ret i1 %fr
|
|
83 }
|
|
84
|
|
85
|
|
86 define i1 @fcmp(float %a) {
|
|
87 ; CHECK-LABEL: @fcmp(
|
|
88 ; CHECK-NEXT: [[FR:%.*]] = freeze float [[A:%.*]]
|
|
89 ; CHECK-NEXT: [[C:%.*]] = fcmp oeq float [[FR]], 0.000000e+00
|
|
90 ; CHECK-NEXT: ret i1 [[C]]
|
|
91 ;
|
|
92 %c = fcmp oeq float %a, 0.0
|
|
93 %fr = freeze i1 %c
|
|
94 ret i1 %fr
|
|
95 }
|
|
96
|
|
97 define i1 @fcmp_nan(float %a) {
|
|
98 ; CHECK-LABEL: @fcmp_nan(
|
|
99 ; CHECK-NEXT: [[C:%.*]] = fcmp nnan oeq float [[A:%.*]], 0.000000e+00
|
|
100 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[C]]
|
|
101 ; CHECK-NEXT: ret i1 [[FR]]
|
|
102 ;
|
|
103 %c = fcmp nnan oeq float %a, 0.0
|
|
104 %fr = freeze i1 %c
|
|
105 ret i1 %fr
|
|
106 }
|
|
107
|
|
108 define void @and_bitmask(i32 %flag) {
|
|
109 ; CHECK-LABEL: @and_bitmask(
|
|
110 ; CHECK-NEXT: [[V:%.*]] = and i32 [[FLAG:%.*]], 1
|
|
111 ; CHECK-NEXT: [[FR:%.*]] = freeze i32 [[V]]
|
|
112 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[FR]], 0
|
|
113 ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
114 ; CHECK: A:
|
|
115 ; CHECK-NEXT: call void @g1()
|
|
116 ; CHECK-NEXT: ret void
|
|
117 ; CHECK: B:
|
|
118 ; CHECK-NEXT: call void @g2()
|
|
119 ; CHECK-NEXT: ret void
|
|
120 ;
|
|
121 %v = and i32 %flag, 1
|
|
122 %c = icmp eq i32 %v, 0
|
|
123 %fr = freeze i1 %c
|
|
124 br i1 %fr, label %A, label %B
|
|
125 A:
|
|
126 call void @g1()
|
|
127 ret void
|
|
128 B:
|
|
129 call void @g2()
|
|
130 ret void
|
|
131 }
|
|
132
|
|
133 define void @and_bitmask_r(i32 %flag) {
|
|
134 ; CHECK-LABEL: @and_bitmask_r(
|
|
135 ; CHECK-NEXT: [[V:%.*]] = and i32 1, [[FLAG:%.*]]
|
|
136 ; CHECK-NEXT: [[FR:%.*]] = freeze i32 [[V]]
|
|
137 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 0, [[FR]]
|
|
138 ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
|
|
139 ; CHECK: A:
|
|
140 ; CHECK-NEXT: call void @g1()
|
|
141 ; CHECK-NEXT: ret void
|
|
142 ; CHECK: B:
|
|
143 ; CHECK-NEXT: call void @g2()
|
|
144 ; CHECK-NEXT: ret void
|
|
145 ;
|
|
146 %v = and i32 1, %flag
|
|
147 %c = icmp eq i32 0, %v
|
|
148 %fr = freeze i1 %c
|
|
149 br i1 %fr, label %A, label %B
|
|
150 A:
|
|
151 call void @g1()
|
|
152 ret void
|
|
153 B:
|
|
154 call void @g2()
|
|
155 ret void
|
|
156 }
|
|
157
|
|
158 define void @and_bitmask2(i32 %flag, i32 %flag2) {
|
|
159 ; CHECK-LABEL: @and_bitmask2(
|
|
160 ; CHECK-NEXT: [[V:%.*]] = and i32 [[FLAG:%.*]], 1
|
|
161 ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[V]], 0
|
|
162 ; CHECK-NEXT: [[V2:%.*]] = and i32 [[FLAG2:%.*]], 2
|
|
163 ; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[V2]], 0
|
|
164 ; CHECK-NEXT: [[COND:%.*]] = or i1 [[C]], [[C2]]
|
|
165 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[COND]]
|
|
166 ; CHECK-NEXT: br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
|
|
167 ; CHECK: A:
|
|
168 ; CHECK-NEXT: call void @g1()
|
|
169 ; CHECK-NEXT: ret void
|
|
170 ; CHECK: B:
|
|
171 ; CHECK-NEXT: call void @g2()
|
|
172 ; CHECK-NEXT: ret void
|
|
173 ;
|
|
174 %v = and i32 %flag, 1
|
|
175 %c = icmp eq i32 %v, 0
|
|
176 %v2 = and i32 %flag2, 2
|
|
177 %c2 = icmp eq i32 %v2, 0
|
|
178 %cond = or i1 %c, %c2
|
|
179 %fr = freeze i1 %cond
|
|
180 br i1 %fr, label %A, label %B
|
|
181 A:
|
|
182 call void @g1()
|
|
183 ret void
|
|
184 B:
|
|
185 call void @g2()
|
|
186 ret void
|
|
187 }
|
|
188
|
|
189 define void @and(i1 %a, i1 %b, i1 %c) {
|
|
190 ; CHECK-LABEL: @and(
|
|
191 ; CHECK-NEXT: [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
|
|
192 ; CHECK-NEXT: [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
|
|
193 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[COND2]]
|
|
194 ; CHECK-NEXT: br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
|
|
195 ; CHECK: A:
|
|
196 ; CHECK-NEXT: call void @g1()
|
|
197 ; CHECK-NEXT: ret void
|
|
198 ; CHECK: B:
|
|
199 ; CHECK-NEXT: call void @g2()
|
|
200 ; CHECK-NEXT: ret void
|
|
201 ;
|
|
202 %cond = and i1 %a, %b
|
|
203 %cond2 = and i1 %c, %cond
|
|
204 %fr = freeze i1 %cond2
|
|
205 br i1 %fr, label %A, label %B
|
|
206 A:
|
|
207 call void @g1()
|
|
208 ret void
|
|
209 B:
|
|
210 call void @g2()
|
|
211 ret void
|
|
212 }
|
|
213
|
|
214 define void @and_long(i1 %a, i1 %b, i1 %c, i1 %d, i1 %e, i1 %f, i1 %g) {
|
|
215 ; CHECK-LABEL: @and_long(
|
|
216 ; CHECK-NEXT: [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
|
|
217 ; CHECK-NEXT: [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
|
|
218 ; CHECK-NEXT: [[COND3:%.*]] = and i1 [[D:%.*]], [[COND2]]
|
|
219 ; CHECK-NEXT: [[COND4:%.*]] = and i1 [[E:%.*]], [[COND3]]
|
|
220 ; CHECK-NEXT: [[COND5:%.*]] = and i1 [[F:%.*]], [[COND4]]
|
|
221 ; CHECK-NEXT: [[COND6:%.*]] = and i1 [[G:%.*]], [[COND5]]
|
|
222 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[COND6]]
|
|
223 ; CHECK-NEXT: br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
|
|
224 ; CHECK: A:
|
|
225 ; CHECK-NEXT: call void @g1()
|
|
226 ; CHECK-NEXT: ret void
|
|
227 ; CHECK: B:
|
|
228 ; CHECK-NEXT: call void @g2()
|
|
229 ; CHECK-NEXT: ret void
|
|
230 ;
|
|
231 %cond = and i1 %a, %b
|
|
232 %cond2 = and i1 %c, %cond
|
|
233 %cond3 = and i1 %d, %cond2
|
|
234 %cond4 = and i1 %e, %cond3
|
|
235 %cond5 = and i1 %f, %cond4
|
|
236 %cond6 = and i1 %g, %cond5
|
|
237 %fr = freeze i1 %cond6
|
|
238 br i1 %fr, label %A, label %B
|
|
239 A:
|
|
240 call void @g1()
|
|
241 ret void
|
|
242 B:
|
|
243 call void @g2()
|
|
244 ret void
|
|
245 }
|
|
246
|
|
247 define void @and_cmp(i32 %v, float %w, i32 %v2) {
|
|
248 ; CHECK-LABEL: @and_cmp(
|
|
249 ; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[V:%.*]], 0
|
|
250 ; CHECK-NEXT: [[C2:%.*]] = fcmp oeq float [[W:%.*]], 0.000000e+00
|
|
251 ; CHECK-NEXT: [[COND:%.*]] = and i1 [[C1]], [[C2]]
|
|
252 ; CHECK-NEXT: [[C3:%.*]] = icmp eq i32 [[V2:%.*]], 1
|
|
253 ; CHECK-NEXT: [[COND2:%.*]] = and i1 [[COND]], [[C3]]
|
|
254 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[COND2]]
|
|
255 ; CHECK-NEXT: br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
|
|
256 ; CHECK: A:
|
|
257 ; CHECK-NEXT: call void @g1()
|
|
258 ; CHECK-NEXT: ret void
|
|
259 ; CHECK: B:
|
|
260 ; CHECK-NEXT: call void @g2()
|
|
261 ; CHECK-NEXT: ret void
|
|
262 ;
|
|
263 %c1 = icmp eq i32 %v, 0
|
|
264 %c2 = fcmp oeq float %w, 0.0
|
|
265 %cond = and i1 %c1, %c2
|
|
266 %c3 = icmp eq i32 %v2, 1
|
|
267 %cond2 = and i1 %cond, %c3
|
|
268 %fr = freeze i1 %cond2
|
|
269 br i1 %fr, label %A, label %B
|
|
270 A:
|
|
271 call void @g1()
|
|
272 ret void
|
|
273 B:
|
|
274 call void @g2()
|
|
275 ret void
|
|
276 }
|
|
277
|
|
278 define void @or(i1 %a, i1 %b, i1 %c) {
|
|
279 ; CHECK-LABEL: @or(
|
|
280 ; CHECK-NEXT: [[COND:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
|
|
281 ; CHECK-NEXT: [[COND2:%.*]] = or i1 [[C:%.*]], [[COND]]
|
|
282 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[COND2]]
|
|
283 ; CHECK-NEXT: br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
|
|
284 ; CHECK: A:
|
|
285 ; CHECK-NEXT: call void @g1()
|
|
286 ; CHECK-NEXT: ret void
|
|
287 ; CHECK: B:
|
|
288 ; CHECK-NEXT: call void @g2()
|
|
289 ; CHECK-NEXT: ret void
|
|
290 ;
|
|
291 %cond = or i1 %a, %b
|
|
292 %cond2 = or i1 %c, %cond
|
|
293 %fr = freeze i1 %cond2
|
|
294 br i1 %fr, label %A, label %B
|
|
295 A:
|
|
296 call void @g1()
|
|
297 ret void
|
|
298 B:
|
|
299 call void @g2()
|
|
300 ret void
|
|
301 }
|
|
302
|
|
303 define void @and_loop(i1 %a, i1 %b) {
|
|
304 ; CHECK-LABEL: @and_loop(
|
|
305 ; CHECK-NEXT: ret void
|
|
306 ; CHECK: UNREACHABLE:
|
|
307 ; CHECK-NEXT: [[C:%.*]] = and i1 [[A:%.*]], [[C]]
|
|
308 ; CHECK-NEXT: [[FR:%.*]] = freeze i1 [[C]]
|
|
309 ; CHECK-NEXT: br i1 [[FR]], label [[UNREACHABLE:%.*]], label [[EXIT:%.*]]
|
|
310 ; CHECK: EXIT:
|
|
311 ; CHECK-NEXT: ret void
|
|
312 ;
|
|
313 ret void
|
|
314 UNREACHABLE:
|
|
315 %c = and i1 %a, %c
|
|
316 %fr = freeze i1 %c
|
|
317 br i1 %fr, label %UNREACHABLE, label %EXIT
|
|
318 EXIT:
|
|
319 ret void
|
|
320 }
|
|
321
|
|
322 declare void @g1()
|
|
323 declare void @g2()
|