xref: /llvm-project/llvm/test/Transforms/InstSimplify/fp-undef-poison-strictfp.ll (revision eb2558c5666cea0e509ae334ac20cf0f54a92032)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4; TODO: the instructions with poison operands should return poison
5
6;
7; constrained fadd
8;
9
10define float @fadd_undef_op0_strict(float %x) #0 {
11; CHECK-LABEL: @fadd_undef_op0_strict(
12; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
13; CHECK-NEXT:    ret float [[R]]
14;
15  %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
16  ret float %r
17}
18
19define float @fadd_undef_op0_maytrap(float %x) #0 {
20; CHECK-LABEL: @fadd_undef_op0_maytrap(
21; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
22; CHECK-NEXT:    ret float [[R]]
23;
24  %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
25  ret float %r
26}
27
28define float @fadd_undef_op0_upward(float %x) #0 {
29; CHECK-LABEL: @fadd_undef_op0_upward(
30; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float undef, float [[X:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
31; CHECK-NEXT:    ret float [[R]]
32;
33  %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
34  ret float %r
35}
36
37define float @fadd_undef_op0_defaultfp(float %x) #0 {
38; CHECK-LABEL: @fadd_undef_op0_defaultfp(
39; CHECK-NEXT:    ret float 0x7FF8000000000000
40;
41  %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
42  ret float %r
43}
44
45define float @fadd_poison_op0_strict(float %x) #0 {
46; CHECK-LABEL: @fadd_poison_op0_strict(
47; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float poison, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
48; CHECK-NEXT:    ret float poison
49;
50  %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
51  ret float %r
52}
53
54define float @fadd_poison_op0_maytrap(float %x) #0 {
55; CHECK-LABEL: @fadd_poison_op0_maytrap(
56; CHECK-NEXT:    ret float poison
57;
58  %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
59  ret float %r
60}
61
62define float @fadd_poison_op0_upward(float %x) #0 {
63; CHECK-LABEL: @fadd_poison_op0_upward(
64; CHECK-NEXT:    ret float poison
65;
66  %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
67  ret float %r
68}
69
70define float @fadd_poison_op0_defaultfp(float %x) #0 {
71; CHECK-LABEL: @fadd_poison_op0_defaultfp(
72; CHECK-NEXT:    ret float poison
73;
74  %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
75  ret float %r
76}
77
78define float @fadd_undef_op1_strict(float %x) #0 {
79; CHECK-LABEL: @fadd_undef_op1_strict(
80; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
81; CHECK-NEXT:    ret float [[R]]
82;
83  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
84  ret float %r
85}
86
87define float @fadd_undef_op1_maytrap(float %x) #0 {
88; CHECK-LABEL: @fadd_undef_op1_maytrap(
89; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
90; CHECK-NEXT:    ret float [[R]]
91;
92  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
93  ret float %r
94}
95
96define float @fadd_undef_op1_upward(float %x) #0 {
97; CHECK-LABEL: @fadd_undef_op1_upward(
98; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float [[X:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
99; CHECK-NEXT:    ret float [[R]]
100;
101  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
102  ret float %r
103}
104
105define float @fadd_undef_op1_defaultfp(float %x) #0 {
106; CHECK-LABEL: @fadd_undef_op1_defaultfp(
107; CHECK-NEXT:    ret float 0x7FF8000000000000
108;
109  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
110  ret float %r
111}
112
113define float @fadd_poison_op1_strict(float %x) #0 {
114; CHECK-LABEL: @fadd_poison_op1_strict(
115; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fadd.f32(float [[X:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
116; CHECK-NEXT:    ret float poison
117;
118  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
119  ret float %r
120}
121
122define float @fadd_poison_op1_maytrap(float %x) #0 {
123; CHECK-LABEL: @fadd_poison_op1_maytrap(
124; CHECK-NEXT:    ret float poison
125;
126  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
127  ret float %r
128}
129
130define float @fadd_poison_op1_upward(float %x) #0 {
131; CHECK-LABEL: @fadd_poison_op1_upward(
132; CHECK-NEXT:    ret float poison
133;
134  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
135  ret float %r
136}
137
138define float @fadd_poison_op1_defaultfp(float %x) #0 {
139; CHECK-LABEL: @fadd_poison_op1_defaultfp(
140; CHECK-NEXT:    ret float poison
141;
142  %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
143  ret float %r
144}
145
146;
147; constrained fsub
148;
149
150define float @fsub_undef_op0_strict(float %x) #0 {
151; CHECK-LABEL: @fsub_undef_op0_strict(
152; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
153; CHECK-NEXT:    ret float [[R]]
154;
155  %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
156  ret float %r
157}
158
159define float @fsub_undef_op0_maytrap(float %x) #0 {
160; CHECK-LABEL: @fsub_undef_op0_maytrap(
161; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
162; CHECK-NEXT:    ret float [[R]]
163;
164  %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
165  ret float %r
166}
167
168define float @fsub_undef_op0_upward(float %x) #0 {
169; CHECK-LABEL: @fsub_undef_op0_upward(
170; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float undef, float [[X:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
171; CHECK-NEXT:    ret float [[R]]
172;
173  %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
174  ret float %r
175}
176
177define float @fsub_undef_op0_defaultfp(float %x) #0 {
178; CHECK-LABEL: @fsub_undef_op0_defaultfp(
179; CHECK-NEXT:    ret float 0x7FF8000000000000
180;
181  %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
182  ret float %r
183}
184
185define float @fsub_poison_op0_strict(float %x) #0 {
186; CHECK-LABEL: @fsub_poison_op0_strict(
187; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float poison, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
188; CHECK-NEXT:    ret float poison
189;
190  %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
191  ret float %r
192}
193
194define float @fsub_poison_op0_maytrap(float %x) #0 {
195; CHECK-LABEL: @fsub_poison_op0_maytrap(
196; CHECK-NEXT:    ret float poison
197;
198  %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
199  ret float %r
200}
201
202define float @fsub_poison_op0_upward(float %x) #0 {
203; CHECK-LABEL: @fsub_poison_op0_upward(
204; CHECK-NEXT:    ret float poison
205;
206  %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
207  ret float %r
208}
209
210define float @fsub_poison_op0_defaultfp(float %x) #0 {
211; CHECK-LABEL: @fsub_poison_op0_defaultfp(
212; CHECK-NEXT:    ret float poison
213;
214  %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
215  ret float %r
216}
217
218define float @fsub_undef_op1_strict(float %x) #0 {
219; CHECK-LABEL: @fsub_undef_op1_strict(
220; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
221; CHECK-NEXT:    ret float [[R]]
222;
223  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
224  ret float %r
225}
226
227define float @fsub_undef_op1_maytrap(float %x) #0 {
228; CHECK-LABEL: @fsub_undef_op1_maytrap(
229; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
230; CHECK-NEXT:    ret float [[R]]
231;
232  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
233  ret float %r
234}
235
236define float @fsub_undef_op1_upward(float %x) #0 {
237; CHECK-LABEL: @fsub_undef_op1_upward(
238; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[X:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
239; CHECK-NEXT:    ret float [[R]]
240;
241  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
242  ret float %r
243}
244
245define float @fsub_undef_op1_defaultfp(float %x) #0 {
246; CHECK-LABEL: @fsub_undef_op1_defaultfp(
247; CHECK-NEXT:    ret float 0x7FF8000000000000
248;
249  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
250  ret float %r
251}
252
253define float @fsub_poison_op1_strict(float %x) #0 {
254; CHECK-LABEL: @fsub_poison_op1_strict(
255; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fsub.f32(float [[X:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
256; CHECK-NEXT:    ret float poison
257;
258  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
259  ret float %r
260}
261
262define float @fsub_poison_op1_maytrap(float %x) #0 {
263; CHECK-LABEL: @fsub_poison_op1_maytrap(
264; CHECK-NEXT:    ret float poison
265;
266  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
267  ret float %r
268}
269
270define float @fsub_poison_op1_upward(float %x) #0 {
271; CHECK-LABEL: @fsub_poison_op1_upward(
272; CHECK-NEXT:    ret float poison
273;
274  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
275  ret float %r
276}
277
278define float @fsub_poison_op1_defaultfp(float %x) #0 {
279; CHECK-LABEL: @fsub_poison_op1_defaultfp(
280; CHECK-NEXT:    ret float poison
281;
282  %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
283  ret float %r
284}
285
286;
287; constrained fmul
288;
289
290define float @fmul_undef_op0_strict(float %x) #0 {
291; CHECK-LABEL: @fmul_undef_op0_strict(
292; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
293; CHECK-NEXT:    ret float [[R]]
294;
295  %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
296  ret float %r
297}
298
299define float @fmul_undef_op0_maytrap(float %x) #0 {
300; CHECK-LABEL: @fmul_undef_op0_maytrap(
301; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
302; CHECK-NEXT:    ret float [[R]]
303;
304  %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
305  ret float %r
306}
307
308define float @fmul_undef_op0_upward(float %x) #0 {
309; CHECK-LABEL: @fmul_undef_op0_upward(
310; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float undef, float [[X:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
311; CHECK-NEXT:    ret float [[R]]
312;
313  %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
314  ret float %r
315}
316
317define float @fmul_undef_op0_defaultfp(float %x) #0 {
318; CHECK-LABEL: @fmul_undef_op0_defaultfp(
319; CHECK-NEXT:    ret float 0x7FF8000000000000
320;
321  %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
322  ret float %r
323}
324
325define float @fmul_poison_op0_strict(float %x) #0 {
326; CHECK-LABEL: @fmul_poison_op0_strict(
327; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float poison, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
328; CHECK-NEXT:    ret float poison
329;
330  %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
331  ret float %r
332}
333
334define float @fmul_poison_op0_maytrap(float %x) #0 {
335; CHECK-LABEL: @fmul_poison_op0_maytrap(
336; CHECK-NEXT:    ret float poison
337;
338  %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
339  ret float %r
340}
341
342define float @fmul_poison_op0_upward(float %x) #0 {
343; CHECK-LABEL: @fmul_poison_op0_upward(
344; CHECK-NEXT:    ret float poison
345;
346  %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
347  ret float %r
348}
349
350define float @fmul_poison_op0_defaultfp(float %x) #0 {
351; CHECK-LABEL: @fmul_poison_op0_defaultfp(
352; CHECK-NEXT:    ret float poison
353;
354  %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
355  ret float %r
356}
357
358define float @fmul_undef_op1_strict(float %x) #0 {
359; CHECK-LABEL: @fmul_undef_op1_strict(
360; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
361; CHECK-NEXT:    ret float [[R]]
362;
363  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
364  ret float %r
365}
366
367define float @fmul_undef_op1_maytrap(float %x) #0 {
368; CHECK-LABEL: @fmul_undef_op1_maytrap(
369; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
370; CHECK-NEXT:    ret float [[R]]
371;
372  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
373  ret float %r
374}
375
376define float @fmul_undef_op1_upward(float %x) #0 {
377; CHECK-LABEL: @fmul_undef_op1_upward(
378; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float [[X:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
379; CHECK-NEXT:    ret float [[R]]
380;
381  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
382  ret float %r
383}
384
385define float @fmul_undef_op1_defaultfp(float %x) #0 {
386; CHECK-LABEL: @fmul_undef_op1_defaultfp(
387; CHECK-NEXT:    ret float 0x7FF8000000000000
388;
389  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
390  ret float %r
391}
392
393define float @fmul_poison_op1_strict(float %x) #0 {
394; CHECK-LABEL: @fmul_poison_op1_strict(
395; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fmul.f32(float [[X:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
396; CHECK-NEXT:    ret float poison
397;
398  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
399  ret float %r
400}
401
402define float @fmul_poison_op1_maytrap(float %x) #0 {
403; CHECK-LABEL: @fmul_poison_op1_maytrap(
404; CHECK-NEXT:    ret float poison
405;
406  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
407  ret float %r
408}
409
410define float @fmul_poison_op1_upward(float %x) #0 {
411; CHECK-LABEL: @fmul_poison_op1_upward(
412; CHECK-NEXT:    ret float poison
413;
414  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
415  ret float %r
416}
417
418define float @fmul_poison_op1_defaultfp(float %x) #0 {
419; CHECK-LABEL: @fmul_poison_op1_defaultfp(
420; CHECK-NEXT:    ret float poison
421;
422  %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
423  ret float %r
424}
425
426;
427; constrained fdiv
428;
429
430define float @fdiv_undef_op0_strict(float %x) #0 {
431; CHECK-LABEL: @fdiv_undef_op0_strict(
432; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
433; CHECK-NEXT:    ret float [[R]]
434;
435  %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
436  ret float %r
437}
438
439define float @fdiv_undef_op0_maytrap(float %x) #0 {
440; CHECK-LABEL: @fdiv_undef_op0_maytrap(
441; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
442; CHECK-NEXT:    ret float [[R]]
443;
444  %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
445  ret float %r
446}
447
448define float @fdiv_undef_op0_upward(float %x) #0 {
449; CHECK-LABEL: @fdiv_undef_op0_upward(
450; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float undef, float [[X:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
451; CHECK-NEXT:    ret float [[R]]
452;
453  %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
454  ret float %r
455}
456
457define float @fdiv_undef_op0_defaultfp(float %x) #0 {
458; CHECK-LABEL: @fdiv_undef_op0_defaultfp(
459; CHECK-NEXT:    ret float 0x7FF8000000000000
460;
461  %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
462  ret float %r
463}
464
465define float @fdiv_poison_op0_strict(float %x) #0 {
466; CHECK-LABEL: @fdiv_poison_op0_strict(
467; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float poison, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
468; CHECK-NEXT:    ret float poison
469;
470  %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
471  ret float %r
472}
473
474define float @fdiv_poison_op0_maytrap(float %x) #0 {
475; CHECK-LABEL: @fdiv_poison_op0_maytrap(
476; CHECK-NEXT:    ret float poison
477;
478  %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
479  ret float %r
480}
481
482define float @fdiv_poison_op0_upward(float %x) #0 {
483; CHECK-LABEL: @fdiv_poison_op0_upward(
484; CHECK-NEXT:    ret float poison
485;
486  %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
487  ret float %r
488}
489
490define float @fdiv_poison_op0_defaultfp(float %x) #0 {
491; CHECK-LABEL: @fdiv_poison_op0_defaultfp(
492; CHECK-NEXT:    ret float poison
493;
494  %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
495  ret float %r
496}
497
498define float @fdiv_undef_op1_strict(float %x) #0 {
499; CHECK-LABEL: @fdiv_undef_op1_strict(
500; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
501; CHECK-NEXT:    ret float [[R]]
502;
503  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
504  ret float %r
505}
506
507define float @fdiv_undef_op1_maytrap(float %x) #0 {
508; CHECK-LABEL: @fdiv_undef_op1_maytrap(
509; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
510; CHECK-NEXT:    ret float [[R]]
511;
512  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
513  ret float %r
514}
515
516define float @fdiv_undef_op1_upward(float %x) #0 {
517; CHECK-LABEL: @fdiv_undef_op1_upward(
518; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float [[X:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
519; CHECK-NEXT:    ret float [[R]]
520;
521  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
522  ret float %r
523}
524
525define float @fdiv_undef_op1_defaultfp(float %x) #0 {
526; CHECK-LABEL: @fdiv_undef_op1_defaultfp(
527; CHECK-NEXT:    ret float 0x7FF8000000000000
528;
529  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
530  ret float %r
531}
532
533define float @fdiv_poison_op1_strict(float %x) #0 {
534; CHECK-LABEL: @fdiv_poison_op1_strict(
535; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fdiv.f32(float [[X:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
536; CHECK-NEXT:    ret float poison
537;
538  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
539  ret float %r
540}
541
542define float @fdiv_poison_op1_maytrap(float %x) #0 {
543; CHECK-LABEL: @fdiv_poison_op1_maytrap(
544; CHECK-NEXT:    ret float poison
545;
546  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
547  ret float %r
548}
549
550define float @fdiv_poison_op1_upward(float %x) #0 {
551; CHECK-LABEL: @fdiv_poison_op1_upward(
552; CHECK-NEXT:    ret float poison
553;
554  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
555  ret float %r
556}
557
558define float @fdiv_poison_op1_defaultfp(float %x) #0 {
559; CHECK-LABEL: @fdiv_poison_op1_defaultfp(
560; CHECK-NEXT:    ret float poison
561;
562  %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
563  ret float %r
564}
565
566;
567; constrained frem
568;
569
570define float @frem_undef_op0_strict(float %x) #0 {
571; CHECK-LABEL: @frem_undef_op0_strict(
572; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
573; CHECK-NEXT:    ret float [[R]]
574;
575  %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
576  ret float %r
577}
578
579define float @frem_undef_op0_maytrap(float %x) #0 {
580; CHECK-LABEL: @frem_undef_op0_maytrap(
581; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float undef, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
582; CHECK-NEXT:    ret float [[R]]
583;
584  %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
585  ret float %r
586}
587
588define float @frem_undef_op0_upward(float %x) #0 {
589; CHECK-LABEL: @frem_undef_op0_upward(
590; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float undef, float [[X:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
591; CHECK-NEXT:    ret float [[R]]
592;
593  %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
594  ret float %r
595}
596
597define float @frem_undef_op0_defaultfp(float %x) #0 {
598; CHECK-LABEL: @frem_undef_op0_defaultfp(
599; CHECK-NEXT:    ret float 0x7FF8000000000000
600;
601  %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
602  ret float %r
603}
604
605define float @frem_poison_op0_strict(float %x) #0 {
606; CHECK-LABEL: @frem_poison_op0_strict(
607; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float poison, float [[X:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
608; CHECK-NEXT:    ret float poison
609;
610  %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict")
611  ret float %r
612}
613
614define float @frem_poison_op0_maytrap(float %x) #0 {
615; CHECK-LABEL: @frem_poison_op0_maytrap(
616; CHECK-NEXT:    ret float poison
617;
618  %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
619  ret float %r
620}
621
622define float @frem_poison_op0_upward(float %x) #0 {
623; CHECK-LABEL: @frem_poison_op0_upward(
624; CHECK-NEXT:    ret float poison
625;
626  %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore")
627  ret float %r
628}
629
630define float @frem_poison_op0_defaultfp(float %x) #0 {
631; CHECK-LABEL: @frem_poison_op0_defaultfp(
632; CHECK-NEXT:    ret float poison
633;
634  %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore")
635  ret float %r
636}
637
638define float @frem_undef_op1_strict(float %x) #0 {
639; CHECK-LABEL: @frem_undef_op1_strict(
640; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
641; CHECK-NEXT:    ret float [[R]]
642;
643  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
644  ret float %r
645}
646
647define float @frem_undef_op1_maytrap(float %x) #0 {
648; CHECK-LABEL: @frem_undef_op1_maytrap(
649; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float [[X:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
650; CHECK-NEXT:    ret float [[R]]
651;
652  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
653  ret float %r
654}
655
656define float @frem_undef_op1_upward(float %x) #0 {
657; CHECK-LABEL: @frem_undef_op1_upward(
658; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float [[X:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
659; CHECK-NEXT:    ret float [[R]]
660;
661  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
662  ret float %r
663}
664
665define float @frem_undef_op1_defaultfp(float %x) #0 {
666; CHECK-LABEL: @frem_undef_op1_defaultfp(
667; CHECK-NEXT:    ret float 0x7FF8000000000000
668;
669  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
670  ret float %r
671}
672
673define float @frem_poison_op1_strict(float %x) #0 {
674; CHECK-LABEL: @frem_poison_op1_strict(
675; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.frem.f32(float [[X:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
676; CHECK-NEXT:    ret float poison
677;
678  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
679  ret float %r
680}
681
682define float @frem_poison_op1_maytrap(float %x) #0 {
683; CHECK-LABEL: @frem_poison_op1_maytrap(
684; CHECK-NEXT:    ret float poison
685;
686  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
687  ret float %r
688}
689
690define float @frem_poison_op1_upward(float %x) #0 {
691; CHECK-LABEL: @frem_poison_op1_upward(
692; CHECK-NEXT:    ret float poison
693;
694  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
695  ret float %r
696}
697
698define float @frem_poison_op1_defaultfp(float %x) #0 {
699; CHECK-LABEL: @frem_poison_op1_defaultfp(
700; CHECK-NEXT:    ret float poison
701;
702  %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
703  ret float %r
704}
705
706;
707; constrained fma
708;
709
710define float @fma_undef_op0_strict(float %x, float %y) #0 {
711; CHECK-LABEL: @fma_undef_op0_strict(
712; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float undef, float [[X:%.*]], float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
713; CHECK-NEXT:    ret float [[R]]
714;
715  %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict")
716  ret float %r
717}
718
719define float @fma_undef_op0_maytrap(float %x, float %y) #0 {
720; CHECK-LABEL: @fma_undef_op0_maytrap(
721; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float undef, float [[X:%.*]], float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
722; CHECK-NEXT:    ret float [[R]]
723;
724  %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
725  ret float %r
726}
727
728define float @fma_undef_op0_upward(float %x, float %y) #0 {
729; CHECK-LABEL: @fma_undef_op0_upward(
730; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float undef, float [[X:%.*]], float [[Y:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
731; CHECK-NEXT:    ret float [[R]]
732;
733  %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.upward", metadata !"fpexcept.ignore")
734  ret float %r
735}
736
737define float @fma_undef_op0_defaultfp(float %x, float %y) #0 {
738; CHECK-LABEL: @fma_undef_op0_defaultfp(
739; CHECK-NEXT:    ret float 0x7FF8000000000000
740;
741  %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
742  ret float %r
743}
744
745define float @fma_poison_op0_strict(float %x, float %y) #0 {
746; CHECK-LABEL: @fma_poison_op0_strict(
747; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float poison, float [[X:%.*]], float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
748; CHECK-NEXT:    ret float poison
749;
750  %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict")
751  ret float %r
752}
753
754define float @fma_poison_op0_maytrap(float %x, float %y) #0 {
755; CHECK-LABEL: @fma_poison_op0_maytrap(
756; CHECK-NEXT:    ret float poison
757;
758  %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
759  ret float %r
760}
761
762define float @fma_poison_op0_upward(float %x, float %y) #0 {
763; CHECK-LABEL: @fma_poison_op0_upward(
764; CHECK-NEXT:    ret float poison
765;
766  %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.upward", metadata !"fpexcept.ignore")
767  ret float %r
768}
769
770define float @fma_poison_op0_defaultfp(float %x, float %y) #0 {
771; CHECK-LABEL: @fma_poison_op0_defaultfp(
772; CHECK-NEXT:    ret float poison
773;
774  %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
775  ret float %r
776}
777
778define float @fma_undef_op1_strict(float %x, float %y) #0 {
779; CHECK-LABEL: @fma_undef_op1_strict(
780; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float undef, float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
781; CHECK-NEXT:    ret float [[R]]
782;
783  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict")
784  ret float %r
785}
786
787define float @fma_undef_op1_maytrap(float %x, float %y) #0 {
788; CHECK-LABEL: @fma_undef_op1_maytrap(
789; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float undef, float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.maytrap")
790; CHECK-NEXT:    ret float [[R]]
791;
792  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
793  ret float %r
794}
795
796define float @fma_undef_op1_upward(float %x, float %y) #0 {
797; CHECK-LABEL: @fma_undef_op1_upward(
798; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float undef, float [[Y:%.*]], metadata !"round.upward", metadata !"fpexcept.ignore")
799; CHECK-NEXT:    ret float [[R]]
800;
801  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.upward", metadata !"fpexcept.ignore")
802  ret float %r
803}
804
805define float @fma_undef_op1_defaultfp(float %x, float %y) #0 {
806; CHECK-LABEL: @fma_undef_op1_defaultfp(
807; CHECK-NEXT:    ret float 0x7FF8000000000000
808;
809  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
810  ret float %r
811}
812
813define float @fma_poison_op1_strict(float %x, float %y) #0 {
814; CHECK-LABEL: @fma_poison_op1_strict(
815; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float poison, float [[Y:%.*]], metadata !"round.dynamic", metadata !"fpexcept.strict")
816; CHECK-NEXT:    ret float poison
817;
818  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict")
819  ret float %r
820}
821
822define float @fma_poison_op1_maytrap(float %x, float %y) #0 {
823; CHECK-LABEL: @fma_poison_op1_maytrap(
824; CHECK-NEXT:    ret float poison
825;
826  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
827  ret float %r
828}
829
830define float @fma_poison_op1_upward(float %x, float %y) #0 {
831; CHECK-LABEL: @fma_poison_op1_upward(
832; CHECK-NEXT:    ret float poison
833;
834  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.upward", metadata !"fpexcept.ignore")
835  ret float %r
836}
837
838define float @fma_poison_op1_defaultfp(float %x, float %y) #0 {
839; CHECK-LABEL: @fma_poison_op1_defaultfp(
840; CHECK-NEXT:    ret float poison
841;
842  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
843  ret float %r
844}
845
846define float @fma_undef_op2_strict(float %x, float %y) #0 {
847; CHECK-LABEL: @fma_undef_op2_strict(
848; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float [[Y:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
849; CHECK-NEXT:    ret float [[R]]
850;
851  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict")
852  ret float %r
853}
854
855define float @fma_undef_op2_maytrap(float %x, float %y) #0 {
856; CHECK-LABEL: @fma_undef_op2_maytrap(
857; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float [[Y:%.*]], float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
858; CHECK-NEXT:    ret float [[R]]
859;
860  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
861  ret float %r
862}
863
864define float @fma_undef_op2_upward(float %x, float %y) #0 {
865; CHECK-LABEL: @fma_undef_op2_upward(
866; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float [[Y:%.*]], float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
867; CHECK-NEXT:    ret float [[R]]
868;
869  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.upward", metadata !"fpexcept.ignore")
870  ret float %r
871}
872
873define float @fma_undef_op2_defaultfp(float %x, float %y) #0 {
874; CHECK-LABEL: @fma_undef_op2_defaultfp(
875; CHECK-NEXT:    ret float 0x7FF8000000000000
876;
877  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore")
878  ret float %r
879}
880
881define float @fma_poison_op2_strict(float %x, float %y) #0 {
882; CHECK-LABEL: @fma_poison_op2_strict(
883; CHECK-NEXT:    [[R:%.*]] = call float @llvm.experimental.constrained.fma.f32(float [[X:%.*]], float [[Y:%.*]], float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
884; CHECK-NEXT:    ret float poison
885;
886  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict")
887  ret float %r
888}
889
890define float @fma_poison_op2_maytrap(float %x, float %y) #0 {
891; CHECK-LABEL: @fma_poison_op2_maytrap(
892; CHECK-NEXT:    ret float poison
893;
894  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
895  ret float %r
896}
897
898define float @fma_poison_op2_upward(float %x, float %y) #0 {
899; CHECK-LABEL: @fma_poison_op2_upward(
900; CHECK-NEXT:    ret float poison
901;
902  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.upward", metadata !"fpexcept.ignore")
903  ret float %r
904}
905
906define float @fma_poison_op2_defaultfp(float %x, float %y) #0 {
907; CHECK-LABEL: @fma_poison_op2_defaultfp(
908; CHECK-NEXT:    ret float poison
909;
910  %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore")
911  ret float %r
912}
913
914declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
915declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)
916declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)
917declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata)
918declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata)
919declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)
920
921attributes #0 = { strictfp }
922