xref: /llvm-project/llvm/test/Transforms/Attributor/nofpclass-fptrunc.ll (revision d48d108bc66adb31185ee023e1eb0ccdda2065c1)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
3
4declare float @llvm.fptrunc.round.f32.f64(double, metadata)
5
6define float @ret_fptrunc(double %arg0) {
7; CHECK-LABEL: define float @ret_fptrunc
8; CHECK-SAME: (double [[ARG0:%.*]]) #[[ATTR1:[0-9]+]] {
9; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
10; CHECK-NEXT:    ret float [[EXT]]
11;
12  %ext = fptrunc double %arg0 to float
13  ret float %ext
14}
15
16define float @ret_fptrunc_nonan(double nofpclass(nan) %arg0) {
17; CHECK-LABEL: define nofpclass(nan) float @ret_fptrunc_nonan
18; CHECK-SAME: (double nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
19; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
20; CHECK-NEXT:    ret float [[EXT]]
21;
22  %ext = fptrunc double %arg0 to float
23  ret float %ext
24}
25
26define float @ret_fptrunc_noqnan(double nofpclass(qnan) %arg0) {
27; CHECK-LABEL: define float @ret_fptrunc_noqnan
28; CHECK-SAME: (double nofpclass(qnan) [[ARG0:%.*]]) #[[ATTR1]] {
29; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
30; CHECK-NEXT:    ret float [[EXT]]
31;
32  %ext = fptrunc double %arg0 to float
33  ret float %ext
34}
35
36define float @ret_fptrunc_nosnan(double nofpclass(snan) %arg0) {
37; CHECK-LABEL: define nofpclass(snan) float @ret_fptrunc_nosnan
38; CHECK-SAME: (double nofpclass(snan) [[ARG0:%.*]]) #[[ATTR1]] {
39; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
40; CHECK-NEXT:    ret float [[EXT]]
41;
42  %ext = fptrunc double %arg0 to float
43  ret float %ext
44}
45
46define float @ret_fptrunc_noinf(double nofpclass(inf) %arg0) {
47; CHECK-LABEL: define float @ret_fptrunc_noinf
48; CHECK-SAME: (double nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {
49; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
50; CHECK-NEXT:    ret float [[EXT]]
51;
52  %ext = fptrunc double %arg0 to float
53  ret float %ext
54}
55
56define float @ret_fptrunc_nopinf(double nofpclass(pinf) %arg0) {
57; CHECK-LABEL: define float @ret_fptrunc_nopinf
58; CHECK-SAME: (double nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {
59; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
60; CHECK-NEXT:    ret float [[EXT]]
61;
62  %ext = fptrunc double %arg0 to float
63  ret float %ext
64}
65
66define float @ret_fptrunc_noninf(double nofpclass(ninf) %arg0) {
67; CHECK-LABEL: define float @ret_fptrunc_noninf
68; CHECK-SAME: (double nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {
69; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
70; CHECK-NEXT:    ret float [[EXT]]
71;
72  %ext = fptrunc double %arg0 to float
73  ret float %ext
74}
75
76define float @ret_fptrunc_nozero(double nofpclass(zero) %arg0) {
77; CHECK-LABEL: define float @ret_fptrunc_nozero
78; CHECK-SAME: (double nofpclass(zero) [[ARG0:%.*]]) #[[ATTR1]] {
79; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
80; CHECK-NEXT:    ret float [[EXT]]
81;
82  %ext = fptrunc double %arg0 to float
83  ret float %ext
84}
85
86define float @ret_fptrunc_nopzero(double nofpclass(pzero) %arg0) {
87; CHECK-LABEL: define float @ret_fptrunc_nopzero
88; CHECK-SAME: (double nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR1]] {
89; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
90; CHECK-NEXT:    ret float [[EXT]]
91;
92  %ext = fptrunc double %arg0 to float
93  ret float %ext
94}
95
96define float @ret_fptrunc_nonzero(double nofpclass(nzero) %arg0) {
97; CHECK-LABEL: define float @ret_fptrunc_nonzero
98; CHECK-SAME: (double nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR1]] {
99; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
100; CHECK-NEXT:    ret float [[EXT]]
101;
102  %ext = fptrunc double %arg0 to float
103  ret float %ext
104}
105
106define float @ret_fptrunc_nonan_noinf(double nofpclass(nan inf) %arg0) {
107; CHECK-LABEL: define nofpclass(nan) float @ret_fptrunc_nonan_noinf
108; CHECK-SAME: (double nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR1]] {
109; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
110; CHECK-NEXT:    ret float [[EXT]]
111;
112  %ext = fptrunc double %arg0 to float
113  ret float %ext
114}
115
116define float @ret_fptrunc_nosub(double nofpclass(sub) %arg0) {
117; CHECK-LABEL: define float @ret_fptrunc_nosub
118; CHECK-SAME: (double nofpclass(sub) [[ARG0:%.*]]) #[[ATTR1]] {
119; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
120; CHECK-NEXT:    ret float [[EXT]]
121;
122  %ext = fptrunc double %arg0 to float
123  ret float %ext
124}
125
126define float @ret_fptrunc_nonorm(double nofpclass(norm) %arg0) {
127; CHECK-LABEL: define float @ret_fptrunc_nonorm
128; CHECK-SAME: (double nofpclass(norm) [[ARG0:%.*]]) #[[ATTR1]] {
129; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
130; CHECK-NEXT:    ret float [[EXT]]
131;
132  %ext = fptrunc double %arg0 to float
133  ret float %ext
134}
135
136define float @ret_fptrunc_posonly(double nofpclass(ninf nnorm nsub nzero) %arg0) {
137; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_fptrunc_posonly
138; CHECK-SAME: (double nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
139; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
140; CHECK-NEXT:    ret float [[EXT]]
141;
142  %ext = fptrunc double %arg0 to float
143  ret float %ext
144}
145
146define float @ret_fptrunc_posonly_zero(double nofpclass(ninf nnorm nsub) %arg0) {
147; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_fptrunc_posonly_zero
148; CHECK-SAME: (double nofpclass(ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
149; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
150; CHECK-NEXT:    ret float [[EXT]]
151;
152  %ext = fptrunc double %arg0 to float
153  ret float %ext
154}
155
156define float @ret_fptrunc_posonly_zero_nan(double nofpclass(ninf nnorm nsub nan) %arg0) {
157; CHECK-LABEL: define nofpclass(nan ninf nsub nnorm) float @ret_fptrunc_posonly_zero_nan
158; CHECK-SAME: (double nofpclass(nan ninf nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
159; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
160; CHECK-NEXT:    ret float [[EXT]]
161;
162  %ext = fptrunc double %arg0 to float
163  ret float %ext
164}
165
166define float @ret_fptrunc_posonly_nan(double nofpclass(ninf nnorm nsub nzero nan) %arg0) {
167; CHECK-LABEL: define nofpclass(nan ninf nsub nnorm) float @ret_fptrunc_posonly_nan
168; CHECK-SAME: (double nofpclass(nan ninf nzero nsub nnorm) [[ARG0:%.*]]) #[[ATTR1]] {
169; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
170; CHECK-NEXT:    ret float [[EXT]]
171;
172  %ext = fptrunc double %arg0 to float
173  ret float %ext
174}
175
176define float @ret_fptrunc_negonly(double nofpclass(pinf pnorm psub pzero) %arg0) {
177; CHECK-LABEL: define float @ret_fptrunc_negonly
178; CHECK-SAME: (double nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
179; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
180; CHECK-NEXT:    ret float [[EXT]]
181;
182  %ext = fptrunc double %arg0 to float
183  ret float %ext
184}
185
186define float @ret_fptrunc_negonly_zero(double nofpclass(pinf pnorm psub) %arg0) {
187; CHECK-LABEL: define float @ret_fptrunc_negonly_zero
188; CHECK-SAME: (double nofpclass(pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
189; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
190; CHECK-NEXT:    ret float [[EXT]]
191;
192  %ext = fptrunc double %arg0 to float
193  ret float %ext
194}
195
196define float @ret_fptrunc_negonly_zero_nan(double nofpclass(pinf pnorm psub nan) %arg0) {
197; CHECK-LABEL: define nofpclass(nan) float @ret_fptrunc_negonly_zero_nan
198; CHECK-SAME: (double nofpclass(nan pinf psub pnorm) [[ARG0:%.*]]) #[[ATTR1]] {
199; CHECK-NEXT:    [[EXT:%.*]] = fptrunc double [[ARG0]] to float
200; CHECK-NEXT:    ret float [[EXT]]
201;
202  %ext = fptrunc double %arg0 to float
203  ret float %ext
204}
205
206define float @ret_fptrunc_round(double %arg0) {
207; CHECK-LABEL: define float @ret_fptrunc_round
208; CHECK-SAME: (double [[ARG0:%.*]]) #[[ATTR1]] {
209; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0]], metadata !"round.downward") #[[ATTR2:[0-9]+]]
210; CHECK-NEXT:    ret float [[EXT]]
211;
212  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
213  ret float %ext
214}
215
216define float @ret_fptrunc_round_nonan(double nofpclass(nan) %arg0) {
217; CHECK-LABEL: define nofpclass(nan) float @ret_fptrunc_round_nonan
218; CHECK-SAME: (double nofpclass(nan) [[ARG0:%.*]]) #[[ATTR1]] {
219; CHECK-NEXT:    [[EXT:%.*]] = call nofpclass(nan) float @llvm.fptrunc.round.f32.f64(double nofpclass(nan) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
220; CHECK-NEXT:    ret float [[EXT]]
221;
222  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
223  ret float %ext
224}
225
226define float @ret_fptrunc_round_noqnan(double nofpclass(qnan) %arg0) {
227; CHECK-LABEL: define float @ret_fptrunc_round_noqnan
228; CHECK-SAME: (double nofpclass(qnan) [[ARG0:%.*]]) #[[ATTR1]] {
229; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(qnan) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
230; CHECK-NEXT:    ret float [[EXT]]
231;
232  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
233  ret float %ext
234}
235
236define float @ret_fptrunc_round_nosnan(double nofpclass(snan) %arg0) {
237; CHECK-LABEL: define nofpclass(snan) float @ret_fptrunc_round_nosnan
238; CHECK-SAME: (double nofpclass(snan) [[ARG0:%.*]]) #[[ATTR1]] {
239; CHECK-NEXT:    [[EXT:%.*]] = call nofpclass(snan) float @llvm.fptrunc.round.f32.f64(double nofpclass(snan) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
240; CHECK-NEXT:    ret float [[EXT]]
241;
242  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
243  ret float %ext
244}
245
246define float @ret_fptrunc_round_noinf(double nofpclass(inf) %arg0) {
247; CHECK-LABEL: define float @ret_fptrunc_round_noinf
248; CHECK-SAME: (double nofpclass(inf) [[ARG0:%.*]]) #[[ATTR1]] {
249; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(inf) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
250; CHECK-NEXT:    ret float [[EXT]]
251;
252  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
253  ret float %ext
254}
255
256define float @ret_fptrunc_round_nopinf(double nofpclass(pinf) %arg0) {
257; CHECK-LABEL: define float @ret_fptrunc_round_nopinf
258; CHECK-SAME: (double nofpclass(pinf) [[ARG0:%.*]]) #[[ATTR1]] {
259; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(pinf) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
260; CHECK-NEXT:    ret float [[EXT]]
261;
262  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
263  ret float %ext
264}
265
266define float @ret_fptrunc_round_noninf(double nofpclass(ninf) %arg0) {
267; CHECK-LABEL: define float @ret_fptrunc_round_noninf
268; CHECK-SAME: (double nofpclass(ninf) [[ARG0:%.*]]) #[[ATTR1]] {
269; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(ninf) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
270; CHECK-NEXT:    ret float [[EXT]]
271;
272  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
273  ret float %ext
274}
275
276define float @ret_fptrunc_round_nozero(double nofpclass(zero) %arg0) {
277; CHECK-LABEL: define float @ret_fptrunc_round_nozero
278; CHECK-SAME: (double nofpclass(zero) [[ARG0:%.*]]) #[[ATTR1]] {
279; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(zero) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
280; CHECK-NEXT:    ret float [[EXT]]
281;
282  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
283  ret float %ext
284}
285
286define float @ret_fptrunc_round_nopzero(double nofpclass(pzero) %arg0) {
287; CHECK-LABEL: define float @ret_fptrunc_round_nopzero
288; CHECK-SAME: (double nofpclass(pzero) [[ARG0:%.*]]) #[[ATTR1]] {
289; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(pzero) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
290; CHECK-NEXT:    ret float [[EXT]]
291;
292  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
293  ret float %ext
294}
295
296define float @ret_fptrunc_round_nonzero(double nofpclass(nzero) %arg0) {
297; CHECK-LABEL: define float @ret_fptrunc_round_nonzero
298; CHECK-SAME: (double nofpclass(nzero) [[ARG0:%.*]]) #[[ATTR1]] {
299; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(nzero) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
300; CHECK-NEXT:    ret float [[EXT]]
301;
302  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
303  ret float %ext
304}
305
306define float @ret_fptrunc_round_nonan_noinf(double nofpclass(nan inf) %arg0) {
307; CHECK-LABEL: define nofpclass(nan) float @ret_fptrunc_round_nonan_noinf
308; CHECK-SAME: (double nofpclass(nan inf) [[ARG0:%.*]]) #[[ATTR1]] {
309; CHECK-NEXT:    [[EXT:%.*]] = call nofpclass(nan) float @llvm.fptrunc.round.f32.f64(double nofpclass(nan inf) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
310; CHECK-NEXT:    ret float [[EXT]]
311;
312  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
313  ret float %ext
314}
315
316define float @ret_fptrunc_round_nosub(double nofpclass(sub) %arg0) {
317; CHECK-LABEL: define float @ret_fptrunc_round_nosub
318; CHECK-SAME: (double nofpclass(sub) [[ARG0:%.*]]) #[[ATTR1]] {
319; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(sub) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
320; CHECK-NEXT:    ret float [[EXT]]
321;
322  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
323  ret float %ext
324}
325
326define float @ret_fptrunc_round_nonorm(double nofpclass(norm) %arg0) {
327; CHECK-LABEL: define float @ret_fptrunc_round_nonorm
328; CHECK-SAME: (double nofpclass(norm) [[ARG0:%.*]]) #[[ATTR1]] {
329; CHECK-NEXT:    [[EXT:%.*]] = call float @llvm.fptrunc.round.f32.f64(double nofpclass(norm) [[ARG0]], metadata !"round.downward") #[[ATTR2]]
330; CHECK-NEXT:    ret float [[EXT]]
331;
332  %ext = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
333  ret float %ext
334}
335
336;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
337; TUNIT: {{.*}}
338