[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / InstSimplify / fp-undef-poison-strictfp.ll
blob065b1f6410888e26063daffb46ef315520329b20
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
4 ; TODO: the instructions with poison operands should return poison
7 ; constrained fadd
10 define 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") #[[ATTR0:[0-9]+]]
13 ; CHECK-NEXT:    ret float [[R]]
15   %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
16   ret float %r
19 define 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") #[[ATTR0]]
22 ; CHECK-NEXT:    ret float [[R]]
24   %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
25   ret float %r
28 define 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") #[[ATTR0]]
31 ; CHECK-NEXT:    ret float [[R]]
33   %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
34   ret float %r
37 define float @fadd_undef_op0_defaultfp(float %x) #0 {
38 ; CHECK-LABEL: @fadd_undef_op0_defaultfp(
39 ; CHECK-NEXT:    ret float 0x7FF8000000000000
41   %r = call float @llvm.experimental.constrained.fadd.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
42   ret float %r
45 define 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") #[[ATTR0]]
48 ; CHECK-NEXT:    ret float poison
50   %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
51   ret float %r
54 define float @fadd_poison_op0_maytrap(float %x) #0 {
55 ; CHECK-LABEL: @fadd_poison_op0_maytrap(
56 ; CHECK-NEXT:    ret float poison
58   %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
59   ret float %r
62 define float @fadd_poison_op0_upward(float %x) #0 {
63 ; CHECK-LABEL: @fadd_poison_op0_upward(
64 ; CHECK-NEXT:    ret float poison
66   %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
67   ret float %r
70 define float @fadd_poison_op0_defaultfp(float %x) #0 {
71 ; CHECK-LABEL: @fadd_poison_op0_defaultfp(
72 ; CHECK-NEXT:    ret float poison
74   %r = call float @llvm.experimental.constrained.fadd.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
75   ret float %r
78 define 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") #[[ATTR0]]
81 ; CHECK-NEXT:    ret float [[R]]
83   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
84   ret float %r
87 define 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") #[[ATTR0]]
90 ; CHECK-NEXT:    ret float [[R]]
92   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
93   ret float %r
96 define 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") #[[ATTR0]]
99 ; CHECK-NEXT:    ret float [[R]]
101   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
102   ret float %r
105 define float @fadd_undef_op1_defaultfp(float %x) #0 {
106 ; CHECK-LABEL: @fadd_undef_op1_defaultfp(
107 ; CHECK-NEXT:    ret float 0x7FF8000000000000
109   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
110   ret float %r
113 define 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") #[[ATTR0]]
116 ; CHECK-NEXT:    ret float poison
118   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
119   ret float %r
122 define float @fadd_poison_op1_maytrap(float %x) #0 {
123 ; CHECK-LABEL: @fadd_poison_op1_maytrap(
124 ; CHECK-NEXT:    ret float poison
126   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
127   ret float %r
130 define float @fadd_poison_op1_upward(float %x) #0 {
131 ; CHECK-LABEL: @fadd_poison_op1_upward(
132 ; CHECK-NEXT:    ret float poison
134   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
135   ret float %r
138 define float @fadd_poison_op1_defaultfp(float %x) #0 {
139 ; CHECK-LABEL: @fadd_poison_op1_defaultfp(
140 ; CHECK-NEXT:    ret float poison
142   %r = call float @llvm.experimental.constrained.fadd.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
143   ret float %r
147 ; constrained fsub
150 define float @fsub_undef_op0_strict(float %x) {
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") #[[ATTR0]]
153 ; CHECK-NEXT:    ret float [[R]]
155   %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
156   ret float %r
159 define float @fsub_undef_op0_maytrap(float %x) {
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") #[[ATTR0]]
162 ; CHECK-NEXT:    ret float [[R]]
164   %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
165   ret float %r
168 define float @fsub_undef_op0_upward(float %x) {
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") #[[ATTR0]]
171 ; CHECK-NEXT:    ret float [[R]]
173   %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
174   ret float %r
177 define float @fsub_undef_op0_defaultfp(float %x) {
178 ; CHECK-LABEL: @fsub_undef_op0_defaultfp(
179 ; CHECK-NEXT:    ret float 0x7FF8000000000000
181   %r = call float @llvm.experimental.constrained.fsub.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
182   ret float %r
185 define float @fsub_poison_op0_strict(float %x) {
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") #[[ATTR0]]
188 ; CHECK-NEXT:    ret float poison
190   %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
191   ret float %r
194 define float @fsub_poison_op0_maytrap(float %x) {
195 ; CHECK-LABEL: @fsub_poison_op0_maytrap(
196 ; CHECK-NEXT:    ret float poison
198   %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
199   ret float %r
202 define float @fsub_poison_op0_upward(float %x) {
203 ; CHECK-LABEL: @fsub_poison_op0_upward(
204 ; CHECK-NEXT:    ret float poison
206   %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
207   ret float %r
210 define float @fsub_poison_op0_defaultfp(float %x) {
211 ; CHECK-LABEL: @fsub_poison_op0_defaultfp(
212 ; CHECK-NEXT:    ret float poison
214   %r = call float @llvm.experimental.constrained.fsub.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
215   ret float %r
218 define float @fsub_undef_op1_strict(float %x) {
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") #[[ATTR0]]
221 ; CHECK-NEXT:    ret float [[R]]
223   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
224   ret float %r
227 define float @fsub_undef_op1_maytrap(float %x) {
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") #[[ATTR0]]
230 ; CHECK-NEXT:    ret float [[R]]
232   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
233   ret float %r
236 define float @fsub_undef_op1_upward(float %x) {
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") #[[ATTR0]]
239 ; CHECK-NEXT:    ret float [[R]]
241   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
242   ret float %r
245 define float @fsub_undef_op1_defaultfp(float %x) {
246 ; CHECK-LABEL: @fsub_undef_op1_defaultfp(
247 ; CHECK-NEXT:    ret float 0x7FF8000000000000
249   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
250   ret float %r
253 define float @fsub_poison_op1_strict(float %x) {
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") #[[ATTR0]]
256 ; CHECK-NEXT:    ret float poison
258   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
259   ret float %r
262 define float @fsub_poison_op1_maytrap(float %x) {
263 ; CHECK-LABEL: @fsub_poison_op1_maytrap(
264 ; CHECK-NEXT:    ret float poison
266   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
267   ret float %r
270 define float @fsub_poison_op1_upward(float %x) {
271 ; CHECK-LABEL: @fsub_poison_op1_upward(
272 ; CHECK-NEXT:    ret float poison
274   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
275   ret float %r
278 define float @fsub_poison_op1_defaultfp(float %x) {
279 ; CHECK-LABEL: @fsub_poison_op1_defaultfp(
280 ; CHECK-NEXT:    ret float poison
282   %r = call float @llvm.experimental.constrained.fsub.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
283   ret float %r
287 ; constrained fmul
290 define float @fmul_undef_op0_strict(float %x) {
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") #[[ATTR0]]
293 ; CHECK-NEXT:    ret float [[R]]
295   %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
296   ret float %r
299 define float @fmul_undef_op0_maytrap(float %x) {
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") #[[ATTR0]]
302 ; CHECK-NEXT:    ret float [[R]]
304   %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
305   ret float %r
308 define float @fmul_undef_op0_upward(float %x) {
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") #[[ATTR0]]
311 ; CHECK-NEXT:    ret float [[R]]
313   %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
314   ret float %r
317 define float @fmul_undef_op0_defaultfp(float %x) {
318 ; CHECK-LABEL: @fmul_undef_op0_defaultfp(
319 ; CHECK-NEXT:    ret float 0x7FF8000000000000
321   %r = call float @llvm.experimental.constrained.fmul.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
322   ret float %r
325 define float @fmul_poison_op0_strict(float %x) {
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") #[[ATTR0]]
328 ; CHECK-NEXT:    ret float poison
330   %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
331   ret float %r
334 define float @fmul_poison_op0_maytrap(float %x) {
335 ; CHECK-LABEL: @fmul_poison_op0_maytrap(
336 ; CHECK-NEXT:    ret float poison
338   %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
339   ret float %r
342 define float @fmul_poison_op0_upward(float %x) {
343 ; CHECK-LABEL: @fmul_poison_op0_upward(
344 ; CHECK-NEXT:    ret float poison
346   %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
347   ret float %r
350 define float @fmul_poison_op0_defaultfp(float %x) {
351 ; CHECK-LABEL: @fmul_poison_op0_defaultfp(
352 ; CHECK-NEXT:    ret float poison
354   %r = call float @llvm.experimental.constrained.fmul.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
355   ret float %r
358 define float @fmul_undef_op1_strict(float %x) {
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") #[[ATTR0]]
361 ; CHECK-NEXT:    ret float [[R]]
363   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
364   ret float %r
367 define float @fmul_undef_op1_maytrap(float %x) {
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") #[[ATTR0]]
370 ; CHECK-NEXT:    ret float [[R]]
372   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
373   ret float %r
376 define float @fmul_undef_op1_upward(float %x) {
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") #[[ATTR0]]
379 ; CHECK-NEXT:    ret float [[R]]
381   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
382   ret float %r
385 define float @fmul_undef_op1_defaultfp(float %x) {
386 ; CHECK-LABEL: @fmul_undef_op1_defaultfp(
387 ; CHECK-NEXT:    ret float 0x7FF8000000000000
389   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
390   ret float %r
393 define float @fmul_poison_op1_strict(float %x) {
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") #[[ATTR0]]
396 ; CHECK-NEXT:    ret float poison
398   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
399   ret float %r
402 define float @fmul_poison_op1_maytrap(float %x) {
403 ; CHECK-LABEL: @fmul_poison_op1_maytrap(
404 ; CHECK-NEXT:    ret float poison
406   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
407   ret float %r
410 define float @fmul_poison_op1_upward(float %x) {
411 ; CHECK-LABEL: @fmul_poison_op1_upward(
412 ; CHECK-NEXT:    ret float poison
414   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
415   ret float %r
418 define float @fmul_poison_op1_defaultfp(float %x) {
419 ; CHECK-LABEL: @fmul_poison_op1_defaultfp(
420 ; CHECK-NEXT:    ret float poison
422   %r = call float @llvm.experimental.constrained.fmul.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
423   ret float %r
427 ; constrained fdiv
430 define float @fdiv_undef_op0_strict(float %x) {
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") #[[ATTR0]]
433 ; CHECK-NEXT:    ret float [[R]]
435   %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
436   ret float %r
439 define float @fdiv_undef_op0_maytrap(float %x) {
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") #[[ATTR0]]
442 ; CHECK-NEXT:    ret float [[R]]
444   %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
445   ret float %r
448 define float @fdiv_undef_op0_upward(float %x) {
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") #[[ATTR0]]
451 ; CHECK-NEXT:    ret float [[R]]
453   %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
454   ret float %r
457 define float @fdiv_undef_op0_defaultfp(float %x) {
458 ; CHECK-LABEL: @fdiv_undef_op0_defaultfp(
459 ; CHECK-NEXT:    ret float 0x7FF8000000000000
461   %r = call float @llvm.experimental.constrained.fdiv.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
462   ret float %r
465 define float @fdiv_poison_op0_strict(float %x) {
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") #[[ATTR0]]
468 ; CHECK-NEXT:    ret float poison
470   %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
471   ret float %r
474 define float @fdiv_poison_op0_maytrap(float %x) {
475 ; CHECK-LABEL: @fdiv_poison_op0_maytrap(
476 ; CHECK-NEXT:    ret float poison
478   %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
479   ret float %r
482 define float @fdiv_poison_op0_upward(float %x) {
483 ; CHECK-LABEL: @fdiv_poison_op0_upward(
484 ; CHECK-NEXT:    ret float poison
486   %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
487   ret float %r
490 define float @fdiv_poison_op0_defaultfp(float %x) {
491 ; CHECK-LABEL: @fdiv_poison_op0_defaultfp(
492 ; CHECK-NEXT:    ret float poison
494   %r = call float @llvm.experimental.constrained.fdiv.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
495   ret float %r
498 define float @fdiv_undef_op1_strict(float %x) {
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") #[[ATTR0]]
501 ; CHECK-NEXT:    ret float [[R]]
503   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
504   ret float %r
507 define float @fdiv_undef_op1_maytrap(float %x) {
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") #[[ATTR0]]
510 ; CHECK-NEXT:    ret float [[R]]
512   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
513   ret float %r
516 define float @fdiv_undef_op1_upward(float %x) {
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") #[[ATTR0]]
519 ; CHECK-NEXT:    ret float [[R]]
521   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
522   ret float %r
525 define float @fdiv_undef_op1_defaultfp(float %x) {
526 ; CHECK-LABEL: @fdiv_undef_op1_defaultfp(
527 ; CHECK-NEXT:    ret float 0x7FF8000000000000
529   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
530   ret float %r
533 define float @fdiv_poison_op1_strict(float %x) {
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") #[[ATTR0]]
536 ; CHECK-NEXT:    ret float poison
538   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
539   ret float %r
542 define float @fdiv_poison_op1_maytrap(float %x) {
543 ; CHECK-LABEL: @fdiv_poison_op1_maytrap(
544 ; CHECK-NEXT:    ret float poison
546   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
547   ret float %r
550 define float @fdiv_poison_op1_upward(float %x) {
551 ; CHECK-LABEL: @fdiv_poison_op1_upward(
552 ; CHECK-NEXT:    ret float poison
554   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
555   ret float %r
558 define float @fdiv_poison_op1_defaultfp(float %x) {
559 ; CHECK-LABEL: @fdiv_poison_op1_defaultfp(
560 ; CHECK-NEXT:    ret float poison
562   %r = call float @llvm.experimental.constrained.fdiv.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
563   ret float %r
567 ; constrained frem
570 define float @frem_undef_op0_strict(float %x) {
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") #[[ATTR0]]
573 ; CHECK-NEXT:    ret float [[R]]
575   %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
576   ret float %r
579 define float @frem_undef_op0_maytrap(float %x) {
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") #[[ATTR0]]
582 ; CHECK-NEXT:    ret float [[R]]
584   %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
585   ret float %r
588 define float @frem_undef_op0_upward(float %x) {
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") #[[ATTR0]]
591 ; CHECK-NEXT:    ret float [[R]]
593   %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
594   ret float %r
597 define float @frem_undef_op0_defaultfp(float %x) {
598 ; CHECK-LABEL: @frem_undef_op0_defaultfp(
599 ; CHECK-NEXT:    ret float 0x7FF8000000000000
601   %r = call float @llvm.experimental.constrained.frem.f32(float undef, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
602   ret float %r
605 define float @frem_poison_op0_strict(float %x) {
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") #[[ATTR0]]
608 ; CHECK-NEXT:    ret float poison
610   %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
611   ret float %r
614 define float @frem_poison_op0_maytrap(float %x) {
615 ; CHECK-LABEL: @frem_poison_op0_maytrap(
616 ; CHECK-NEXT:    ret float poison
618   %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
619   ret float %r
622 define float @frem_poison_op0_upward(float %x) {
623 ; CHECK-LABEL: @frem_poison_op0_upward(
624 ; CHECK-NEXT:    ret float poison
626   %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.upward", metadata !"fpexcept.ignore") #0
627   ret float %r
630 define float @frem_poison_op0_defaultfp(float %x) {
631 ; CHECK-LABEL: @frem_poison_op0_defaultfp(
632 ; CHECK-NEXT:    ret float poison
634   %r = call float @llvm.experimental.constrained.frem.f32(float poison, float %x, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
635   ret float %r
638 define float @frem_undef_op1_strict(float %x) {
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") #[[ATTR0]]
641 ; CHECK-NEXT:    ret float [[R]]
643   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
644   ret float %r
647 define float @frem_undef_op1_maytrap(float %x) {
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") #[[ATTR0]]
650 ; CHECK-NEXT:    ret float [[R]]
652   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
653   ret float %r
656 define float @frem_undef_op1_upward(float %x) {
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") #[[ATTR0]]
659 ; CHECK-NEXT:    ret float [[R]]
661   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
662   ret float %r
665 define float @frem_undef_op1_defaultfp(float %x) {
666 ; CHECK-LABEL: @frem_undef_op1_defaultfp(
667 ; CHECK-NEXT:    ret float 0x7FF8000000000000
669   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
670   ret float %r
673 define float @frem_poison_op1_strict(float %x) {
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") #[[ATTR0]]
676 ; CHECK-NEXT:    ret float poison
678   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
679   ret float %r
682 define float @frem_poison_op1_maytrap(float %x) {
683 ; CHECK-LABEL: @frem_poison_op1_maytrap(
684 ; CHECK-NEXT:    ret float poison
686   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
687   ret float %r
690 define float @frem_poison_op1_upward(float %x) {
691 ; CHECK-LABEL: @frem_poison_op1_upward(
692 ; CHECK-NEXT:    ret float poison
694   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
695   ret float %r
698 define float @frem_poison_op1_defaultfp(float %x) {
699 ; CHECK-LABEL: @frem_poison_op1_defaultfp(
700 ; CHECK-NEXT:    ret float poison
702   %r = call float @llvm.experimental.constrained.frem.f32(float %x, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
703   ret float %r
707 ; constrained fma
710 define float @fma_undef_op0_strict(float %x, float %y) {
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") #[[ATTR0]]
713 ; CHECK-NEXT:    ret float [[R]]
715   %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
716   ret float %r
719 define float @fma_undef_op0_maytrap(float %x, float %y) {
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") #[[ATTR0]]
722 ; CHECK-NEXT:    ret float [[R]]
724   %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
725   ret float %r
728 define float @fma_undef_op0_upward(float %x, float %y) {
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") #[[ATTR0]]
731 ; CHECK-NEXT:    ret float [[R]]
733   %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.upward", metadata !"fpexcept.ignore") #0
734   ret float %r
737 define float @fma_undef_op0_defaultfp(float %x, float %y) {
738 ; CHECK-LABEL: @fma_undef_op0_defaultfp(
739 ; CHECK-NEXT:    ret float 0x7FF8000000000000
741   %r = call float @llvm.experimental.constrained.fma.f32(float undef, float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
742   ret float %r
745 define float @fma_poison_op0_strict(float %x, float %y) {
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") #[[ATTR0]]
748 ; CHECK-NEXT:    ret float poison
750   %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
751   ret float %r
754 define float @fma_poison_op0_maytrap(float %x, float %y) {
755 ; CHECK-LABEL: @fma_poison_op0_maytrap(
756 ; CHECK-NEXT:    ret float poison
758   %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
759   ret float %r
762 define float @fma_poison_op0_upward(float %x, float %y) {
763 ; CHECK-LABEL: @fma_poison_op0_upward(
764 ; CHECK-NEXT:    ret float poison
766   %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.upward", metadata !"fpexcept.ignore") #0
767   ret float %r
770 define float @fma_poison_op0_defaultfp(float %x, float %y) {
771 ; CHECK-LABEL: @fma_poison_op0_defaultfp(
772 ; CHECK-NEXT:    ret float poison
774   %r = call float @llvm.experimental.constrained.fma.f32(float poison, float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
775   ret float %r
778 define float @fma_undef_op1_strict(float %x, float %y) {
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") #[[ATTR0]]
781 ; CHECK-NEXT:    ret float [[R]]
783   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
784   ret float %r
787 define float @fma_undef_op1_maytrap(float %x, float %y) {
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") #[[ATTR0]]
790 ; CHECK-NEXT:    ret float [[R]]
792   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
793   ret float %r
796 define float @fma_undef_op1_upward(float %x, float %y) {
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") #[[ATTR0]]
799 ; CHECK-NEXT:    ret float [[R]]
801   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.upward", metadata !"fpexcept.ignore") #0
802   ret float %r
805 define float @fma_undef_op1_defaultfp(float %x, float %y) {
806 ; CHECK-LABEL: @fma_undef_op1_defaultfp(
807 ; CHECK-NEXT:    ret float 0x7FF8000000000000
809   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float undef, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
810   ret float %r
813 define float @fma_poison_op1_strict(float %x, float %y) {
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") #[[ATTR0]]
816 ; CHECK-NEXT:    ret float poison
818   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
819   ret float %r
822 define float @fma_poison_op1_maytrap(float %x, float %y) {
823 ; CHECK-LABEL: @fma_poison_op1_maytrap(
824 ; CHECK-NEXT:    ret float poison
826   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
827   ret float %r
830 define float @fma_poison_op1_upward(float %x, float %y) {
831 ; CHECK-LABEL: @fma_poison_op1_upward(
832 ; CHECK-NEXT:    ret float poison
834   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.upward", metadata !"fpexcept.ignore") #0
835   ret float %r
838 define float @fma_poison_op1_defaultfp(float %x, float %y) {
839 ; CHECK-LABEL: @fma_poison_op1_defaultfp(
840 ; CHECK-NEXT:    ret float poison
842   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float poison, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
843   ret float %r
846 define float @fma_undef_op2_strict(float %x, float %y) {
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") #[[ATTR0]]
849 ; CHECK-NEXT:    ret float [[R]]
851   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
852   ret float %r
855 define float @fma_undef_op2_maytrap(float %x, float %y) {
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") #[[ATTR0]]
858 ; CHECK-NEXT:    ret float [[R]]
860   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
861   ret float %r
864 define float @fma_undef_op2_upward(float %x, float %y) {
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") #[[ATTR0]]
867 ; CHECK-NEXT:    ret float [[R]]
869   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.upward", metadata !"fpexcept.ignore") #0
870   ret float %r
873 define float @fma_undef_op2_defaultfp(float %x, float %y) {
874 ; CHECK-LABEL: @fma_undef_op2_defaultfp(
875 ; CHECK-NEXT:    ret float 0x7FF8000000000000
877   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float undef, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
878   ret float %r
881 define float @fma_poison_op2_strict(float %x, float %y) {
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") #[[ATTR0]]
884 ; CHECK-NEXT:    ret float poison
886   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
887   ret float %r
890 define float @fma_poison_op2_maytrap(float %x, float %y) {
891 ; CHECK-LABEL: @fma_poison_op2_maytrap(
892 ; CHECK-NEXT:    ret float poison
894   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.dynamic", metadata !"fpexcept.maytrap") #0
895   ret float %r
898 define float @fma_poison_op2_upward(float %x, float %y) {
899 ; CHECK-LABEL: @fma_poison_op2_upward(
900 ; CHECK-NEXT:    ret float poison
902   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.upward", metadata !"fpexcept.ignore") #0
903   ret float %r
906 define float @fma_poison_op2_defaultfp(float %x, float %y) {
907 ; CHECK-LABEL: @fma_poison_op2_defaultfp(
908 ; CHECK-NEXT:    ret float poison
910   %r = call float @llvm.experimental.constrained.fma.f32(float %x, float %y, float poison, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0
911   ret float %r
914 declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata) #0
915 declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata) #0
916 declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata) #0
917 declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata) #0
918 declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata) #0
919 declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) #0
921 attributes #0 = { strictfp }