1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown                        | FileCheck %s --check-prefix=ANY
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s --check-prefix=ANY
4
5; This is duplicated from tests for InstSimplify. If you're
6; adding something here, you should probably add it there too.
7
8define float @fadd_undef_op0(float %x) {
9; ANY-LABEL: fadd_undef_op0:
10; ANY:       # %bb.0:
11; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
12; ANY-NEXT:    retq
13  %r = fadd float undef, %x
14  ret float %r
15}
16
17define float @fadd_undef_op1(float %x) {
18; ANY-LABEL: fadd_undef_op1:
19; ANY:       # %bb.0:
20; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
21; ANY-NEXT:    retq
22  %r = fadd float %x, undef
23  ret float %r
24}
25
26define float @fsub_undef_op0(float %x) {
27; ANY-LABEL: fsub_undef_op0:
28; ANY:       # %bb.0:
29; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
30; ANY-NEXT:    retq
31  %r = fsub float undef, %x
32  ret float %r
33}
34
35define float @fsub_undef_op1(float %x) {
36; ANY-LABEL: fsub_undef_op1:
37; ANY:       # %bb.0:
38; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
39; ANY-NEXT:    retq
40  %r = fsub float %x, undef
41  ret float %r
42}
43
44define float @fmul_undef_op0(float %x) {
45; ANY-LABEL: fmul_undef_op0:
46; ANY:       # %bb.0:
47; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
48; ANY-NEXT:    retq
49  %r = fmul float undef, %x
50  ret float %r
51}
52
53define float @fmul_undef_op1(float %x) {
54; ANY-LABEL: fmul_undef_op1:
55; ANY:       # %bb.0:
56; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
57; ANY-NEXT:    retq
58  %r = fmul float %x, undef
59  ret float %r
60}
61
62define float @fdiv_undef_op0(float %x) {
63; ANY-LABEL: fdiv_undef_op0:
64; ANY:       # %bb.0:
65; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
66; ANY-NEXT:    retq
67  %r = fdiv float undef, %x
68  ret float %r
69}
70
71define float @fdiv_undef_op1(float %x) {
72; ANY-LABEL: fdiv_undef_op1:
73; ANY:       # %bb.0:
74; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
75; ANY-NEXT:    retq
76  %r = fdiv float %x, undef
77  ret float %r
78}
79
80define float @frem_undef_op0(float %x) {
81; ANY-LABEL: frem_undef_op0:
82; ANY:       # %bb.0:
83; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
84; ANY-NEXT:    retq
85  %r = frem float undef, %x
86  ret float %r
87}
88
89define float @frem_undef_op1(float %x) {
90; ANY-LABEL: frem_undef_op1:
91; ANY:       # %bb.0:
92; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
93; ANY-NEXT:    retq
94  %r = frem float %x, undef
95  ret float %r
96}
97
98; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage.
99
100define float @fadd_undef_op0_nnan(float %x) {
101; ANY-LABEL: fadd_undef_op0_nnan:
102; ANY:       # %bb.0:
103; ANY-NEXT:    retq
104  %r = fadd nnan float undef, %x
105  ret float %r
106}
107
108define float @fadd_undef_op1_fast(float %x) {
109; ANY-LABEL: fadd_undef_op1_fast:
110; ANY:       # %bb.0:
111; ANY-NEXT:    retq
112  %r = fadd fast float %x, undef
113  ret float %r
114}
115
116define float @fsub_undef_op0_fast(float %x) {
117; ANY-LABEL: fsub_undef_op0_fast:
118; ANY:       # %bb.0:
119; ANY-NEXT:    retq
120  %r = fsub fast float undef, %x
121  ret float %r
122}
123
124define float @fsub_undef_op1_nnan(float %x) {
125; ANY-LABEL: fsub_undef_op1_nnan:
126; ANY:       # %bb.0:
127; ANY-NEXT:    retq
128  %r = fsub nnan float %x, undef
129  ret float %r
130}
131
132define float @fmul_undef_op0_nnan(float %x) {
133; ANY-LABEL: fmul_undef_op0_nnan:
134; ANY:       # %bb.0:
135; ANY-NEXT:    retq
136  %r = fmul nnan float undef, %x
137  ret float %r
138}
139
140define float @fmul_undef_op1_fast(float %x) {
141; ANY-LABEL: fmul_undef_op1_fast:
142; ANY:       # %bb.0:
143; ANY-NEXT:    retq
144  %r = fmul fast float %x, undef
145  ret float %r
146}
147
148define float @fdiv_undef_op0_fast(float %x) {
149; ANY-LABEL: fdiv_undef_op0_fast:
150; ANY:       # %bb.0:
151; ANY-NEXT:    retq
152  %r = fdiv fast float undef, %x
153  ret float %r
154}
155
156define float @fdiv_undef_op1_nnan(float %x) {
157; ANY-LABEL: fdiv_undef_op1_nnan:
158; ANY:       # %bb.0:
159; ANY-NEXT:    retq
160  %r = fdiv nnan float %x, undef
161  ret float %r
162}
163
164define float @frem_undef_op0_nnan(float %x) {
165; ANY-LABEL: frem_undef_op0_nnan:
166; ANY:       # %bb.0:
167; ANY-NEXT:    retq
168  %r = frem nnan float undef, %x
169  ret float %r
170}
171
172define float @frem_undef_op1_fast(float %x) {
173; ANY-LABEL: frem_undef_op1_fast:
174; ANY:       # %bb.0:
175; ANY-NEXT:    retq
176  %r = frem fast float %x, undef
177  ret float %r
178}
179
180; Constant folding - undef undef.
181
182define double @fadd_undef_undef(double %x) {
183; ANY-LABEL: fadd_undef_undef:
184; ANY:       # %bb.0:
185; ANY-NEXT:    retq
186  %r = fadd double undef, undef
187  ret double %r
188}
189
190define double @fsub_undef_undef(double %x) {
191; ANY-LABEL: fsub_undef_undef:
192; ANY:       # %bb.0:
193; ANY-NEXT:    retq
194  %r = fsub double undef, undef
195  ret double %r
196}
197
198define double @fmul_undef_undef(double %x) {
199; ANY-LABEL: fmul_undef_undef:
200; ANY:       # %bb.0:
201; ANY-NEXT:    retq
202  %r = fmul double undef, undef
203  ret double %r
204}
205
206define double @fdiv_undef_undef(double %x) {
207; ANY-LABEL: fdiv_undef_undef:
208; ANY:       # %bb.0:
209; ANY-NEXT:    retq
210  %r = fdiv double undef, undef
211  ret double %r
212}
213
214define double @frem_undef_undef(double %x) {
215; ANY-LABEL: frem_undef_undef:
216; ANY:       # %bb.0:
217; ANY-NEXT:    retq
218  %r = frem double undef, undef
219  ret double %r
220}
221
222; Constant folding.
223
224define float @fadd_undef_op0_nnan_constant(float %x) {
225; ANY-LABEL: fadd_undef_op0_nnan_constant:
226; ANY:       # %bb.0:
227; ANY-NEXT:    retq
228  %r = fadd nnan float undef, 1.0
229  ret float %r
230}
231
232define float @fadd_undef_op1_constant(float %x) {
233; ANY-LABEL: fadd_undef_op1_constant:
234; ANY:       # %bb.0:
235; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
236; ANY-NEXT:    retq
237  %r = fadd float 2.0, undef
238  ret float %r
239}
240
241define float @fsub_undef_op0_fast_constant(float %x) {
242; ANY-LABEL: fsub_undef_op0_fast_constant:
243; ANY:       # %bb.0:
244; ANY-NEXT:    retq
245  %r = fsub fast float undef, 3.0
246  ret float %r
247}
248
249define float @fsub_undef_op1_constant(float %x) {
250; ANY-LABEL: fsub_undef_op1_constant:
251; ANY:       # %bb.0:
252; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
253; ANY-NEXT:    retq
254  %r = fsub float 4.0, undef
255  ret float %r
256}
257
258define float @fmul_undef_op0_nnan_constant(float %x) {
259; ANY-LABEL: fmul_undef_op0_nnan_constant:
260; ANY:       # %bb.0:
261; ANY-NEXT:    retq
262  %r = fmul nnan float undef, 5.0
263  ret float %r
264}
265
266define float @fmul_undef_op1_constant(float %x) {
267; ANY-LABEL: fmul_undef_op1_constant:
268; ANY:       # %bb.0:
269; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
270; ANY-NEXT:    retq
271  %r = fmul float 6.0, undef
272  ret float %r
273}
274
275define float @fdiv_undef_op0_fast_constant(float %x) {
276; ANY-LABEL: fdiv_undef_op0_fast_constant:
277; ANY:       # %bb.0:
278; ANY-NEXT:    retq
279  %r = fdiv fast float undef, 7.0
280  ret float %r
281}
282
283define float @fdiv_undef_op1_constant(float %x) {
284; ANY-LABEL: fdiv_undef_op1_constant:
285; ANY:       # %bb.0:
286; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
287; ANY-NEXT:    retq
288  %r = fdiv float 8.0, undef
289  ret float %r
290}
291
292define float @frem_undef_op0_nnan_constant(float %x) {
293; ANY-LABEL: frem_undef_op0_nnan_constant:
294; ANY:       # %bb.0:
295; ANY-NEXT:    retq
296  %r = frem nnan float undef, 9.0
297  ret float %r
298}
299
300define float @frem_undef_op1_constant(float %x) {
301; ANY-LABEL: frem_undef_op1_constant:
302; ANY:       # %bb.0:
303; ANY-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
304; ANY-NEXT:    retq
305  %r = frem float 10.0, undef
306  ret float %r
307}
308
309; Constant folding - special constants: NaN.
310
311define double @fadd_undef_op0_constant_nan(double %x) {
312; ANY-LABEL: fadd_undef_op0_constant_nan:
313; ANY:       # %bb.0:
314; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
315; ANY-NEXT:    retq
316  %r = fadd double undef, 0x7FF8000000000000
317  ret double %r
318}
319
320define double @fadd_undef_op1_fast_constant_nan(double %x) {
321; ANY-LABEL: fadd_undef_op1_fast_constant_nan:
322; ANY:       # %bb.0:
323; ANY-NEXT:    retq
324  %r = fadd fast double 0xFFF0000000000001, undef
325  ret double %r
326}
327
328define double @fsub_undef_op0_constant_nan(double %x) {
329; ANY-LABEL: fsub_undef_op0_constant_nan:
330; ANY:       # %bb.0:
331; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
332; ANY-NEXT:    retq
333  %r = fsub double undef, 0xFFF8000000000010
334  ret double %r
335}
336
337define double @fsub_undef_op1_nnan_constant_nan(double %x) {
338; ANY-LABEL: fsub_undef_op1_nnan_constant_nan:
339; ANY:       # %bb.0:
340; ANY-NEXT:    retq
341  %r = fsub nnan double 0x7FF0000000000011, undef
342  ret double %r
343}
344
345define double @fmul_undef_op0_constant_nan(double %x) {
346; ANY-LABEL: fmul_undef_op0_constant_nan:
347; ANY:       # %bb.0:
348; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
349; ANY-NEXT:    retq
350  %r = fmul double undef, 0x7FF8000000000100
351  ret double %r
352}
353
354define double @fmul_undef_op1_fast_constant_nan(double %x) {
355; ANY-LABEL: fmul_undef_op1_fast_constant_nan:
356; ANY:       # %bb.0:
357; ANY-NEXT:    retq
358  %r = fmul fast double 0xFFF0000000000101, undef
359  ret double %r
360}
361
362define double @fdiv_undef_op0_constant_nan(double %x) {
363; ANY-LABEL: fdiv_undef_op0_constant_nan:
364; ANY:       # %bb.0:
365; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
366; ANY-NEXT:    retq
367  %r = fdiv double undef, 0xFFF8000000000110
368  ret double %r
369}
370
371define double @fdiv_undef_op1_nnan_constant_nan(double %x) {
372; ANY-LABEL: fdiv_undef_op1_nnan_constant_nan:
373; ANY:       # %bb.0:
374; ANY-NEXT:    retq
375  %r = fdiv nnan double 0x7FF0000000000111, undef
376  ret double %r
377}
378
379define double @frem_undef_op0_constant_nan(double %x) {
380; ANY-LABEL: frem_undef_op0_constant_nan:
381; ANY:       # %bb.0:
382; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
383; ANY-NEXT:    retq
384  %r = frem double undef, 0x7FF8000000001000
385  ret double %r
386}
387
388define double @frem_undef_op1_fast_constant_nan(double %x) {
389; ANY-LABEL: frem_undef_op1_fast_constant_nan:
390; ANY:       # %bb.0:
391; ANY-NEXT:    retq
392  %r = frem fast double 0xFFF0000000001001, undef
393  ret double %r
394}
395
396; Constant folding - special constants: Inf.
397
398define double @fadd_undef_op0_constant_inf(double %x) {
399; ANY-LABEL: fadd_undef_op0_constant_inf:
400; ANY:       # %bb.0:
401; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
402; ANY-NEXT:    retq
403  %r = fadd double undef, 0x7FF0000000000000
404  ret double %r
405}
406
407define double @fadd_undef_op1_fast_constant_inf(double %x) {
408; ANY-LABEL: fadd_undef_op1_fast_constant_inf:
409; ANY:       # %bb.0:
410; ANY-NEXT:    retq
411  %r = fadd fast double 0xFFF0000000000000, undef
412  ret double %r
413}
414
415define double @fsub_undef_op0_constant_inf(double %x) {
416; ANY-LABEL: fsub_undef_op0_constant_inf:
417; ANY:       # %bb.0:
418; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
419; ANY-NEXT:    retq
420  %r = fsub double undef, 0xFFF0000000000000
421  ret double %r
422}
423
424define double @fsub_undef_op1_ninf_constant_inf(double %x) {
425; ANY-LABEL: fsub_undef_op1_ninf_constant_inf:
426; ANY:       # %bb.0:
427; ANY-NEXT:    retq
428  %r = fsub ninf double 0x7FF0000000000000, undef
429  ret double %r
430}
431
432define double @fmul_undef_op0_constant_inf(double %x) {
433; ANY-LABEL: fmul_undef_op0_constant_inf:
434; ANY:       # %bb.0:
435; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
436; ANY-NEXT:    retq
437  %r = fmul double undef, 0x7FF0000000000000
438  ret double %r
439}
440
441define double @fmul_undef_op1_fast_constant_inf(double %x) {
442; ANY-LABEL: fmul_undef_op1_fast_constant_inf:
443; ANY:       # %bb.0:
444; ANY-NEXT:    retq
445  %r = fmul fast double 0xFFF0000000000000, undef
446  ret double %r
447}
448
449define double @fdiv_undef_op0_constant_inf(double %x) {
450; ANY-LABEL: fdiv_undef_op0_constant_inf:
451; ANY:       # %bb.0:
452; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
453; ANY-NEXT:    retq
454  %r = fdiv double undef, 0xFFF0000000000000
455  ret double %r
456}
457
458define double @fdiv_undef_op1_ninf_constant_inf(double %x) {
459; ANY-LABEL: fdiv_undef_op1_ninf_constant_inf:
460; ANY:       # %bb.0:
461; ANY-NEXT:    retq
462  %r = fdiv ninf double 0x7FF0000000000000, undef
463  ret double %r
464}
465
466define double @frem_undef_op0_constant_inf(double %x) {
467; ANY-LABEL: frem_undef_op0_constant_inf:
468; ANY:       # %bb.0:
469; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
470; ANY-NEXT:    retq
471  %r = frem double undef, 0x7FF0000000000000
472  ret double %r
473}
474
475define double @frem_undef_op1_fast_constant_inf(double %x) {
476; ANY-LABEL: frem_undef_op1_fast_constant_inf:
477; ANY:       # %bb.0:
478; ANY-NEXT:    retq
479  %r = frem fast double 0xFFF0000000000000, undef
480  ret double %r
481}
482
483define <2 x double> @fadd_undef_op1_constant_vec(<2 x double> %x) {
484; ANY-LABEL: fadd_undef_op1_constant_vec:
485; ANY:       # %bb.0:
486; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
487; ANY-NEXT:    retq
488  %r = fadd <2 x double> <double 42.0, double undef>, undef
489  ret <2 x double> %r
490}
491
492define <2 x double> @fadd_undef_op0_constant_vec(<2 x double> %x) {
493; ANY-LABEL: fadd_undef_op0_constant_vec:
494; ANY:       # %bb.0:
495; ANY-NEXT:    movaps {{.*#+}} xmm0 = <u,NaN>
496; ANY-NEXT:    retq
497  %r = fadd <2 x double> undef, <double undef, double 42.0>
498  ret <2 x double> %r
499}
500
501define <2 x double> @fsub_undef_op1_constant_vec(<2 x double> %x) {
502; ANY-LABEL: fsub_undef_op1_constant_vec:
503; ANY:       # %bb.0:
504; ANY-NEXT:    movaps {{.*#+}} xmm0 = <u,NaN>
505; ANY-NEXT:    retq
506  %r = fsub <2 x double> <double undef, double 42.0>, undef
507  ret <2 x double> %r
508}
509
510define <2 x double> @fsub_undef_op0_constant_vec(<2 x double> %x) {
511; ANY-LABEL: fsub_undef_op0_constant_vec:
512; ANY:       # %bb.0:
513; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
514; ANY-NEXT:    retq
515  %r = fsub <2 x double> undef, <double 42.0, double undef>
516  ret <2 x double> %r
517}
518
519define <2 x double> @fmul_undef_op1_constant_vec(<2 x double> %x) {
520; ANY-LABEL: fmul_undef_op1_constant_vec:
521; ANY:       # %bb.0:
522; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
523; ANY-NEXT:    retq
524  %r = fmul <2 x double> <double 42.0, double undef>, undef
525  ret <2 x double> %r
526}
527
528define <2 x double> @fmul_undef_op0_constant_vec(<2 x double> %x) {
529; ANY-LABEL: fmul_undef_op0_constant_vec:
530; ANY:       # %bb.0:
531; ANY-NEXT:    movaps {{.*#+}} xmm0 = <u,NaN>
532; ANY-NEXT:    retq
533  %r = fmul <2 x double> undef, <double undef, double 42.0>
534  ret <2 x double> %r
535}
536
537define <2 x double> @fdiv_undef_op1_constant_vec(<2 x double> %x) {
538; ANY-LABEL: fdiv_undef_op1_constant_vec:
539; ANY:       # %bb.0:
540; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
541; ANY-NEXT:    retq
542  %r = fdiv <2 x double> <double 42.0, double undef>, undef
543  ret <2 x double> %r
544}
545
546define <2 x double> @fdiv_undef_op0_constant_vec(<2 x double> %x) {
547; ANY-LABEL: fdiv_undef_op0_constant_vec:
548; ANY:       # %bb.0:
549; ANY-NEXT:    movaps {{.*#+}} xmm0 = <u,NaN>
550; ANY-NEXT:    retq
551  %r = fdiv <2 x double> undef, <double undef, double 42.0>
552  ret <2 x double> %r
553}
554
555define <2 x double> @frem_undef_op1_constant_vec(<2 x double> %x) {
556; ANY-LABEL: frem_undef_op1_constant_vec:
557; ANY:       # %bb.0:
558; ANY-NEXT:    movaps {{.*#+}} xmm0 = <u,NaN>
559; ANY-NEXT:    retq
560  %r = frem <2 x double> <double undef, double 42.0>, undef
561  ret <2 x double> %r
562}
563
564define <2 x double> @frem_undef_op0_constant_vec(<2 x double> %x) {
565; ANY-LABEL: frem_undef_op0_constant_vec:
566; ANY:       # %bb.0:
567; ANY-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
568; ANY-NEXT:    retq
569  %r = frem <2 x double> undef, <double 42.0, double undef>
570  ret <2 x double> %r
571}
572
573