• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
6define 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-NEXT: icmp eq i32 %i, 0
14; CHECK-NEXT: ret
15define 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
24define 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-NEXT: icmp eq i32 %i, 0
32; CHECK-NEXT: ret
33define 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
42define 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-NEXT: icmp ne i32 %i, 0
50; CHECK-NEXT: ret
51define 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
60define 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-NEXT: icmp ne i32 %i, 0
68; CHECK-NEXT: ret
69define 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
78define 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-NEXT: icmp eq i32 %i, 0
86; CHECK-NEXT: ret
87define 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
96define 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-NEXT: icmp eq i32 %i, 0
104; CHECK-NEXT: ret
105define 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
114define 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-NEXT: icmp ne i32 %i, 0
122; CHECK-NEXT: ret
123define 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
132define 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-NEXT: icmp ne i32 %i, 0
140; CHECK-NEXT: ret
141define 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
150define 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: icmp ne i32 %i, 0
158; CHECK-NEXT: ret
159define 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
168define 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: icmp sgt i32 %i, 0
176; CHECK-NEXT: ret
177define 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
186define 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
195define 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
203define 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
212define 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
221define 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
230define 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
239define 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
248define 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
258define 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; Since 0xFFFFFF fits in a float, and one less and
265; one more than it also fits without rounding, the
266; test can be optimized to an integer compare.
267
268; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_uitofp(
269; CHECK: icmp eq i32 %i, 16777215
270; CHECK-NEXT: ret
271define i1 @i32_cast_cmp_oeq_int_i24max_uitofp(i32 %i) {
272  %f = uitofp i32 %i to float
273  %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
274  ret i1 %cmp
275}
276
277; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24max_sitofp(
278; CHECK: icmp eq i32 %i, 16777215
279; CHECK-NEXT: ret
280define i1 @i32_cast_cmp_oeq_int_i24max_sitofp(i32 %i) {
281  %f = sitofp i32 %i to float
282  %cmp = fcmp oeq float %f, 0x416FFFFFE0000000
283  ret i1 %cmp
284}
285
286; Though 0x1000000 fits in a float, one more than it
287; would round to it too, hence a single integer comparison
288; does not suffice.
289
290; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_uitofp(
291; CHECK: uitofp
292; CHECK: fcmp oeq
293
294; XCHECK: icmp eq i32 %i, 16777216
295; XCHECK-NEXT: ret
296define i1 @i32_cast_cmp_oeq_int_i24maxp1_uitofp(i32 %i) {
297  %f = uitofp i32 %i to float
298  %cmp = fcmp oeq float %f, 0x4170000000000000
299  ret i1 %cmp
300}
301
302; CHECK-LABEL: @i32_cast_cmp_oeq_int_i24maxp1_sitofp(
303; CHECK: sitofp
304; CHECK: fcmp oeq
305
306; XCHECK: icmp eq i32 %i, 16777216
307; XCHECK-NEXT: ret
308define i1 @i32_cast_cmp_oeq_int_i24maxp1_sitofp(i32 %i) {
309  %f = sitofp i32 %i to float
310  %cmp = fcmp oeq float %f, 0x4170000000000000
311  ret i1 %cmp
312}
313
314; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_uitofp(
315; CHECK: uitofp
316; CHECK: fcmp oeq
317; CHECK-NEXT: ret
318define i1 @i32_cast_cmp_oeq_int_i32umax_uitofp(i32 %i) {
319  %f = uitofp i32 %i to float
320  %cmp = fcmp oeq float %f, 0x41F0000000000000
321  ret i1 %cmp
322}
323
324; 32-bit unsigned integer cannot possibly round up to 1<<33
325; CHECK-LABEL: @i32_cast_cmp_oeq_int_big_uitofp(
326; CHECK-NEXT: ret i1 false
327define i1 @i32_cast_cmp_oeq_int_big_uitofp(i32 %i) {
328  %f = uitofp i32 %i to float
329  %cmp = fcmp oeq float %f, 0x4200000000000000
330  ret i1 %cmp
331}
332
333; 32-bit signed integer cannot possibly round up to 1<<32
334; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32umax_sitofp(
335; CHECK-NEXT: ret i1 false
336define i1 @i32_cast_cmp_oeq_int_i32umax_sitofp(i32 %i) {
337  %f = sitofp i32 %i to float
338  %cmp = fcmp oeq float %f, 0x41F0000000000000
339  ret i1 %cmp
340}
341
342; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imin_uitofp(
343; CHECK: uitofp
344; CHECK: fcmp oeq
345; CHECK-NEXT: ret
346define i1 @i32_cast_cmp_oeq_int_i32imin_uitofp(i32 %i) {
347  %f = uitofp 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_i32imin_sitofp(
353; CHECK: sitofp
354; CHECK: fcmp oeq
355; CHECK-NEXT: ret
356define i1 @i32_cast_cmp_oeq_int_i32imin_sitofp(i32 %i) {
357  %f = sitofp i32 %i to float
358  %cmp = fcmp oeq float %f, 0xC1E0000000000000
359  ret i1 %cmp
360}
361
362; CHECK-LABEL: @i32_cast_cmp_oeq_int_i32imax_uitofp(
363; CHECK: uitofp
364; CHECK: fcmp oeq
365; CHECK-NEXT: ret
366define i1 @i32_cast_cmp_oeq_int_i32imax_uitofp(i32 %i) {
367  %f = uitofp 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_i32imax_sitofp(
373; CHECK: sitofp
374; CHECK: fcmp oeq
375; CHECK-NEXT: ret
376define i1 @i32_cast_cmp_oeq_int_i32imax_sitofp(i32 %i) {
377  %f = sitofp i32 %i to float
378  %cmp = fcmp oeq float %f, 0x41E0000000000000
379  ret i1 %cmp
380}
381
382; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_uitofp(
383; CHECK: uitofp
384; CHECK: fcmp oeq
385; CHECK-NEXT: ret
386define i1 @i32_cast_cmp_oeq_int_negi32umax_uitofp(i32 %i) {
387  %f = uitofp i32 %i to float
388  %cmp = fcmp oeq float %f, 0xC1F0000000000000
389  ret i1 %cmp
390}
391
392; 32-bit signed integer cannot possibly round to -1<<32
393; CHECK-LABEL: @i32_cast_cmp_oeq_int_negi32umax_sitofp(
394; CHECK-NEXT: ret i1 false
395define i1 @i32_cast_cmp_oeq_int_negi32umax_sitofp(i32 %i) {
396  %f = sitofp i32 %i to float
397  %cmp = fcmp oeq float %f, 0xC1F0000000000000
398  ret i1 %cmp
399}
400
401; CHECK-LABEL: @i32_cast_cmp_oeq_half_uitofp(
402; CHECK: ret i1 false
403define i1 @i32_cast_cmp_oeq_half_uitofp(i32 %i) {
404  %f = uitofp i32 %i to float
405  %cmp = fcmp oeq float %f, 0.5
406  ret i1 %cmp
407}
408
409; CHECK-LABEL: @i32_cast_cmp_oeq_half_sitofp(
410; CHECK: ret i1 false
411define i1 @i32_cast_cmp_oeq_half_sitofp(i32 %i) {
412  %f = sitofp i32 %i to float
413  %cmp = fcmp oeq float %f, 0.5
414  ret i1 %cmp
415}
416
417; CHECK-LABEL: @i32_cast_cmp_one_half_uitofp(
418; CHECK: ret i1 true
419define i1 @i32_cast_cmp_one_half_uitofp(i32 %i) {
420  %f = uitofp i32 %i to float
421  %cmp = fcmp one float %f, 0.5
422  ret i1 %cmp
423}
424
425; CHECK-LABEL: @i32_cast_cmp_one_half_sitofp(
426; CHECK: ret i1 true
427define i1 @i32_cast_cmp_one_half_sitofp(i32 %i) {
428  %f = sitofp i32 %i to float
429  %cmp = fcmp one float %f, 0.5
430  ret i1 %cmp
431}
432
433; CHECK-LABEL: @i32_cast_cmp_ueq_half_uitofp(
434; CHECK: ret i1 false
435define i1 @i32_cast_cmp_ueq_half_uitofp(i32 %i) {
436  %f = uitofp i32 %i to float
437  %cmp = fcmp ueq float %f, 0.5
438  ret i1 %cmp
439}
440
441; CHECK-LABEL: @i32_cast_cmp_ueq_half_sitofp(
442; CHECK: ret i1 false
443define i1 @i32_cast_cmp_ueq_half_sitofp(i32 %i) {
444  %f = sitofp i32 %i to float
445  %cmp = fcmp ueq float %f, 0.5
446  ret i1 %cmp
447}
448
449; CHECK-LABEL: @i32_cast_cmp_une_half_uitofp(
450; CHECK: ret i1 true
451define i1 @i32_cast_cmp_une_half_uitofp(i32 %i) {
452  %f = uitofp i32 %i to float
453  %cmp = fcmp une float %f, 0.5
454  ret i1 %cmp
455}
456
457; CHECK-LABEL: @i32_cast_cmp_une_half_sitofp(
458; CHECK: ret i1 true
459define i1 @i32_cast_cmp_une_half_sitofp(i32 %i) {
460  %f = sitofp i32 %i to float
461  %cmp = fcmp une float %f, 0.5
462  ret i1 %cmp
463}
464
465; CHECK-LABEL: @i32_cast_cmp_oeq_int_inf_uitofp(
466; CHECK-NEXT: ret i1 false
467define i1 @i32_cast_cmp_oeq_int_inf_uitofp(i32 %i) {
468  %f = uitofp i32 %i to float
469  %cmp = fcmp oeq float %f, 0x7FF0000000000000
470  ret i1 %cmp
471}
472
473; CHECK-LABEL: @i32_cast_cmp_oeq_int_inf_sitofp(
474; CHECK-NEXT: ret i1 false
475define i1 @i32_cast_cmp_oeq_int_inf_sitofp(i32 %i) {
476  %f = sitofp i32 %i to float
477  %cmp = fcmp oeq float %f, 0x7FF0000000000000
478  ret i1 %cmp
479}
480
481; An i128 could round to an IEEE single-precision infinity.
482; CHECK-LABEL: @i128_cast_cmp_oeq_int_inf_uitofp(
483; CHECK: uitofp
484; CHECK: fcmp oeq
485; CHECK-NEXT: ret
486define i1 @i128_cast_cmp_oeq_int_inf_uitofp(i128 %i) {
487  %f = uitofp i128 %i to float
488  %cmp = fcmp oeq float %f, 0x7FF0000000000000
489  ret i1 %cmp
490}
491