489 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X863; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X644; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=0 -fast-isel=0 | FileCheck %s --check-prefixes=X86,SDAG-X865; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=0 -fast-isel=0 | FileCheck %s --check-prefixes=X64,SDAG-X646; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-SINCOS-STRET7; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-NOSINCOS-STRET8 9; TODO: The below RUN line will fails GISEL selection and will fallback to DAG selection due to lack of support for loads/stores in i686 mode, support is expected soon enough, for this reason the llvm/test/CodeGen/X86/GlobalISel/llvm.sincos.mir test is added for now because of the lack of support for i686 in GlobalISel.10; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=1 -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X8611; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X6412 13define { float, float } @test_sincos_f32(float %Val) nounwind {14; X86-LABEL: test_sincos_f32:15; X86: # %bb.0:16; X86-NEXT: subl $28, %esp17; X86-NEXT: flds {{[0-9]+}}(%esp)18; X86-NEXT: leal {{[0-9]+}}(%esp), %eax19; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)20; X86-NEXT: leal {{[0-9]+}}(%esp), %eax21; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)22; X86-NEXT: fstps (%esp)23; X86-NEXT: calll sincosf24; X86-NEXT: flds {{[0-9]+}}(%esp)25; X86-NEXT: flds {{[0-9]+}}(%esp)26; X86-NEXT: addl $28, %esp27; X86-NEXT: retl28;29; X64-LABEL: test_sincos_f32:30; X64: # %bb.0:31; X64-NEXT: pushq %rax32; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi33; X64-NEXT: movq %rsp, %rsi34; X64-NEXT: callq sincosf@PLT35; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero36; X64-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero37; X64-NEXT: popq %rax38; X64-NEXT: retq39;40; MACOS-SINCOS-STRET-LABEL: test_sincos_f32:41; MACOS-SINCOS-STRET: ## %bb.0:42; MACOS-SINCOS-STRET-NEXT: pushq %rax43; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret44; MACOS-SINCOS-STRET-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]45; MACOS-SINCOS-STRET-NEXT: popq %rax46; MACOS-SINCOS-STRET-NEXT: retq47;48; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f32:49; MACOS-NOSINCOS-STRET: ## %bb.0:50; MACOS-NOSINCOS-STRET-NEXT: pushq %rax51; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill52; MACOS-NOSINCOS-STRET-NEXT: callq _sinf53; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill54; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload55; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero56; MACOS-NOSINCOS-STRET-NEXT: callq _cosf57; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, %xmm158; MACOS-NOSINCOS-STRET-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload59; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero60; MACOS-NOSINCOS-STRET-NEXT: popq %rax61; MACOS-NOSINCOS-STRET-NEXT: retq62;63; GISEL-X86-LABEL: test_sincos_f32:64; GISEL-X86: # %bb.0:65; GISEL-X86-NEXT: subl $28, %esp66; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax67; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx68; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %edx69; GISEL-X86-NEXT: movl %eax, (%esp)70; GISEL-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)71; GISEL-X86-NEXT: movl %edx, {{[0-9]+}}(%esp)72; GISEL-X86-NEXT: calll sincosf73; GISEL-X86-NEXT: flds {{[0-9]+}}(%esp)74; GISEL-X86-NEXT: flds {{[0-9]+}}(%esp)75; GISEL-X86-NEXT: fxch %st(1)76; GISEL-X86-NEXT: addl $28, %esp77; GISEL-X86-NEXT: retl78;79; GISEL-X64-LABEL: test_sincos_f32:80; GISEL-X64: # %bb.0:81; GISEL-X64-NEXT: pushq %rax82; GISEL-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi83; GISEL-X64-NEXT: movq %rsp, %rsi84; GISEL-X64-NEXT: callq sincosf85; GISEL-X64-NEXT: movl {{[0-9]+}}(%rsp), %eax86; GISEL-X64-NEXT: movl (%rsp), %ecx87; GISEL-X64-NEXT: movd %eax, %xmm088; GISEL-X64-NEXT: movd %ecx, %xmm189; GISEL-X64-NEXT: popq %rax90; GISEL-X64-NEXT: retq91 %res = call { float, float } @llvm.sincos.f32(float %Val)92 ret { float, float } %res93}94 95define { double, double } @test_sincos_f64(double %Val) nounwind {96; X86-LABEL: test_sincos_f64:97; X86: # %bb.0:98; X86-NEXT: subl $44, %esp99; X86-NEXT: fldl {{[0-9]+}}(%esp)100; X86-NEXT: leal {{[0-9]+}}(%esp), %eax101; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)102; X86-NEXT: leal {{[0-9]+}}(%esp), %eax103; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)104; X86-NEXT: fstpl (%esp)105; X86-NEXT: calll sincos106; X86-NEXT: fldl {{[0-9]+}}(%esp)107; X86-NEXT: fldl {{[0-9]+}}(%esp)108; X86-NEXT: addl $44, %esp109; X86-NEXT: retl110;111; X64-LABEL: test_sincos_f64:112; X64: # %bb.0:113; X64-NEXT: subq $24, %rsp114; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi115; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rsi116; X64-NEXT: callq sincos@PLT117; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero118; X64-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero119; X64-NEXT: addq $24, %rsp120; X64-NEXT: retq121;122; MACOS-SINCOS-STRET-LABEL: test_sincos_f64:123; MACOS-SINCOS-STRET: ## %bb.0:124; MACOS-SINCOS-STRET-NEXT: pushq %rax125; MACOS-SINCOS-STRET-NEXT: callq ___sincos_stret126; MACOS-SINCOS-STRET-NEXT: popq %rax127; MACOS-SINCOS-STRET-NEXT: retq128;129; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f64:130; MACOS-NOSINCOS-STRET: ## %bb.0:131; MACOS-NOSINCOS-STRET-NEXT: subq $24, %rsp132; MACOS-NOSINCOS-STRET-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill133; MACOS-NOSINCOS-STRET-NEXT: callq _sin134; MACOS-NOSINCOS-STRET-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill135; MACOS-NOSINCOS-STRET-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload136; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero137; MACOS-NOSINCOS-STRET-NEXT: callq _cos138; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, %xmm1139; MACOS-NOSINCOS-STRET-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload140; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero141; MACOS-NOSINCOS-STRET-NEXT: addq $24, %rsp142; MACOS-NOSINCOS-STRET-NEXT: retq143;144; GISEL-X86-LABEL: test_sincos_f64:145; GISEL-X86: # %bb.0:146; GISEL-X86-NEXT: subl $44, %esp147; GISEL-X86-NEXT: fldl {{[0-9]+}}(%esp)148; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax149; GISEL-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)150; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax151; GISEL-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)152; GISEL-X86-NEXT: fstpl (%esp)153; GISEL-X86-NEXT: calll sincos154; GISEL-X86-NEXT: fldl {{[0-9]+}}(%esp)155; GISEL-X86-NEXT: fldl {{[0-9]+}}(%esp)156; GISEL-X86-NEXT: addl $44, %esp157; GISEL-X86-NEXT: retl158;159; GISEL-X64-LABEL: test_sincos_f64:160; GISEL-X64: # %bb.0:161; GISEL-X64-NEXT: subq $24, %rsp162; GISEL-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi163; GISEL-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rsi164; GISEL-X64-NEXT: callq sincos165; GISEL-X64-NEXT: movq {{[0-9]+}}(%rsp), %rax166; GISEL-X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx167; GISEL-X64-NEXT: movq %rax, %xmm0168; GISEL-X64-NEXT: movq %rcx, %xmm1169; GISEL-X64-NEXT: addq $24, %rsp170; GISEL-X64-NEXT: retq171 %res = call { double, double } @llvm.sincos.f64(double %Val)172 ret { double, double } %res173}174 175define { x86_fp80, x86_fp80 } @test_sincos_f80(x86_fp80 %Val) nounwind {176; X86-LABEL: test_sincos_f80:177; X86: # %bb.0:178; X86-NEXT: subl $44, %esp179; X86-NEXT: fldt {{[0-9]+}}(%esp)180; X86-NEXT: leal {{[0-9]+}}(%esp), %eax181; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)182; X86-NEXT: leal {{[0-9]+}}(%esp), %eax183; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)184; X86-NEXT: fstpt (%esp)185; X86-NEXT: calll sincosl186; X86-NEXT: fldt {{[0-9]+}}(%esp)187; X86-NEXT: fldt {{[0-9]+}}(%esp)188; X86-NEXT: addl $44, %esp189; X86-NEXT: retl190;191; X64-LABEL: test_sincos_f80:192; X64: # %bb.0:193; X64-NEXT: subq $56, %rsp194; X64-NEXT: fldt {{[0-9]+}}(%rsp)195; X64-NEXT: fstpt (%rsp)196; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi197; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rsi198; X64-NEXT: callq sincosl@PLT199; X64-NEXT: fldt {{[0-9]+}}(%rsp)200; X64-NEXT: fldt {{[0-9]+}}(%rsp)201; X64-NEXT: addq $56, %rsp202; X64-NEXT: retq203;204; MACOS-SINCOS-STRET-LABEL: test_sincos_f80:205; MACOS-SINCOS-STRET: ## %bb.0:206; MACOS-SINCOS-STRET-NEXT: subq $40, %rsp207; MACOS-SINCOS-STRET-NEXT: fldt {{[0-9]+}}(%rsp)208; MACOS-SINCOS-STRET-NEXT: fld %st(0)209; MACOS-SINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill210; MACOS-SINCOS-STRET-NEXT: fstpt (%rsp)211; MACOS-SINCOS-STRET-NEXT: callq _cosl212; MACOS-SINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill213; MACOS-SINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload214; MACOS-SINCOS-STRET-NEXT: fstpt (%rsp)215; MACOS-SINCOS-STRET-NEXT: callq _sinl216; MACOS-SINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload217; MACOS-SINCOS-STRET-NEXT: fxch %st(1)218; MACOS-SINCOS-STRET-NEXT: addq $40, %rsp219; MACOS-SINCOS-STRET-NEXT: retq220;221; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f80:222; MACOS-NOSINCOS-STRET: ## %bb.0:223; MACOS-NOSINCOS-STRET-NEXT: subq $40, %rsp224; MACOS-NOSINCOS-STRET-NEXT: fldt {{[0-9]+}}(%rsp)225; MACOS-NOSINCOS-STRET-NEXT: fld %st(0)226; MACOS-NOSINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill227; MACOS-NOSINCOS-STRET-NEXT: fstpt (%rsp)228; MACOS-NOSINCOS-STRET-NEXT: callq _cosl229; MACOS-NOSINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill230; MACOS-NOSINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload231; MACOS-NOSINCOS-STRET-NEXT: fstpt (%rsp)232; MACOS-NOSINCOS-STRET-NEXT: callq _sinl233; MACOS-NOSINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload234; MACOS-NOSINCOS-STRET-NEXT: fxch %st(1)235; MACOS-NOSINCOS-STRET-NEXT: addq $40, %rsp236; MACOS-NOSINCOS-STRET-NEXT: retq237;238; GISEL-X86-LABEL: test_sincos_f80:239; GISEL-X86: # %bb.0:240; GISEL-X86-NEXT: subl $60, %esp241; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)242; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax243; GISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %ecx244; GISEL-X86-NEXT: fstpt (%esp)245; GISEL-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)246; GISEL-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)247; GISEL-X86-NEXT: calll sincosl248; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)249; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)250; GISEL-X86-NEXT: fxch %st(1)251; GISEL-X86-NEXT: addl $60, %esp252; GISEL-X86-NEXT: retl253;254; GISEL-X64-LABEL: test_sincos_f80:255; GISEL-X64: # %bb.0:256; GISEL-X64-NEXT: subq $56, %rsp257; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)258; GISEL-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi259; GISEL-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rsi260; GISEL-X64-NEXT: fstpt (%rsp)261; GISEL-X64-NEXT: callq sincosl262; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)263; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)264; GISEL-X64-NEXT: fxch %st(1)265; GISEL-X64-NEXT: addq $56, %rsp266; GISEL-X64-NEXT: retq267 %res = call { x86_fp80, x86_fp80 } @llvm.sincos.f80(x86_fp80 %Val)268 ret { x86_fp80, x86_fp80 } %res269}270 271declare void @foo(ptr, ptr)272 273define void @can_fold_with_call_in_chain(float %x, ptr noalias %a, ptr noalias %b) nounwind {274; FASTISEL-X86-LABEL: can_fold_with_call_in_chain:275; FASTISEL-X86: # %bb.0: # %entry276; FASTISEL-X86-NEXT: pushl %edi277; FASTISEL-X86-NEXT: pushl %esi278; FASTISEL-X86-NEXT: subl $20, %esp279; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi280; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edi281; FASTISEL-X86-NEXT: flds {{[0-9]+}}(%esp)282; FASTISEL-X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill283; FASTISEL-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)284; FASTISEL-X86-NEXT: movl %edi, (%esp)285; FASTISEL-X86-NEXT: calll foo@PLT286; FASTISEL-X86-NEXT: leal {{[0-9]+}}(%esp), %eax287; FASTISEL-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)288; FASTISEL-X86-NEXT: movl %edi, {{[0-9]+}}(%esp)289; FASTISEL-X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload290; FASTISEL-X86-NEXT: fstps (%esp)291; FASTISEL-X86-NEXT: calll sincosf292; FASTISEL-X86-NEXT: flds {{[0-9]+}}(%esp)293; FASTISEL-X86-NEXT: fstps (%esi)294; FASTISEL-X86-NEXT: addl $20, %esp295; FASTISEL-X86-NEXT: popl %esi296; FASTISEL-X86-NEXT: popl %edi297; FASTISEL-X86-NEXT: retl298;299; FASTISEL-X64-LABEL: can_fold_with_call_in_chain:300; FASTISEL-X64: # %bb.0: # %entry301; FASTISEL-X64-NEXT: pushq %r14302; FASTISEL-X64-NEXT: pushq %rbx303; FASTISEL-X64-NEXT: pushq %rax304; FASTISEL-X64-NEXT: movq %rsi, %rbx305; FASTISEL-X64-NEXT: movq %rdi, %r14306; FASTISEL-X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill307; FASTISEL-X64-NEXT: callq sinf@PLT308; FASTISEL-X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill309; FASTISEL-X64-NEXT: movss (%rsp), %xmm0 # 4-byte Reload310; FASTISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero311; FASTISEL-X64-NEXT: callq cosf@PLT312; FASTISEL-X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill313; FASTISEL-X64-NEXT: movq %r14, %rdi314; FASTISEL-X64-NEXT: movq %rbx, %rsi315; FASTISEL-X64-NEXT: callq foo@PLT316; FASTISEL-X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload317; FASTISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero318; FASTISEL-X64-NEXT: movss %xmm0, (%r14)319; FASTISEL-X64-NEXT: movss (%rsp), %xmm0 # 4-byte Reload320; FASTISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero321; FASTISEL-X64-NEXT: movss %xmm0, (%rbx)322; FASTISEL-X64-NEXT: addq $8, %rsp323; FASTISEL-X64-NEXT: popq %rbx324; FASTISEL-X64-NEXT: popq %r14325; FASTISEL-X64-NEXT: retq326;327; SDAG-X86-LABEL: can_fold_with_call_in_chain:328; SDAG-X86: # %bb.0: # %entry329; SDAG-X86-NEXT: pushl %edi330; SDAG-X86-NEXT: pushl %esi331; SDAG-X86-NEXT: subl $20, %esp332; SDAG-X86-NEXT: flds {{[0-9]+}}(%esp)333; SDAG-X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill334; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edi335; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi336; SDAG-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)337; SDAG-X86-NEXT: movl %edi, (%esp)338; SDAG-X86-NEXT: calll foo@PLT339; SDAG-X86-NEXT: leal {{[0-9]+}}(%esp), %eax340; SDAG-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)341; SDAG-X86-NEXT: movl %edi, {{[0-9]+}}(%esp)342; SDAG-X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload343; SDAG-X86-NEXT: fstps (%esp)344; SDAG-X86-NEXT: calll sincosf345; SDAG-X86-NEXT: flds {{[0-9]+}}(%esp)346; SDAG-X86-NEXT: fstps (%esi)347; SDAG-X86-NEXT: addl $20, %esp348; SDAG-X86-NEXT: popl %esi349; SDAG-X86-NEXT: popl %edi350; SDAG-X86-NEXT: retl351;352; SDAG-X64-LABEL: can_fold_with_call_in_chain:353; SDAG-X64: # %bb.0: # %entry354; SDAG-X64-NEXT: pushq %r14355; SDAG-X64-NEXT: pushq %rbx356; SDAG-X64-NEXT: pushq %rax357; SDAG-X64-NEXT: movq %rsi, %rbx358; SDAG-X64-NEXT: movq %rdi, %r14359; SDAG-X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill360; SDAG-X64-NEXT: callq foo@PLT361; SDAG-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rsi362; SDAG-X64-NEXT: movss (%rsp), %xmm0 # 4-byte Reload363; SDAG-X64-NEXT: # xmm0 = mem[0],zero,zero,zero364; SDAG-X64-NEXT: movq %r14, %rdi365; SDAG-X64-NEXT: callq sincosf@PLT366; SDAG-X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero367; SDAG-X64-NEXT: movss %xmm0, (%rbx)368; SDAG-X64-NEXT: addq $8, %rsp369; SDAG-X64-NEXT: popq %rbx370; SDAG-X64-NEXT: popq %r14371; SDAG-X64-NEXT: retq372;373; MACOS-SINCOS-STRET-LABEL: can_fold_with_call_in_chain:374; MACOS-SINCOS-STRET: ## %bb.0: ## %entry375; MACOS-SINCOS-STRET-NEXT: pushq %r14376; MACOS-SINCOS-STRET-NEXT: pushq %rbx377; MACOS-SINCOS-STRET-NEXT: subq $40, %rsp378; MACOS-SINCOS-STRET-NEXT: movq %rsi, %rbx379; MACOS-SINCOS-STRET-NEXT: movq %rdi, %r14380; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret381; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill382; MACOS-SINCOS-STRET-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]383; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill384; MACOS-SINCOS-STRET-NEXT: movq %r14, %rdi385; MACOS-SINCOS-STRET-NEXT: movq %rbx, %rsi386; MACOS-SINCOS-STRET-NEXT: callq _foo387; MACOS-SINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload388; MACOS-SINCOS-STRET-NEXT: movss %xmm0, (%r14)389; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload390; MACOS-SINCOS-STRET-NEXT: movss %xmm0, (%rbx)391; MACOS-SINCOS-STRET-NEXT: addq $40, %rsp392; MACOS-SINCOS-STRET-NEXT: popq %rbx393; MACOS-SINCOS-STRET-NEXT: popq %r14394; MACOS-SINCOS-STRET-NEXT: retq395;396; MACOS-NOSINCOS-STRET-LABEL: can_fold_with_call_in_chain:397; MACOS-NOSINCOS-STRET: ## %bb.0: ## %entry398; MACOS-NOSINCOS-STRET-NEXT: pushq %r14399; MACOS-NOSINCOS-STRET-NEXT: pushq %rbx400; MACOS-NOSINCOS-STRET-NEXT: pushq %rax401; MACOS-NOSINCOS-STRET-NEXT: movq %rsi, %rbx402; MACOS-NOSINCOS-STRET-NEXT: movq %rdi, %r14403; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill404; MACOS-NOSINCOS-STRET-NEXT: callq _sinf405; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill406; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload407; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero408; MACOS-NOSINCOS-STRET-NEXT: callq _cosf409; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill410; MACOS-NOSINCOS-STRET-NEXT: movq %r14, %rdi411; MACOS-NOSINCOS-STRET-NEXT: movq %rbx, %rsi412; MACOS-NOSINCOS-STRET-NEXT: callq _foo413; MACOS-NOSINCOS-STRET-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload414; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero415; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%r14)416; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload417; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero418; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rbx)419; MACOS-NOSINCOS-STRET-NEXT: addq $8, %rsp420; MACOS-NOSINCOS-STRET-NEXT: popq %rbx421; MACOS-NOSINCOS-STRET-NEXT: popq %r14422; MACOS-NOSINCOS-STRET-NEXT: retq423;424; GISEL-X86-LABEL: can_fold_with_call_in_chain:425; GISEL-X86: # %bb.0: # %entry426; GISEL-X86-NEXT: pushl %ebx427; GISEL-X86-NEXT: pushl %edi428; GISEL-X86-NEXT: pushl %esi429; GISEL-X86-NEXT: subl $16, %esp430; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx431; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi432; GISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edi433; GISEL-X86-NEXT: movl %ebx, (%esp)434; GISEL-X86-NEXT: calll sinf435; GISEL-X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill436; GISEL-X86-NEXT: movl %ebx, (%esp)437; GISEL-X86-NEXT: calll cosf438; GISEL-X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill439; GISEL-X86-NEXT: movl %esi, (%esp)440; GISEL-X86-NEXT: movl %edi, {{[0-9]+}}(%esp)441; GISEL-X86-NEXT: calll foo442; GISEL-X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload443; GISEL-X86-NEXT: fstps (%esi)444; GISEL-X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload445; GISEL-X86-NEXT: fstps (%edi)446; GISEL-X86-NEXT: addl $16, %esp447; GISEL-X86-NEXT: popl %esi448; GISEL-X86-NEXT: popl %edi449; GISEL-X86-NEXT: popl %ebx450; GISEL-X86-NEXT: retl451;452; GISEL-X64-LABEL: can_fold_with_call_in_chain:453; GISEL-X64: # %bb.0: # %entry454; GISEL-X64-NEXT: pushq %r14455; GISEL-X64-NEXT: pushq %rbx456; GISEL-X64-NEXT: pushq %rax457; GISEL-X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill458; GISEL-X64-NEXT: movq %rdi, %rbx459; GISEL-X64-NEXT: movq %rsi, %r14460; GISEL-X64-NEXT: callq sinf461; GISEL-X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill462; GISEL-X64-NEXT: movss (%rsp), %xmm0 # 4-byte Reload463; GISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero464; GISEL-X64-NEXT: callq cosf465; GISEL-X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill466; GISEL-X64-NEXT: movq %rbx, %rdi467; GISEL-X64-NEXT: movq %r14, %rsi468; GISEL-X64-NEXT: callq foo469; GISEL-X64-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload470; GISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero471; GISEL-X64-NEXT: movd %xmm0, %eax472; GISEL-X64-NEXT: movl %eax, (%rbx)473; GISEL-X64-NEXT: movd (%rsp), %xmm0 # 4-byte Folded Reload474; GISEL-X64-NEXT: # xmm0 = mem[0],zero,zero,zero475; GISEL-X64-NEXT: movd %xmm0, %eax476; GISEL-X64-NEXT: movl %eax, (%r14)477; GISEL-X64-NEXT: addq $8, %rsp478; GISEL-X64-NEXT: popq %rbx479; GISEL-X64-NEXT: popq %r14480; GISEL-X64-NEXT: retq481entry:482 %sin = tail call float @llvm.sin.f32(float %x)483 %cos = tail call float @llvm.cos.f32(float %x)484 call void @foo(ptr %a, ptr %b)485 store float %sin, ptr %a, align 4486 store float %cos, ptr %b, align 4487 ret void488}489