xref: /llvm-project/llvm/test/Transforms/Attributor/nofpclass-frem.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
4define 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]]
9;
10  %frem = frem float %arg0, %arg1
11  ret float %frem
12}
13
14define 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]]
19;
20  %frem = frem float %arg0, %arg1
21  ret float %frem
22}
23
24define 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]]
29;
30  %frem = frem float %arg0, %arg1
31  ret float %frem
32}
33
34define 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]]
39;
40  %frem = frem float %arg0, %arg1
41  ret float %frem
42}
43
44define 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]]
49;
50  %frem = frem float %arg0, %arg1
51  ret float %frem
52}
53
54define 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]]
59;
60  %frem = frem float %arg0, %arg1
61  ret float %frem
62}
63
64define 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]]
69;
70  %frem = frem float %arg0, %arg1
71  ret float %frem
72}
73
74define 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]]
79;
80  %frem = frem float %arg0, %arg1
81  ret float %frem
82}
83
84define 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]]
89;
90  %frem = frem float %arg0, %arg1
91  ret float %frem
92}
93
94define 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]]
99;
100  %frem = frem float %arg0, %arg1
101  ret float %frem
102}
103
104define 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]]
109;
110  %frem = frem float %arg0, %arg1
111  ret float %frem
112}
113
114define 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]]
119;
120  %frem = frem float %arg0, %arg1
121  ret float %frem
122}
123
124define 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]]
129;
130  %frem = frem float %arg0, %arg1
131  ret float %frem
132}
133
134define 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]]
139;
140  %frem = frem float %arg0, %arg1
141  ret float %frem
142}
143
144define 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]]
149;
150  %frem = frem float %arg0, %arg1
151  ret float %frem
152}
153
154define 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]]
159;
160  %frem = frem float %arg0, %arg1
161  ret float %frem
162}
163
164define 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]]
169;
170  %frem = frem float %arg0, %arg1
171  ret float %frem
172}
173
174define 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]]
179;
180  %frem = frem float %arg0, %arg1
181  ret float %frem
182}
183
184define 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]]
189;
190  %frem = frem float %arg0, %arg1
191  ret float %frem
192}
193
194define 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]]
199;
200  %frem = frem float %arg0, %arg1
201  ret float %frem
202}
203
204define 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]]
209;
210  %frem = frem float %arg0, %arg1
211  ret float %frem
212}
213
214define 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]]
219;
220  %frem = frem float %arg0, %arg1
221  ret float %frem
222}
223
224define 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]]
229;
230  %frem = frem float %arg0, %arg1
231  ret float %frem
232}
233
234define 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]]
239;
240  %frem = frem float %arg0, %arg1
241  ret float %frem
242}
243
244; Denormal mode doesn't matter because sources are nofpclass(sub)
245define 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]]
250;
251  %frem = frem float %arg0, %arg1
252  ret float %frem
253}
254
255define 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]]
260;
261  %frem = frem float %arg0, %arg1
262  ret float %frem
263}
264
265define 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]]
270;
271  %frem = frem float %arg0, %arg1
272  ret float %frem
273}
274
275; Missing no-subnormal on lhs
276define 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]]
281;
282  %frem = frem float %arg0, %arg1
283  ret float %frem
284}
285
286; Missing no-subnormal on lhs
287define 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]]
292;
293  %frem = frem float %arg0, %arg1
294  ret float %frem
295}
296
297; should be able to infer noinf
298define 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]]
303;
304  %frem = frem float %arg0, %arg1
305  ret float %frem
306}
307
308define 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]]
313;
314  %frem = frem float %arg0, %arg1
315  ret float %frem
316}
317
318define 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]]
323;
324  %frem = frem float %arg0, %arg1
325  ret float %frem
326}
327
328define 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]]
333;
334  %frem = frem float %arg0, %arg1
335  ret float %frem
336}
337
338define 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]]
343;
344  %frem = frem float %arg0, %arg1
345  ret float %frem
346}
347
348define 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]]
353;
354  %frem = frem float %arg0, %arg1
355  ret float %frem
356}
357
358define 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]]
363;
364  %frem = frem float %arg, %arg
365  ret float %frem
366}
367
368define 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]]
373;
374  %frem = frem float %arg, %arg
375  ret float %frem
376}
377
378define 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]]
383;
384  %frem = frem float %arg, %arg
385  ret float %frem
386}
387
388define 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]]
393;
394  %frem = frem float %arg, %arg
395  ret float %frem
396}
397
398define 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]]
403;
404  %frem = frem float %arg0, %arg1
405  ret float %frem
406}
407
408define 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]]
413;
414  %frem = frem float %arg0, %arg1
415  ret float %frem
416}
417
418define 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]]
423;
424  %frem = frem float %arg0, %arg1
425  ret float %frem
426}
427
428define 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]]
433;
434  %frem = frem float %arg0, %arg1
435  ret float %frem
436}
437
438define 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]]
443;
444  %frem = frem float %arg0, %arg1
445  ret float %frem
446}
447
448define 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]]
453;
454  %frem = frem float %arg0, %arg1
455  ret float %frem
456}
457
458define 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]]
463;
464  %frem = frem float %arg0, %arg1
465  ret float %frem
466}
467
468define 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]]
473;
474  %frem = frem float %arg0, %arg1
475  ret float %frem
476}
477
478define 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]]
483;
484  %frem = frem float %arg0, %arg1
485  ret float %frem
486}
487
488define 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]]
493;
494  %frem = frem float %arg0, %arg1
495  ret float %frem
496}
497
498define 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]]
503;
504  %frem = frem float %arg0, %arg1
505  ret float %frem
506}
507
508attributes #0 = { "denormal-fp-math"="ieee,ieee" }
509attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" }
510attributes #2 = { "denormal-fp-math"="ieee,positive-zero" }
511attributes #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: {{.*}}
514