Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / Attributor / nofpclass-frem.ll
blob77b697e4dca5ce9141e555ac953fd72932ed93b2
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
4 define float @ret_frem_ieee(float %arg0, float %arg1) #0 {
5 ; CHECK-LABEL: define float @ret_frem_ieee
6 ; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0:[0-9]+]] {
7 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
8 ; CHECK-NEXT:    ret float [[FREM]]
10   %frem = frem float %arg0, %arg1
11   ret float %frem
14 define float @ret_frem_daz(float %arg0, float %arg1) #1 {
15 ; CHECK-LABEL: define float @ret_frem_daz
16 ; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1:[0-9]+]] {
17 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
18 ; CHECK-NEXT:    ret float [[FREM]]
20   %frem = frem float %arg0, %arg1
21   ret float %frem
24 define float @ret_frem_ieee_noinf_nozero__all(float nofpclass(inf zero) %arg0, float %arg1) #0 {
25 ; CHECK-LABEL: define float @ret_frem_ieee_noinf_nozero__all
26 ; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
27 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
28 ; CHECK-NEXT:    ret float [[FREM]]
30   %frem = frem float %arg0, %arg1
31   ret float %frem
34 define float @ret_frem_ieee_nonan_noinf_nozero__all(float nofpclass(nan inf zero) %arg0, float %arg1) #0 {
35 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__all
36 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
37 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
38 ; CHECK-NEXT:    ret float [[FREM]]
40   %frem = frem float %arg0, %arg1
41   ret float %frem
44 define float @ret_frem_ieee_all__nonan_noinf_nozero(float %arg0, float nofpclass(nan inf zero) %arg1) #0 {
45 ; CHECK-LABEL: define float @ret_frem_ieee_all__nonan_noinf_nozero
46 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] {
47 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
48 ; CHECK-NEXT:    ret float [[FREM]]
50   %frem = frem float %arg0, %arg1
51   ret float %frem
54 define float @ret_frem_ieee_nonan_noinf_nozero__nonan(float nofpclass(nan inf zero) %arg0, float nofpclass(nan) %arg1) #0 {
55 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__nonan
56 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR0]] {
57 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
58 ; CHECK-NEXT:    ret float [[FREM]]
60   %frem = frem float %arg0, %arg1
61   ret float %frem
64 define float @ret_frem_ieee_nonan__nonan_noinf_nozero(float nofpclass(nan) %arg0, float nofpclass(nan inf zero) %arg1) #0 {
65 ; CHECK-LABEL: define float @ret_frem_ieee_nonan__nonan_noinf_nozero
66 ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] {
67 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
68 ; CHECK-NEXT:    ret float [[FREM]]
70   %frem = frem float %arg0, %arg1
71   ret float %frem
74 define float @ret_frem_ieee_nonan_nozero__nonan_noinf(float nofpclass(nan zero) %arg0, float nofpclass(nan inf) %arg1) #0 {
75 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_nozero__nonan_noinf
76 ; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
77 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
78 ; CHECK-NEXT:    ret float [[FREM]]
80   %frem = frem float %arg0, %arg1
81   ret float %frem
84 define float @ret_frem_ieee_nonan_noinf__nonan_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan zero) %arg1) #0 {
85 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf__nonan_nozero
86 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR0]] {
87 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
88 ; CHECK-NEXT:    ret float [[FREM]]
90   %frem = frem float %arg0, %arg1
91   ret float %frem
94 define float @ret_frem_daz_nonan_nozero__nonan_noinf(float nofpclass(nan zero) %arg0, float nofpclass(nan inf) %arg1) #1 {
95 ; CHECK-LABEL: define float @ret_frem_daz_nonan_nozero__nonan_noinf
96 ; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] {
97 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
98 ; CHECK-NEXT:    ret float [[FREM]]
100   %frem = frem float %arg0, %arg1
101   ret float %frem
104 define float @ret_frem_daz_nonan_noinf__nonan_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan zero) %arg1) #1 {
105 ; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf__nonan_nozero
106 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR1]] {
107 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
108 ; CHECK-NEXT:    ret float [[FREM]]
110   %frem = frem float %arg0, %arg1
111   ret float %frem
114 define float @ret_frem_daz_nonan_nozero_nosub__nonan_noinf(float nofpclass(nan zero sub) %arg0, float nofpclass(nan inf) %arg1) #1 {
115 ; CHECK-LABEL: define float @ret_frem_daz_nonan_nozero_nosub__nonan_noinf
116 ; CHECK-SAME: (float nofpclass(nan zero sub) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] {
117 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
118 ; CHECK-NEXT:    ret float [[FREM]]
120   %frem = frem float %arg0, %arg1
121   ret float %frem
124 define float @ret_frem_daz_nonan_noinf__nonan_nozero_nosub(float nofpclass(nan inf) %arg0, float nofpclass(nan zero sub) %arg1) #1 {
125 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf__nonan_nozero_nosub
126 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero sub) [[ARG1:%.*]]) #[[ATTR1]] {
127 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
128 ; CHECK-NEXT:    ret float [[FREM]]
130   %frem = frem float %arg0, %arg1
131   ret float %frem
134 define float @ret_frem_ieee_nonan_noinf__nonan_noinf(float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) #0 {
135 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf__nonan_noinf
136 ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR0]] {
137 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
138 ; CHECK-NEXT:    ret float [[FREM]]
140   %frem = frem float %arg0, %arg1
141   ret float %frem
144 define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #0 {
145 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_nozero
146 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] {
147 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
148 ; CHECK-NEXT:    ret float [[FREM]]
150   %frem = frem float %arg0, %arg1
151   ret float %frem
154 define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #1 {
155 ; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero
156 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR1]] {
157 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
158 ; CHECK-NEXT:    ret float [[FREM]]
160   %frem = frem float %arg0, %arg1
161   ret float %frem
164 define float @ret_frem_dapz_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #2 {
165 ; CHECK-LABEL: define float @ret_frem_dapz_nonan_noinf_nozero__nonan_noinf_nozero
166 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR2:[0-9]+]] {
167 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
168 ; CHECK-NEXT:    ret float [[FREM]]
170   %frem = frem float %arg0, %arg1
171   ret float %frem
174 define float @ret_frem_dynamic_nonan_noinf_nozero__nonan_noinf_nozero(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero) %arg1) #3 {
175 ; CHECK-LABEL: define float @ret_frem_dynamic_nonan_noinf_nozero__nonan_noinf_nozero
176 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR3:[0-9]+]] {
177 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
178 ; CHECK-NEXT:    ret float [[FREM]]
180   %frem = frem float %arg0, %arg1
181   ret float %frem
184 define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noinf(float nofpclass(nan inf) %arg0, float nofpclass(nan inf) %arg1) #0 {
185 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noinf
186 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
187 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
188 ; CHECK-NEXT:    ret float [[FREM]]
190   %frem = frem float %arg0, %arg1
191   ret float %frem
194 define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_noinf(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf) %arg1) #0 {
195 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_nozero__nonan_noinf_noinf
196 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
197 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
198 ; CHECK-NEXT:    ret float [[FREM]]
200   %frem = frem float %arg0, %arg1
201   ret float %frem
204 define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_nozero(float nofpclass(nan inf) %arg0, float nofpclass(nan inf zero) %arg1) #0 {
205 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_nozero
206 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR0]] {
207 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
208 ; CHECK-NEXT:    ret float [[FREM]]
210   %frem = frem float %arg0, %arg1
211   ret float %frem
214 define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noposzero(float nofpclass(nan inf) %arg0, float nofpclass(nan pzero) %arg1) #0 {
215 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noinf__nonan_noinf_noposzero
216 ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan pzero) [[ARG1:%.*]]) #[[ATTR0]] {
217 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
218 ; CHECK-NEXT:    ret float [[FREM]]
220   %frem = frem float %arg0, %arg1
221   ret float %frem
224 define float @ret_frem_ieee_nonan_noinf_noposzero__nonan_noinf_noinf(float nofpclass(nan pzero) %arg0, float nofpclass(nan inf) %arg1) #0 {
225 ; CHECK-LABEL: define float @ret_frem_ieee_nonan_noinf_noposzero__nonan_noinf_noinf
226 ; CHECK-SAME: (float nofpclass(nan pzero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR0]] {
227 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
228 ; CHECK-NEXT:    ret float [[FREM]]
230   %frem = frem float %arg0, %arg1
231   ret float %frem
234 define float @ret_frem_ieee_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #0 {
235 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_ieee_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub
236 ; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR0]] {
237 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
238 ; CHECK-NEXT:    ret float [[FREM]]
240   %frem = frem float %arg0, %arg1
241   ret float %frem
244 ; Denormal mode doesn't matter because sources are nofpclass(sub)
245 define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #1 {
246 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub
247 ; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR1]] {
248 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
249 ; CHECK-NEXT:    ret float [[FREM]]
251   %frem = frem float %arg0, %arg1
252   ret float %frem
255 define float @ret_frem_dapz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #2 {
256 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_dapz_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub
257 ; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR2]] {
258 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
259 ; CHECK-NEXT:    ret float [[FREM]]
261   %frem = frem float %arg0, %arg1
262   ret float %frem
265 define float @ret_frem_dynamic_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero sub) %arg1) #3 {
266 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_dynamic_nonan_noinf_nozero_nosub__nonan_noinf_nozero_nosub
267 ; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR3]] {
268 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
269 ; CHECK-NEXT:    ret float [[FREM]]
271   %frem = frem float %arg0, %arg1
272   ret float %frem
275 ; Missing no-subnormal on lhs
276 define float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero_nosub(float nofpclass(nan inf zero) %arg0, float nofpclass(nan inf zero sub) %arg1) #1 {
277 ; CHECK-LABEL: define nofpclass(nan) float @ret_frem_daz_nonan_noinf_nozero__nonan_noinf_nozero_nosub
278 ; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf zero sub) [[ARG1:%.*]]) #[[ATTR1]] {
279 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
280 ; CHECK-NEXT:    ret float [[FREM]]
282   %frem = frem float %arg0, %arg1
283   ret float %frem
286 ; Missing no-subnormal on lhs
287 define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero(float nofpclass(nan inf zero sub) %arg0, float nofpclass(nan inf zero) %arg1) #1 {
288 ; CHECK-LABEL: define float @ret_frem_daz_nonan_noinf_nozero_nosub__nonan_noinf_nozero
289 ; CHECK-SAME: (float nofpclass(nan inf zero sub) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR1]] {
290 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
291 ; CHECK-NEXT:    ret float [[FREM]]
293   %frem = frem float %arg0, %arg1
294   ret float %frem
297 ; should be able to infer noinf
298 define float @ret_frem_ieee_noinf__nozero(float nofpclass(inf) %arg0, float nofpclass(zero) %arg1) #0 {
299 ; CHECK-LABEL: define float @ret_frem_ieee_noinf__nozero
300 ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR0]] {
301 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
302 ; CHECK-NEXT:    ret float [[FREM]]
304   %frem = frem float %arg0, %arg1
305   ret float %frem
308 define float @ret_frem_ieee_all__nozero(float %arg0, float nofpclass(zero) %arg1) #0 {
309 ; CHECK-LABEL: define float @ret_frem_ieee_all__nozero
310 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR0]] {
311 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
312 ; CHECK-NEXT:    ret float [[FREM]]
314   %frem = frem float %arg0, %arg1
315   ret float %frem
318 define float @ret_frem_ieee_noinf__all(float nofpclass(inf) %arg0, float %arg1) #0 {
319 ; CHECK-LABEL: define float @ret_frem_ieee_noinf__all
320 ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
321 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
322 ; CHECK-NEXT:    ret float [[FREM]]
324   %frem = frem float %arg0, %arg1
325   ret float %frem
328 define float @ret_frem_ieee_nozero__noinf(float nofpclass(zero) %arg0, float nofpclass(inf) %arg1) #0 {
329 ; CHECK-LABEL: define float @ret_frem_ieee_nozero__noinf
330 ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR0]] {
331 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
332 ; CHECK-NEXT:    ret float [[FREM]]
334   %frem = frem float %arg0, %arg1
335   ret float %frem
338 define float @ret_frem_daz_noinf__nozero(float nofpclass(inf) %arg0, float nofpclass(zero) %arg1) #1 {
339 ; CHECK-LABEL: define float @ret_frem_daz_noinf__nozero
340 ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR1]] {
341 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
342 ; CHECK-NEXT:    ret float [[FREM]]
344   %frem = frem float %arg0, %arg1
345   ret float %frem
348 define float @ret_frem_daz_noinf__nozero_nosub(float nofpclass(inf) %arg0, float nofpclass(zero sub) %arg1) #1 {
349 ; CHECK-LABEL: define float @ret_frem_daz_noinf__nozero_nosub
350 ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(zero sub) [[ARG1:%.*]]) #[[ATTR1]] {
351 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
352 ; CHECK-NEXT:    ret float [[FREM]]
354   %frem = frem float %arg0, %arg1
355   ret float %frem
358 define float @ret_frem_same_operands(float %arg) #0 {
359 ; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands
360 ; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR0]] {
361 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG]], [[ARG]]
362 ; CHECK-NEXT:    ret float [[FREM]]
364   %frem = frem float %arg, %arg
365   ret float %frem
368 define float @ret_frem_same_operands_nosnan(float nofpclass(snan) %arg) #0 {
369 ; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_nosnan
370 ; CHECK-SAME: (float nofpclass(snan) [[ARG:%.*]]) #[[ATTR0]] {
371 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG]], [[ARG]]
372 ; CHECK-NEXT:    ret float [[FREM]]
374   %frem = frem float %arg, %arg
375   ret float %frem
378 define float @ret_frem_same_operands_noqnan(float nofpclass(qnan) %arg) #0 {
379 ; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_noqnan
380 ; CHECK-SAME: (float nofpclass(qnan) [[ARG:%.*]]) #[[ATTR0]] {
381 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG]], [[ARG]]
382 ; CHECK-NEXT:    ret float [[FREM]]
384   %frem = frem float %arg, %arg
385   ret float %frem
388 define float @ret_frem_same_operands_nonan(float nofpclass(nan) %arg) #0 {
389 ; CHECK-LABEL: define nofpclass(inf sub norm) float @ret_frem_same_operands_nonan
390 ; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR0]] {
391 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG]], [[ARG]]
392 ; CHECK-NEXT:    ret float [[FREM]]
394   %frem = frem float %arg, %arg
395   ret float %frem
398 define float @ret_frem_no_neg_lhs(float nofpclass(ninf nsub nnorm) %arg0, float %arg1) #0 {
399 ; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg_lhs
400 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
401 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
402 ; CHECK-NEXT:    ret float [[FREM]]
404   %frem = frem float %arg0, %arg1
405   ret float %frem
408 define float @ret_frem_no_neg_rhs(float %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 {
409 ; CHECK-LABEL: define float @ret_frem_no_neg_rhs
410 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
411 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
412 ; CHECK-NEXT:    ret float [[FREM]]
414   %frem = frem float %arg0, %arg1
415   ret float %frem
418 define float @ret_frem_no_neg_nzero_rhs(float %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 {
419 ; CHECK-LABEL: define float @ret_frem_no_neg_nzero_rhs
420 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
421 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
422 ; CHECK-NEXT:    ret float [[FREM]]
424   %frem = frem float %arg0, %arg1
425   ret float %frem
428 define float @ret_frem_no_neg(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 {
429 ; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg
430 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
431 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
432 ; CHECK-NEXT:    ret float [[FREM]]
434   %frem = frem float %arg0, %arg1
435   ret float %frem
438 define float @ret_frem_no_neg_nzero(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 {
439 ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_frem_no_neg_nzero
440 ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
441 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
442 ; CHECK-NEXT:    ret float [[FREM]]
444   %frem = frem float %arg0, %arg1
445   ret float %frem
448 define float @ret_frem_no_neg_rhs_no_nzero(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 {
449 ; CHECK-LABEL: define nofpclass(ninf nsub nnorm) float @ret_frem_no_neg_rhs_no_nzero
450 ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
451 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
452 ; CHECK-NEXT:    ret float [[FREM]]
454   %frem = frem float %arg0, %arg1
455   ret float %frem
458 define float @ret_frem_no_neg_no_zero_rhs(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm zero) %arg1) #0 {
459 ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_frem_no_neg_no_zero_rhs
460 ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf zero nsub nnorm) [[ARG1:%.*]]) #[[ATTR0]] {
461 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
462 ; CHECK-NEXT:    ret float [[FREM]]
464   %frem = frem float %arg0, %arg1
465   ret float %frem
468 define float @ret_frem_no_pos_lhs(float nofpclass(pinf psub pnorm pzero) %arg0, float %arg1) #0 {
469 ; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_frem_no_pos_lhs
470 ; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
471 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
472 ; CHECK-NEXT:    ret float [[FREM]]
474   %frem = frem float %arg0, %arg1
475   ret float %frem
478 define float @ret_frem_no_pos_rhs(float %arg0, float nofpclass(pinf psub pnorm pzero) %arg1) #0 {
479 ; CHECK-LABEL: define float @ret_frem_no_pos_rhs
480 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(pinf pzero psub pnorm) [[ARG1:%.*]]) #[[ATTR0]] {
481 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
482 ; CHECK-NEXT:    ret float [[FREM]]
484   %frem = frem float %arg0, %arg1
485   ret float %frem
488 define float @ret_frem_no_pos_zero_lhs(float nofpclass(pinf psub pnorm) %arg0, float %arg1) #0 {
489 ; CHECK-LABEL: define nofpclass(pinf psub pnorm) float @ret_frem_no_pos_zero_lhs
490 ; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
491 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
492 ; CHECK-NEXT:    ret float [[FREM]]
494   %frem = frem float %arg0, %arg1
495   ret float %frem
498 define float @ret_frem_no_pos_zero_rhs(float %arg0, float nofpclass(pinf psub pnorm) %arg1) #0 {
499 ; CHECK-LABEL: define float @ret_frem_no_pos_zero_rhs
500 ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(pinf psub pnorm) [[ARG1:%.*]]) #[[ATTR0]] {
501 ; CHECK-NEXT:    [[FREM:%.*]] = frem float [[ARG0]], [[ARG1]]
502 ; CHECK-NEXT:    ret float [[FREM]]
504   %frem = frem float %arg0, %arg1
505   ret float %frem
508 attributes #0 = { "denormal-fp-math"="ieee,ieee" }
509 attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" }
510 attributes #2 = { "denormal-fp-math"="ieee,positive-zero" }
511 attributes #3 = { "denormal-fp-math"="ieee,dynamic" }
512 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
513 ; TUNIT: {{.*}}