573 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ANY3; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ANY4 5; This is duplicated from tests for InstSimplify. If you're6; 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 = [NaN,0.0E+0,0.0E+0,0.0E+0]12; ANY-NEXT: retq13 %r = fadd float undef, %x14 ret float %r15}16 17define float @fadd_undef_op1(float %x) {18; ANY-LABEL: fadd_undef_op1:19; ANY: # %bb.0:20; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]21; ANY-NEXT: retq22 %r = fadd float %x, undef23 ret float %r24}25 26define float @fsub_undef_op0(float %x) {27; ANY-LABEL: fsub_undef_op0:28; ANY: # %bb.0:29; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]30; ANY-NEXT: retq31 %r = fsub float undef, %x32 ret float %r33}34 35define float @fsub_undef_op1(float %x) {36; ANY-LABEL: fsub_undef_op1:37; ANY: # %bb.0:38; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]39; ANY-NEXT: retq40 %r = fsub float %x, undef41 ret float %r42}43 44define float @fmul_undef_op0(float %x) {45; ANY-LABEL: fmul_undef_op0:46; ANY: # %bb.0:47; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]48; ANY-NEXT: retq49 %r = fmul float undef, %x50 ret float %r51}52 53define float @fmul_undef_op1(float %x) {54; ANY-LABEL: fmul_undef_op1:55; ANY: # %bb.0:56; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]57; ANY-NEXT: retq58 %r = fmul float %x, undef59 ret float %r60}61 62define float @fdiv_undef_op0(float %x) {63; ANY-LABEL: fdiv_undef_op0:64; ANY: # %bb.0:65; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]66; ANY-NEXT: retq67 %r = fdiv float undef, %x68 ret float %r69}70 71define float @fdiv_undef_op1(float %x) {72; ANY-LABEL: fdiv_undef_op1:73; ANY: # %bb.0:74; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]75; ANY-NEXT: retq76 %r = fdiv float %x, undef77 ret float %r78}79 80define float @frem_undef_op0(float %x) {81; ANY-LABEL: frem_undef_op0:82; ANY: # %bb.0:83; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]84; ANY-NEXT: retq85 %r = frem float undef, %x86 ret float %r87}88 89define float @frem_undef_op1(float %x) {90; ANY-LABEL: frem_undef_op1:91; ANY: # %bb.0:92; ANY-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]93; ANY-NEXT: retq94 %r = frem float %x, undef95 ret float %r96}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: retq104 %r = fadd nnan float undef, %x105 ret float %r106}107 108define float @fadd_undef_op1_fast(float %x) {109; ANY-LABEL: fadd_undef_op1_fast:110; ANY: # %bb.0:111; ANY-NEXT: retq112 %r = fadd fast float %x, undef113 ret float %r114}115 116define float @fsub_undef_op0_fast(float %x) {117; ANY-LABEL: fsub_undef_op0_fast:118; ANY: # %bb.0:119; ANY-NEXT: retq120 %r = fsub fast float undef, %x121 ret float %r122}123 124define float @fsub_undef_op1_nnan(float %x) {125; ANY-LABEL: fsub_undef_op1_nnan:126; ANY: # %bb.0:127; ANY-NEXT: retq128 %r = fsub nnan float %x, undef129 ret float %r130}131 132define float @fmul_undef_op0_nnan(float %x) {133; ANY-LABEL: fmul_undef_op0_nnan:134; ANY: # %bb.0:135; ANY-NEXT: retq136 %r = fmul nnan float undef, %x137 ret float %r138}139 140define float @fmul_undef_op1_fast(float %x) {141; ANY-LABEL: fmul_undef_op1_fast:142; ANY: # %bb.0:143; ANY-NEXT: retq144 %r = fmul fast float %x, undef145 ret float %r146}147 148define float @fdiv_undef_op0_fast(float %x) {149; ANY-LABEL: fdiv_undef_op0_fast:150; ANY: # %bb.0:151; ANY-NEXT: retq152 %r = fdiv fast float undef, %x153 ret float %r154}155 156define float @fdiv_undef_op1_nnan(float %x) {157; ANY-LABEL: fdiv_undef_op1_nnan:158; ANY: # %bb.0:159; ANY-NEXT: retq160 %r = fdiv nnan float %x, undef161 ret float %r162}163 164define float @frem_undef_op0_nnan(float %x) {165; ANY-LABEL: frem_undef_op0_nnan:166; ANY: # %bb.0:167; ANY-NEXT: retq168 %r = frem nnan float undef, %x169 ret float %r170}171 172define float @frem_undef_op1_fast(float %x) {173; ANY-LABEL: frem_undef_op1_fast:174; ANY: # %bb.0:175; ANY-NEXT: retq176 %r = frem fast float %x, undef177 ret float %r178}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: retq186 %r = fadd double undef, undef187 ret double %r188}189 190define double @fsub_undef_undef(double %x) {191; ANY-LABEL: fsub_undef_undef:192; ANY: # %bb.0:193; ANY-NEXT: retq194 %r = fsub double undef, undef195 ret double %r196}197 198define double @fmul_undef_undef(double %x) {199; ANY-LABEL: fmul_undef_undef:200; ANY: # %bb.0:201; ANY-NEXT: retq202 %r = fmul double undef, undef203 ret double %r204}205 206define double @fdiv_undef_undef(double %x) {207; ANY-LABEL: fdiv_undef_undef:208; ANY: # %bb.0:209; ANY-NEXT: retq210 %r = fdiv double undef, undef211 ret double %r212}213 214define double @frem_undef_undef(double %x) {215; ANY-LABEL: frem_undef_undef:216; ANY: # %bb.0:217; ANY-NEXT: retq218 %r = frem double undef, undef219 ret double %r220}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: retq228 %r = fadd nnan float undef, 1.0229 ret float %r230}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 = [NaN,0.0E+0,0.0E+0,0.0E+0]236; ANY-NEXT: retq237 %r = fadd float 2.0, undef238 ret float %r239}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: retq245 %r = fsub fast float undef, 3.0246 ret float %r247}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 = [NaN,0.0E+0,0.0E+0,0.0E+0]253; ANY-NEXT: retq254 %r = fsub float 4.0, undef255 ret float %r256}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: retq262 %r = fmul nnan float undef, 5.0263 ret float %r264}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 = [NaN,0.0E+0,0.0E+0,0.0E+0]270; ANY-NEXT: retq271 %r = fmul float 6.0, undef272 ret float %r273}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: retq279 %r = fdiv fast float undef, 7.0280 ret float %r281}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 = [NaN,0.0E+0,0.0E+0,0.0E+0]287; ANY-NEXT: retq288 %r = fdiv float 8.0, undef289 ret float %r290}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: retq296 %r = frem nnan float undef, 9.0297 ret float %r298}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 = [NaN,0.0E+0,0.0E+0,0.0E+0]304; ANY-NEXT: retq305 %r = frem float 10.0, undef306 ret float %r307}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 = [NaN,0.0E+0]315; ANY-NEXT: retq316 %r = fadd double undef, 0x7FF8000000000000317 ret double %r318}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: retq324 %r = fadd fast double 0xFFF0000000000001, undef325 ret double %r326}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 = [NaN,0.0E+0]332; ANY-NEXT: retq333 %r = fsub double undef, 0xFFF8000000000010334 ret double %r335}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: retq341 %r = fsub nnan double 0x7FF0000000000011, undef342 ret double %r343}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 = [NaN,0.0E+0]349; ANY-NEXT: retq350 %r = fmul double undef, 0x7FF8000000000100351 ret double %r352}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: retq358 %r = fmul fast double 0xFFF0000000000101, undef359 ret double %r360}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 = [NaN,0.0E+0]366; ANY-NEXT: retq367 %r = fdiv double undef, 0xFFF8000000000110368 ret double %r369}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: retq375 %r = fdiv nnan double 0x7FF0000000000111, undef376 ret double %r377}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 = [NaN,0.0E+0]383; ANY-NEXT: retq384 %r = frem double undef, 0x7FF8000000001000385 ret double %r386}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: retq392 %r = frem fast double 0xFFF0000000001001, undef393 ret double %r394}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 = [NaN,0.0E+0]402; ANY-NEXT: retq403 %r = fadd double undef, 0x7FF0000000000000404 ret double %r405}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: retq411 %r = fadd fast double 0xFFF0000000000000, undef412 ret double %r413}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 = [NaN,0.0E+0]419; ANY-NEXT: retq420 %r = fsub double undef, 0xFFF0000000000000421 ret double %r422}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: retq428 %r = fsub ninf double 0x7FF0000000000000, undef429 ret double %r430}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 = [NaN,0.0E+0]436; ANY-NEXT: retq437 %r = fmul double undef, 0x7FF0000000000000438 ret double %r439}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: retq445 %r = fmul fast double 0xFFF0000000000000, undef446 ret double %r447}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 = [NaN,0.0E+0]453; ANY-NEXT: retq454 %r = fdiv double undef, 0xFFF0000000000000455 ret double %r456}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: retq462 %r = fdiv ninf double 0x7FF0000000000000, undef463 ret double %r464}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 = [NaN,0.0E+0]470; ANY-NEXT: retq471 %r = frem double undef, 0x7FF0000000000000472 ret double %r473}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: retq479 %r = frem fast double 0xFFF0000000000000, undef480 ret double %r481}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: movaps {{.*#+}} xmm0 = [NaN,NaN]487; ANY-NEXT: retq488 %r = fadd <2 x double> <double 42.0, double undef>, undef489 ret <2 x double> %r490}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 = [NaN,NaN]496; ANY-NEXT: retq497 %r = fadd <2 x double> undef, <double undef, double 42.0>498 ret <2 x double> %r499}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 = [NaN,NaN]505; ANY-NEXT: retq506 %r = fsub <2 x double> <double undef, double 42.0>, undef507 ret <2 x double> %r508}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: movaps {{.*#+}} xmm0 = [NaN,NaN]514; ANY-NEXT: retq515 %r = fsub <2 x double> undef, <double 42.0, double undef>516 ret <2 x double> %r517}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: movaps {{.*#+}} xmm0 = [NaN,NaN]523; ANY-NEXT: retq524 %r = fmul <2 x double> <double 42.0, double undef>, undef525 ret <2 x double> %r526}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 = [NaN,NaN]532; ANY-NEXT: retq533 %r = fmul <2 x double> undef, <double undef, double 42.0>534 ret <2 x double> %r535}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: movaps {{.*#+}} xmm0 = [NaN,NaN]541; ANY-NEXT: retq542 %r = fdiv <2 x double> <double 42.0, double undef>, undef543 ret <2 x double> %r544}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 = [NaN,NaN]550; ANY-NEXT: retq551 %r = fdiv <2 x double> undef, <double undef, double 42.0>552 ret <2 x double> %r553}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 = [NaN,NaN]559; ANY-NEXT: retq560 %r = frem <2 x double> <double undef, double 42.0>, undef561 ret <2 x double> %r562}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: movaps {{.*#+}} xmm0 = [NaN,NaN]568; ANY-NEXT: retq569 %r = frem <2 x double> undef, <double 42.0, double undef>570 ret <2 x double> %r571}572 573