Convert fcmp with 0.0 from casted integers to icmp
[oota-llvm.git] / test / Transforms / InstCombine / cast-int-fcmp-eq-0.ll
1 ; RUN: opt -S -instcombine < %s | FileCheck %s
2
3 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_uitofp(
4 ; CHECK-NEXT: icmp eq i32 %i, 0
5 ; CHECK-NEXT: ret
6 define i1 @i32_cast_cmp_oeq_int_0_uitofp(i32 %i) {
7   %f = uitofp i32 %i to float
8   %cmp = fcmp oeq float %f, 0.0
9   ret i1 %cmp
10 }
11
12 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_n0_uitofp(
13 ; CHECK: uitofp
14 ; CHECK: fcmp oeq
15 define i1 @i32_cast_cmp_oeq_int_n0_uitofp(i32 %i) {
16   %f = uitofp i32 %i to float
17   %cmp = fcmp oeq float %f, -0.0
18   ret i1 %cmp
19 }
20
21 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_sitofp(
22 ; CHECK-NEXT: icmp eq i32 %i, 0
23 ; CHECK-NEXT: ret
24 define i1 @i32_cast_cmp_oeq_int_0_sitofp(i32 %i) {
25   %f = sitofp i32 %i to float
26   %cmp = fcmp oeq float %f, 0.0
27   ret i1 %cmp
28 }
29
30 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_n0_sitofp(
31 ; CHECK: sitofp
32 ; CHECK: fcmp oeq
33 define i1 @i32_cast_cmp_oeq_int_n0_sitofp(i32 %i) {
34   %f = sitofp i32 %i to float
35   %cmp = fcmp oeq float %f, -0.0
36   ret i1 %cmp
37 }
38
39 ; CHECK-LABEL: @i32_cast_cmp_one_int_0_uitofp(
40 ; CHECK-NEXT: icmp ne i32 %i, 0
41 ; CHECK-NEXT: ret
42 define i1 @i32_cast_cmp_one_int_0_uitofp(i32 %i) {
43   %f = uitofp i32 %i to float
44   %cmp = fcmp one float %f, 0.0
45   ret i1 %cmp
46 }
47
48 ; CHECK-LABEL: @i32_cast_cmp_one_int_n0_uitofp(
49 ; CHECK: uitofp
50 ; CHECK: fcmp one
51 define i1 @i32_cast_cmp_one_int_n0_uitofp(i32 %i) {
52   %f = uitofp i32 %i to float
53   %cmp = fcmp one float %f, -0.0
54   ret i1 %cmp
55 }
56
57 ; CHECK-LABEL: @i32_cast_cmp_one_int_0_sitofp(
58 ; CHECK-NEXT: icmp ne i32 %i, 0
59 ; CHECK-NEXT: ret
60 define i1 @i32_cast_cmp_one_int_0_sitofp(i32 %i) {
61   %f = sitofp i32 %i to float
62   %cmp = fcmp one float %f, 0.0
63   ret i1 %cmp
64 }
65
66 ; CHECK-LABEL: @i32_cast_cmp_one_int_n0_sitofp(
67 ; CHECK: sitofp
68 ; CHECK: fcmp one
69 define i1 @i32_cast_cmp_one_int_n0_sitofp(i32 %i) {
70   %f = sitofp i32 %i to float
71   %cmp = fcmp one float %f, -0.0
72   ret i1 %cmp
73 }
74
75 ; CHECK-LABEL: @i32_cast_cmp_ueq_int_0_uitofp(
76 ; CHECK-NEXT: icmp eq i32 %i, 0
77 ; CHECK-NEXT: ret
78 define i1 @i32_cast_cmp_ueq_int_0_uitofp(i32 %i) {
79   %f = uitofp i32 %i to float
80   %cmp = fcmp ueq float %f, 0.0
81   ret i1 %cmp
82 }
83
84 ; CHECK-LABEL: @i32_cast_cmp_ueq_int_n0_uitofp(
85 ; CHECK: uitofp
86 ; CHECK: fcmp ueq
87 define i1 @i32_cast_cmp_ueq_int_n0_uitofp(i32 %i) {
88   %f = uitofp i32 %i to float
89   %cmp = fcmp ueq float %f, -0.0
90   ret i1 %cmp
91 }
92
93 ; CHECK-LABEL: @i32_cast_cmp_ueq_int_0_sitofp(
94 ; CHECK-NEXT: icmp eq i32 %i, 0
95 ; CHECK-NEXT: ret
96 define i1 @i32_cast_cmp_ueq_int_0_sitofp(i32 %i) {
97   %f = sitofp i32 %i to float
98   %cmp = fcmp ueq float %f, 0.0
99   ret i1 %cmp
100 }
101
102 ; CHECK-LABEL: @i32_cast_cmp_ueq_int_n0_sitofp(
103 ; CHECK: sitofp
104 ; CHECK: fcmp ueq
105 define i1 @i32_cast_cmp_ueq_int_n0_sitofp(i32 %i) {
106   %f = sitofp i32 %i to float
107   %cmp = fcmp ueq float %f, -0.0
108   ret i1 %cmp
109 }
110
111 ; CHECK-LABEL: @i32_cast_cmp_une_int_0_uitofp(
112 ; CHECK-NEXT: icmp ne i32 %i, 0
113 ; CHECK-NEXT: ret
114 define i1 @i32_cast_cmp_une_int_0_uitofp(i32 %i) {
115   %f = uitofp i32 %i to float
116   %cmp = fcmp une float %f, 0.0
117   ret i1 %cmp
118 }
119
120 ; CHECK-LABEL: @i32_cast_cmp_une_int_n0_uitofp(
121 ; CHECK: uitofp
122 ; CHECK: fcmp une
123 define i1 @i32_cast_cmp_une_int_n0_uitofp(i32 %i) {
124   %f = uitofp i32 %i to float
125   %cmp = fcmp une float %f, -0.0
126   ret i1 %cmp
127 }
128
129 ; CHECK-LABEL: @i32_cast_cmp_une_int_0_sitofp(
130 ; CHECK-NEXT: icmp ne i32 %i, 0
131 ; CHECK-NEXT: ret
132 define i1 @i32_cast_cmp_une_int_0_sitofp(i32 %i) {
133   %f = sitofp i32 %i to float
134   %cmp = fcmp une float %f, 0.0
135   ret i1 %cmp
136 }
137
138 ; CHECK-LABEL: @i32_cast_cmp_une_int_n0_sitofp(
139 ; CHECK: sitofp
140 ; CHECK: fcmp une
141 define i1 @i32_cast_cmp_une_int_n0_sitofp(i32 %i) {
142   %f = sitofp i32 %i to float
143   %cmp = fcmp une float %f, -0.0
144   ret i1 %cmp
145 }
146
147 ; CHECK-LABEL: @i32_cast_cmp_ogt_int_0_uitofp(
148 ; CHECK: icmp ne i32 %i, 0
149 ; CHECK-NEXT: ret
150 define i1 @i32_cast_cmp_ogt_int_0_uitofp(i32 %i) {
151   %f = uitofp i32 %i to float
152   %cmp = fcmp ogt float %f, 0.0
153   ret i1 %cmp
154 }
155
156 ; CHECK-LABEL: @i32_cast_cmp_ogt_int_n0_uitofp(
157 ; CHECK: uitofp
158 ; CHECK: fcmp ogt
159 define i1 @i32_cast_cmp_ogt_int_n0_uitofp(i32 %i) {
160   %f = uitofp i32 %i to float
161   %cmp = fcmp ogt float %f, -0.0
162   ret i1 %cmp
163 }
164
165 ; CHECK-LABEL: @i32_cast_cmp_ogt_int_0_sitofp(
166 ; CHECK: icmp sgt i32 %i, 0
167 ; CHECK-NEXT: ret
168 define i1 @i32_cast_cmp_ogt_int_0_sitofp(i32 %i) {
169   %f = sitofp i32 %i to float
170   %cmp = fcmp ogt float %f, 0.0
171   ret i1 %cmp
172 }
173
174 ; CHECK-LABEL: @i32_cast_cmp_ogt_int_n0_sitofp(
175 ; CHECK: sitofp
176 ; CHECK: fcmp ogt
177 define i1 @i32_cast_cmp_ogt_int_n0_sitofp(i32 %i) {
178   %f = sitofp i32 %i to float
179   %cmp = fcmp ogt float %f, -0.0
180   ret i1 %cmp
181 }
182
183 ; CHECK-LABEL: @i32_cast_cmp_ole_int_0_uitofp(
184 ; CHECK: icmp eq i32 %i, 0
185 ; CHECK-NEXT: ret
186 define i1 @i32_cast_cmp_ole_int_0_uitofp(i32 %i) {
187   %f = uitofp i32 %i to float
188   %cmp = fcmp ole float %f, 0.0
189   ret i1 %cmp
190 }
191
192 ; CHECK-LABEL: @i32_cast_cmp_ole_int_0_sitofp(
193 ; CHECK: icmp slt i32 %i, 1
194 ; CHECK-NEXT: ret
195 define i1 @i32_cast_cmp_ole_int_0_sitofp(i32 %i) {
196   %f = sitofp i32 %i to float
197   %cmp = fcmp ole float %f, 0.0
198   ret i1 %cmp
199 }
200
201 ; CHECK-LABEL: @i32_cast_cmp_olt_int_0_uitofp(
202 ; CHECK: ret i1 false
203 define i1 @i32_cast_cmp_olt_int_0_uitofp(i32 %i) {
204   %f = uitofp i32 %i to float
205   %cmp = fcmp olt float %f, 0.0
206   ret i1 %cmp
207 }
208
209 ; CHECK-LABEL: @i32_cast_cmp_olt_int_0_sitofp(
210 ; CHECK: icmp slt i32 %i, 0
211 ; CHECK-NEXT: ret
212 define i1 @i32_cast_cmp_olt_int_0_sitofp(i32 %i) {
213   %f = sitofp i32 %i to float
214   %cmp = fcmp olt float %f, 0.0
215   ret i1 %cmp
216 }
217
218 ; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_uitofp(
219 ; CHECK-NEXT: icmp eq i64 %i, 0
220 ; CHECK-NEXT: ret
221 define i1 @i64_cast_cmp_oeq_int_0_uitofp(i64 %i) {
222   %f = uitofp i64 %i to float
223   %cmp = fcmp oeq float %f, 0.0
224   ret i1 %cmp
225 }
226
227 ; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_sitofp(
228 ; CHECK-NEXT: icmp eq i64 %i, 0
229 ; CHECK-NEXT: ret
230 define i1 @i64_cast_cmp_oeq_int_0_sitofp(i64 %i) {
231   %f = sitofp i64 %i to float
232   %cmp = fcmp oeq float %f, 0.0
233   ret i1 %cmp
234 }
235
236 ; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_uitofp_half(
237 ; CHECK-NEXT: icmp eq i64 %i, 0
238 ; CHECK-NEXT: ret
239 define i1 @i64_cast_cmp_oeq_int_0_uitofp_half(i64 %i) {
240   %f = uitofp i64 %i to half
241   %cmp = fcmp oeq half %f, 0.0
242   ret i1 %cmp
243 }
244
245 ; CHECK-LABEL: @i64_cast_cmp_oeq_int_0_sitofp_half(
246 ; CHECK-NEXT: icmp eq i64 %i, 0
247 ; CHECK-NEXT: ret
248 define i1 @i64_cast_cmp_oeq_int_0_sitofp_half(i64 %i) {
249   %f = sitofp i64 %i to half
250   %cmp = fcmp oeq half %f, 0.0
251   ret i1 %cmp
252 }
253
254 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_0_uitofp_ppcf128(
255 ; CHECK: uitofp
256 ; CHECK: fcmp oeq
257 ; CHECK-NEXT: ret
258 define i1 @i32_cast_cmp_oeq_int_0_uitofp_ppcf128(i32 %i) {
259   %f = uitofp i32 %i to ppc_fp128
260   %cmp = fcmp oeq ppc_fp128 %f, 0xM00000000000000000000000000000000
261   ret i1 %cmp
262 }
263
264 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_uitofp(
265 ; CHECK: uitofp
266 ; CHECK: fcmp oeq
267
268 ; XCHECK: icmp eq i32 %i, 16777215
269 ; XCHECK-NEXT: ret
270 define i1 @i32_cast_cmp_oeq_int_i24max_uitofp(i32 %i) {
271   %f = uitofp i32 %i to float
272   %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
273   ret i1 %cmp
274 }
275
276 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_sitofp(
277 ; CHECK: sitofp
278 ; CHECK: fcmp oeq
279
280 ; XCHECK: icmp eq i32 %i, 16777215
281 ; XCHECK-NEXT: ret
282 define i1 @i32_cast_cmp_oeq_int_i24max_sitofp(i32 %i) {
283   %f = sitofp i32 %i to float
284   %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
285   ret i1 %cmp
286 }
287
288 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_uitofp(
289 ; CHECK: uitofp
290 ; CHECK: fcmp oeq
291
292 ; XCHECK: icmp eq i32 %i, 16777216
293 ; XCHECK-NEXT: ret
294 define i1 @i32_cast_cmp_oeq_int_i24maxp1_uitofp(i32 %i) {
295   %f = uitofp i32 %i to float
296   %cmp = fcmp oeq float %f, 0x4170000000000000
297   ret i1 %cmp
298 }
299
300 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_sitofp(
301 ; CHECK: sitofp
302 ; CHECK: fcmp oeq
303
304 ; XCHECK: icmp eq i32 %i, 16777216
305 ; XCHECK-NEXT: ret
306 define i1 @i32_cast_cmp_oeq_int_i24maxp1_sitofp(i32 %i) {
307   %f = sitofp i32 %i to float
308   %cmp = fcmp oeq float %f, 0x4170000000000000
309   ret i1 %cmp
310 }
311
312 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_uitofp(
313 ; CHECK: uitofp
314 ; CHECK: fcmp oeq
315 ; CHECK-NEXT: ret
316 define i1 @i32_cast_cmp_oeq_int_i32umax_uitofp(i32 %i) {
317   %f = uitofp i32 %i to float
318   %cmp = fcmp oeq float %f, 0x41F0000000000000
319   ret i1 %cmp
320 }
321
322 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_sitofp(
323 ; CHECK: sitofp
324 ; CHECK: fcmp oeq
325 ; CHECK-NEXT: ret
326 define i1 @i32_cast_cmp_oeq_int_i32umax_sitofp(i32 %i) {
327   %f = sitofp i32 %i to float
328   %cmp = fcmp oeq float %f, 0x41F0000000000000
329   ret i1 %cmp
330 }
331
332 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imin_uitofp(
333 ; CHECK: uitofp
334 ; CHECK: fcmp oeq
335 ; CHECK-NEXT: ret
336 define i1 @i32_cast_cmp_oeq_int_i32imin_uitofp(i32 %i) {
337   %f = uitofp i32 %i to float
338   %cmp = fcmp oeq float %f, 0xC1E0000000000000
339   ret i1 %cmp
340 }
341
342 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imin_sitofp(
343 ; CHECK: sitofp
344 ; CHECK: fcmp oeq
345 ; CHECK-NEXT: ret
346 define i1 @i32_cast_cmp_oeq_int_i32imin_sitofp(i32 %i) {
347   %f = sitofp i32 %i to float
348   %cmp = fcmp oeq float %f, 0xC1E0000000000000
349   ret i1 %cmp
350 }
351
352 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imax_uitofp(
353 ; CHECK: uitofp
354 ; CHECK: fcmp oeq
355 ; CHECK-NEXT: ret
356 define i1 @i32_cast_cmp_oeq_int_i32imax_uitofp(i32 %i) {
357   %f = uitofp i32 %i to float
358   %cmp = fcmp oeq float %f, 0x41E0000000000000
359   ret i1 %cmp
360 }
361
362 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imax_sitofp(
363 ; CHECK: sitofp
364 ; CHECK: fcmp oeq
365 ; CHECK-NEXT: ret
366 define i1 @i32_cast_cmp_oeq_int_i32imax_sitofp(i32 %i) {
367   %f = sitofp i32 %i to float
368   %cmp = fcmp oeq float %f, 0x41E0000000000000
369   ret i1 %cmp
370 }
371
372 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_uitofp(
373 ; CHECK: uitofp
374 ; CHECK: fcmp oeq
375 ; CHECK-NEXT: ret
376 define i1 @i32_cast_cmp_oeq_int_negi32umax_uitofp(i32 %i) {
377   %f = uitofp i32 %i to float
378   %cmp = fcmp oeq float %f, 0xC1F0000000000000
379   ret i1 %cmp
380 }
381
382 ; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_sitofp(
383 ; CHECK: sitofp
384 ; CHECK: fcmp oeq
385 ; CHECK-NEXT: ret
386 define i1 @i32_cast_cmp_oeq_int_negi32umax_sitofp(i32 %i) {
387   %f = sitofp i32 %i to float
388   %cmp = fcmp oeq float %f, 0xC1F0000000000000
389   ret i1 %cmp
390 }
391
392 ; CHECK-LABEL: @i32_cast_cmp_oeq_half_uitofp(
393 ; CHECK: ret i1 false
394 define i1 @i32_cast_cmp_oeq_half_uitofp(i32 %i) {
395   %f = uitofp i32 %i to float
396   %cmp = fcmp oeq float %f, 0.5
397   ret i1 %cmp
398 }
399
400 ; CHECK-LABEL: @i32_cast_cmp_oeq_half_sitofp(
401 ; CHECK: ret i1 false
402 define i1 @i32_cast_cmp_oeq_half_sitofp(i32 %i) {
403   %f = sitofp i32 %i to float
404   %cmp = fcmp oeq float %f, 0.5
405   ret i1 %cmp
406 }
407
408 ; CHECK-LABEL: @i32_cast_cmp_one_half_uitofp(
409 ; CHECK: ret i1 true
410 define i1 @i32_cast_cmp_one_half_uitofp(i32 %i) {
411   %f = uitofp i32 %i to float
412   %cmp = fcmp one float %f, 0.5
413   ret i1 %cmp
414 }
415
416 ; CHECK-LABEL: @i32_cast_cmp_one_half_sitofp(
417 ; CHECK: ret i1 true
418 define i1 @i32_cast_cmp_one_half_sitofp(i32 %i) {
419   %f = sitofp i32 %i to float
420   %cmp = fcmp one float %f, 0.5
421   ret i1 %cmp
422 }
423
424 ; CHECK-LABEL: @i32_cast_cmp_ueq_half_uitofp(
425 ; CHECK: ret i1 false
426 define i1 @i32_cast_cmp_ueq_half_uitofp(i32 %i) {
427   %f = uitofp i32 %i to float
428   %cmp = fcmp ueq float %f, 0.5
429   ret i1 %cmp
430 }
431
432 ; CHECK-LABEL: @i32_cast_cmp_ueq_half_sitofp(
433 ; CHECK: ret i1 false
434 define i1 @i32_cast_cmp_ueq_half_sitofp(i32 %i) {
435   %f = sitofp i32 %i to float
436   %cmp = fcmp ueq float %f, 0.5
437   ret i1 %cmp
438 }
439
440 ; CHECK-LABEL: @i32_cast_cmp_une_half_uitofp(
441 ; CHECK: ret i1 true
442 define i1 @i32_cast_cmp_une_half_uitofp(i32 %i) {
443   %f = uitofp i32 %i to float
444   %cmp = fcmp une float %f, 0.5
445   ret i1 %cmp
446 }
447
448 ; CHECK-LABEL: @i32_cast_cmp_une_half_sitofp(
449 ; CHECK: ret i1 true
450 define i1 @i32_cast_cmp_une_half_sitofp(i32 %i) {
451   %f = sitofp i32 %i to float
452   %cmp = fcmp une float %f, 0.5
453   ret i1 %cmp
454 }