xref: /llvm-project/llvm/test/Transforms/InstSimplify/round-intrinsics.ll (revision 02b3a358926e7bbcac9226cbecbfc3067c2ad61b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instsimplify %s | FileCheck %s
3
4define float @sitofp_floor(i32 %arg) {
5; CHECK-LABEL: @sitofp_floor(
6; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
7; CHECK-NEXT:    ret float [[CVT]]
8;
9  %cvt = sitofp i32 %arg to float
10  %round = call float @llvm.floor.f32(float %cvt)
11  ret float %round
12}
13
14define float @uitofp_floor(i32 %arg) {
15; CHECK-LABEL: @uitofp_floor(
16; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
17; CHECK-NEXT:    ret float [[CVT]]
18;
19  %cvt = uitofp i32 %arg to float
20  %round = call float @llvm.floor.f32(float %cvt)
21  ret float %round
22}
23
24define float @sitofp_trunc(i32 %arg) {
25; CHECK-LABEL: @sitofp_trunc(
26; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
27; CHECK-NEXT:    ret float [[CVT]]
28;
29  %cvt = sitofp i32 %arg to float
30  %round = call float @llvm.trunc.f32(float %cvt)
31  ret float %round
32}
33
34define float @uitofp_trunc(i32 %arg) {
35; CHECK-LABEL: @uitofp_trunc(
36; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
37; CHECK-NEXT:    ret float [[CVT]]
38;
39  %cvt = uitofp i32 %arg to float
40  %round = call float @llvm.trunc.f32(float %cvt)
41  ret float %round
42}
43
44define float @sitofp_ceil(i32 %arg) {
45; CHECK-LABEL: @sitofp_ceil(
46; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
47; CHECK-NEXT:    ret float [[CVT]]
48;
49  %cvt = sitofp i32 %arg to float
50  %round = call float @llvm.ceil.f32(float %cvt)
51  ret float %round
52}
53
54define float @uitofp_ceil(i32 %arg) {
55; CHECK-LABEL: @uitofp_ceil(
56; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
57; CHECK-NEXT:    ret float [[CVT]]
58;
59  %cvt = uitofp i32 %arg to float
60  %round = call float @llvm.ceil.f32(float %cvt)
61  ret float %round
62}
63
64define float @sitofp_round(i32 %arg) {
65; CHECK-LABEL: @sitofp_round(
66; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
67; CHECK-NEXT:    ret float [[CVT]]
68;
69  %cvt = sitofp i32 %arg to float
70  %round = call float @llvm.round.f32(float %cvt)
71  ret float %round
72}
73
74define float @uitofp_round(i32 %arg) {
75; CHECK-LABEL: @uitofp_round(
76; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
77; CHECK-NEXT:    ret float [[CVT]]
78;
79  %cvt = uitofp i32 %arg to float
80  %round = call float @llvm.round.f32(float %cvt)
81  ret float %round
82}
83
84define float @uitofp_roundeven(i32 %arg) {
85; CHECK-LABEL: @uitofp_roundeven(
86; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
87; CHECK-NEXT:    ret float [[CVT]]
88;
89  %cvt = uitofp i32 %arg to float
90  %round = call float @llvm.roundeven.f32(float %cvt)
91  ret float %round
92}
93
94define float @sitofp_nearbyint(i32 %arg) {
95; CHECK-LABEL: @sitofp_nearbyint(
96; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
97; CHECK-NEXT:    ret float [[CVT]]
98;
99  %cvt = sitofp i32 %arg to float
100  %nearbyint = call float @llvm.nearbyint.f32(float %cvt)
101  ret float %nearbyint
102}
103
104define float @uitofp_nearbyint(i32 %arg) {
105; CHECK-LABEL: @uitofp_nearbyint(
106; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
107; CHECK-NEXT:    ret float [[CVT]]
108;
109  %cvt = uitofp i32 %arg to float
110  %nearbyint = call float @llvm.nearbyint.f32(float %cvt)
111  ret float %nearbyint
112}
113
114define float @sitofp_rint(i32 %arg) {
115; CHECK-LABEL: @sitofp_rint(
116; CHECK-NEXT:    [[CVT:%.*]] = sitofp i32 [[ARG:%.*]] to float
117; CHECK-NEXT:    ret float [[CVT]]
118;
119  %cvt = sitofp i32 %arg to float
120  %rint = call float @llvm.rint.f32(float %cvt)
121  ret float %rint
122}
123
124define float @uitofp_rint(i32 %arg) {
125; CHECK-LABEL: @uitofp_rint(
126; CHECK-NEXT:    [[CVT:%.*]] = uitofp i32 [[ARG:%.*]] to float
127; CHECK-NEXT:    ret float [[CVT]]
128;
129  %cvt = uitofp i32 %arg to float
130  %rint = call float @llvm.rint.f32(float %cvt)
131  ret float %rint
132}
133
134define float @floor_trunc(float %x) {
135; CHECK-LABEL: @floor_trunc(
136; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
137; CHECK-NEXT:    ret float [[A]]
138;
139  %a = call float @llvm.floor.f32(float %x)
140  %r = call float @llvm.trunc.f32(float %a)
141  ret float %r
142}
143
144define float @floor_ceil(float %x) {
145; CHECK-LABEL: @floor_ceil(
146; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
147; CHECK-NEXT:    ret float [[A]]
148;
149  %a = call float @llvm.floor.f32(float %x)
150  %r = call float @llvm.ceil.f32(float %a)
151  ret float %r
152}
153
154define float @floor_round(float %x) {
155; CHECK-LABEL: @floor_round(
156; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
157; CHECK-NEXT:    ret float [[A]]
158;
159  %a = call float @llvm.floor.f32(float %x)
160  %r = call float @llvm.round.f32(float %a)
161  ret float %r
162}
163
164define float @floor_roundeven(float %x) {
165; CHECK-LABEL: @floor_roundeven(
166; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
167; CHECK-NEXT:    ret float [[A]]
168;
169  %a = call float @llvm.floor.f32(float %x)
170  %r = call float @llvm.roundeven.f32(float %a)
171  ret float %r
172}
173
174define float @floor_nearbyint(float %x) {
175; CHECK-LABEL: @floor_nearbyint(
176; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
177; CHECK-NEXT:    ret float [[A]]
178;
179  %a = call float @llvm.floor.f32(float %x)
180  %r = call float @llvm.nearbyint.f32(float %a)
181  ret float %r
182}
183
184define float @floor_rint(float %x) {
185; CHECK-LABEL: @floor_rint(
186; CHECK-NEXT:    [[A:%.*]] = call float @llvm.floor.f32(float [[X:%.*]])
187; CHECK-NEXT:    ret float [[A]]
188;
189  %a = call float @llvm.floor.f32(float %x)
190  %r = call float @llvm.rint.f32(float %a)
191  ret float %r
192}
193
194define float @trunc_floor(float %x) {
195; CHECK-LABEL: @trunc_floor(
196; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
197; CHECK-NEXT:    ret float [[A]]
198;
199  %a = call float @llvm.trunc.f32(float %x)
200  %r = call float @llvm.floor.f32(float %a)
201  ret float %r
202}
203
204define float @trunc_ceil(float %x) {
205; CHECK-LABEL: @trunc_ceil(
206; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
207; CHECK-NEXT:    ret float [[A]]
208;
209  %a = call float @llvm.trunc.f32(float %x)
210  %r = call float @llvm.ceil.f32(float %a)
211  ret float %r
212}
213
214define float @trunc_round(float %x) {
215; CHECK-LABEL: @trunc_round(
216; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
217; CHECK-NEXT:    ret float [[A]]
218;
219  %a = call float @llvm.trunc.f32(float %x)
220  %r = call float @llvm.round.f32(float %a)
221  ret float %r
222}
223
224define float @trunc_roundeven(float %x) {
225; CHECK-LABEL: @trunc_roundeven(
226; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
227; CHECK-NEXT:    ret float [[A]]
228;
229  %a = call float @llvm.trunc.f32(float %x)
230  %r = call float @llvm.roundeven.f32(float %a)
231  ret float %r
232}
233
234define float @trunc_nearbyint(float %x) {
235; CHECK-LABEL: @trunc_nearbyint(
236; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
237; CHECK-NEXT:    ret float [[A]]
238;
239  %a = call float @llvm.trunc.f32(float %x)
240  %r = call float @llvm.nearbyint.f32(float %a)
241  ret float %r
242}
243
244define float @trunc_rint(float %x) {
245; CHECK-LABEL: @trunc_rint(
246; CHECK-NEXT:    [[A:%.*]] = call float @llvm.trunc.f32(float [[X:%.*]])
247; CHECK-NEXT:    ret float [[A]]
248;
249  %a = call float @llvm.trunc.f32(float %x)
250  %r = call float @llvm.rint.f32(float %a)
251  ret float %r
252}
253
254define float @ceil_floor(float %x) {
255; CHECK-LABEL: @ceil_floor(
256; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
257; CHECK-NEXT:    ret float [[A]]
258;
259  %a = call float @llvm.ceil.f32(float %x)
260  %r = call float @llvm.floor.f32(float %a)
261  ret float %r
262}
263
264define float @ceil_trunc(float %x) {
265; CHECK-LABEL: @ceil_trunc(
266; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
267; CHECK-NEXT:    ret float [[A]]
268;
269  %a = call float @llvm.ceil.f32(float %x)
270  %r = call float @llvm.trunc.f32(float %a)
271  ret float %r
272}
273
274define float @ceil_round(float %x) {
275; CHECK-LABEL: @ceil_round(
276; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
277; CHECK-NEXT:    ret float [[A]]
278;
279  %a = call float @llvm.ceil.f32(float %x)
280  %r = call float @llvm.round.f32(float %a)
281  ret float %r
282}
283
284define float @ceil_roundeven(float %x) {
285; CHECK-LABEL: @ceil_roundeven(
286; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
287; CHECK-NEXT:    ret float [[A]]
288;
289  %a = call float @llvm.ceil.f32(float %x)
290  %r = call float @llvm.roundeven.f32(float %a)
291  ret float %r
292}
293
294define float @ceil_nearbyint(float %x) {
295; CHECK-LABEL: @ceil_nearbyint(
296; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
297; CHECK-NEXT:    ret float [[A]]
298;
299  %a = call float @llvm.ceil.f32(float %x)
300  %r = call float @llvm.nearbyint.f32(float %a)
301  ret float %r
302}
303
304define float @ceil_rint(float %x) {
305; CHECK-LABEL: @ceil_rint(
306; CHECK-NEXT:    [[A:%.*]] = call float @llvm.ceil.f32(float [[X:%.*]])
307; CHECK-NEXT:    ret float [[A]]
308;
309  %a = call float @llvm.ceil.f32(float %x)
310  %r = call float @llvm.rint.f32(float %a)
311  ret float %r
312}
313
314define float @round_floor(float %x) {
315; CHECK-LABEL: @round_floor(
316; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
317; CHECK-NEXT:    ret float [[A]]
318;
319  %a = call float @llvm.round.f32(float %x)
320  %r = call float @llvm.floor.f32(float %a)
321  ret float %r
322}
323
324define float @round_trunc(float %x) {
325; CHECK-LABEL: @round_trunc(
326; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
327; CHECK-NEXT:    ret float [[A]]
328;
329  %a = call float @llvm.round.f32(float %x)
330  %r = call float @llvm.trunc.f32(float %a)
331  ret float %r
332}
333
334define float @round_ceil(float %x) {
335; CHECK-LABEL: @round_ceil(
336; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
337; CHECK-NEXT:    ret float [[A]]
338;
339  %a = call float @llvm.round.f32(float %x)
340  %r = call float @llvm.ceil.f32(float %a)
341  ret float %r
342}
343
344define float @round_roundeven(float %x) {
345; CHECK-LABEL: @round_roundeven(
346; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
347; CHECK-NEXT:    ret float [[A]]
348;
349  %a = call float @llvm.round.f32(float %x)
350  %r = call float @llvm.roundeven.f32(float %a)
351  ret float %r
352}
353
354define float @round_nearbyint(float %x) {
355; CHECK-LABEL: @round_nearbyint(
356; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
357; CHECK-NEXT:    ret float [[A]]
358;
359  %a = call float @llvm.round.f32(float %x)
360  %r = call float @llvm.nearbyint.f32(float %a)
361  ret float %r
362}
363
364define float @round_rint(float %x) {
365; CHECK-LABEL: @round_rint(
366; CHECK-NEXT:    [[A:%.*]] = call float @llvm.round.f32(float [[X:%.*]])
367; CHECK-NEXT:    ret float [[A]]
368;
369  %a = call float @llvm.round.f32(float %x)
370  %r = call float @llvm.rint.f32(float %a)
371  ret float %r
372}
373
374define float @roundeven_floor(float %x) {
375; CHECK-LABEL: @roundeven_floor(
376; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
377; CHECK-NEXT:    ret float [[A]]
378;
379  %a = call float @llvm.roundeven.f32(float %x)
380  %r = call float @llvm.floor.f32(float %a)
381  ret float %r
382}
383
384define float @roundeven_trunc(float %x) {
385; CHECK-LABEL: @roundeven_trunc(
386; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
387; CHECK-NEXT:    ret float [[A]]
388;
389  %a = call float @llvm.roundeven.f32(float %x)
390  %r = call float @llvm.trunc.f32(float %a)
391  ret float %r
392}
393
394define float @roundeven_ceil(float %x) {
395; CHECK-LABEL: @roundeven_ceil(
396; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
397; CHECK-NEXT:    ret float [[A]]
398;
399  %a = call float @llvm.roundeven.f32(float %x)
400  %r = call float @llvm.ceil.f32(float %a)
401  ret float %r
402}
403
404define float @roundeven_round(float %x) {
405; CHECK-LABEL: @roundeven_round(
406; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
407; CHECK-NEXT:    ret float [[A]]
408;
409  %a = call float @llvm.roundeven.f32(float %x)
410  %r = call float @llvm.round.f32(float %a)
411  ret float %r
412}
413
414define float @roundeven_nearbyint(float %x) {
415; CHECK-LABEL: @roundeven_nearbyint(
416; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
417; CHECK-NEXT:    ret float [[A]]
418;
419  %a = call float @llvm.roundeven.f32(float %x)
420  %r = call float @llvm.nearbyint.f32(float %a)
421  ret float %r
422}
423
424define float @roundeven_rint(float %x) {
425; CHECK-LABEL: @roundeven_rint(
426; CHECK-NEXT:    [[A:%.*]] = call float @llvm.roundeven.f32(float [[X:%.*]])
427; CHECK-NEXT:    ret float [[A]]
428;
429  %a = call float @llvm.roundeven.f32(float %x)
430  %r = call float @llvm.rint.f32(float %a)
431  ret float %r
432}
433
434define float @nearbyint_floor(float %x) {
435; CHECK-LABEL: @nearbyint_floor(
436; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
437; CHECK-NEXT:    ret float [[A]]
438;
439  %a = call float @llvm.nearbyint.f32(float %x)
440  %r = call float @llvm.floor.f32(float %a)
441  ret float %r
442}
443
444define float @nearbyint_trunc(float %x) {
445; CHECK-LABEL: @nearbyint_trunc(
446; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
447; CHECK-NEXT:    ret float [[A]]
448;
449  %a = call float @llvm.nearbyint.f32(float %x)
450  %r = call float @llvm.trunc.f32(float %a)
451  ret float %r
452}
453
454define float @nearbyint_ceil(float %x) {
455; CHECK-LABEL: @nearbyint_ceil(
456; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
457; CHECK-NEXT:    ret float [[A]]
458;
459  %a = call float @llvm.nearbyint.f32(float %x)
460  %r = call float @llvm.ceil.f32(float %a)
461  ret float %r
462}
463
464define float @nearbyint_round(float %x) {
465; CHECK-LABEL: @nearbyint_round(
466; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
467; CHECK-NEXT:    ret float [[A]]
468;
469  %a = call float @llvm.nearbyint.f32(float %x)
470  %r = call float @llvm.round.f32(float %a)
471  ret float %r
472}
473
474define float @nearbyint_roundeven(float %x) {
475; CHECK-LABEL: @nearbyint_roundeven(
476; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
477; CHECK-NEXT:    ret float [[A]]
478;
479  %a = call float @llvm.nearbyint.f32(float %x)
480  %r = call float @llvm.roundeven.f32(float %a)
481  ret float %r
482}
483
484define float @nearbyint_rint(float %x) {
485; CHECK-LABEL: @nearbyint_rint(
486; CHECK-NEXT:    [[A:%.*]] = call float @llvm.nearbyint.f32(float [[X:%.*]])
487; CHECK-NEXT:    ret float [[A]]
488;
489  %a = call float @llvm.nearbyint.f32(float %x)
490  %r = call float @llvm.rint.f32(float %a)
491  ret float %r
492}
493
494define float @rint_floor(float %x) {
495; CHECK-LABEL: @rint_floor(
496; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
497; CHECK-NEXT:    ret float [[A]]
498;
499  %a = call float @llvm.rint.f32(float %x)
500  %r = call float @llvm.floor.f32(float %a)
501  ret float %r
502}
503
504define float @rint_trunc(float %x) {
505; CHECK-LABEL: @rint_trunc(
506; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
507; CHECK-NEXT:    ret float [[A]]
508;
509  %a = call float @llvm.rint.f32(float %x)
510  %r = call float @llvm.trunc.f32(float %a)
511  ret float %r
512}
513
514define float @rint_ceil(float %x) {
515; CHECK-LABEL: @rint_ceil(
516; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
517; CHECK-NEXT:    ret float [[A]]
518;
519  %a = call float @llvm.rint.f32(float %x)
520  %r = call float @llvm.ceil.f32(float %a)
521  ret float %r
522}
523
524define float @rint_round(float %x) {
525; CHECK-LABEL: @rint_round(
526; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
527; CHECK-NEXT:    ret float [[A]]
528;
529  %a = call float @llvm.rint.f32(float %x)
530  %r = call float @llvm.round.f32(float %a)
531  ret float %r
532}
533
534define float @rint_roundeven(float %x) {
535; CHECK-LABEL: @rint_roundeven(
536; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
537; CHECK-NEXT:    ret float [[A]]
538;
539  %a = call float @llvm.rint.f32(float %x)
540  %r = call float @llvm.roundeven.f32(float %a)
541  ret float %r
542}
543
544define float @rint_nearbyint(float %x) {
545; CHECK-LABEL: @rint_nearbyint(
546; CHECK-NEXT:    [[A:%.*]] = call float @llvm.rint.f32(float [[X:%.*]])
547; CHECK-NEXT:    ret float [[A]]
548;
549  %a = call float @llvm.rint.f32(float %x)
550  %r = call float @llvm.nearbyint.f32(float %a)
551  ret float %r
552}
553
554declare float @llvm.floor.f32(float) #0
555declare float @llvm.trunc.f32(float) #0
556declare float @llvm.ceil.f32(float) #0
557declare float @llvm.round.f32(float) #0
558declare float @llvm.roundeven.f32(float) #0
559declare float @llvm.nearbyint.f32(float) #0
560declare float @llvm.rint.f32(float) #0
561
562attributes #0 = { nounwind readnone speculatable }
563