diff options
author | Craig Topper <craig.topper@intel.com> | 2018-05-29 06:22:45 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-05-29 06:22:45 +0000 |
commit | a34f8731c7c3f96e3532b8e51ae275ce6fd78f3c (patch) | |
tree | b7f733413984fc277e9e41a7b3370b9e9526297c | |
parent | 07c9ec6f2e8d06ac0fd2a01df2c50c533e8458c3 (diff) | |
download | bcm5719-llvm-a34f8731c7c3f96e3532b8e51ae275ce6fd78f3c.tar.gz bcm5719-llvm-a34f8731c7c3f96e3532b8e51ae275ce6fd78f3c.zip |
[X86] Disable a DAG combine to allow packed AVX512DQ instructions to be consistently used for i64->float/double conversions.
Summary: We already get this right if the i64 didn't come from a load.
Reviewers: RKSimon
Reviewed By: RKSimon
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D47439
llvm-svn: 333393
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/scalar-int-to-fp.ll | 92 |
2 files changed, 77 insertions, 20 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 15eeddf0faa..38649b8fdf0 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -37729,6 +37729,11 @@ static SDValue combineSIntToFP(SDNode *N, SelectionDAG &DAG, if (VT == MVT::f16 || VT == MVT::f128) return SDValue(); + // If we have AVX512DQ we can use packed conversion instructions unless + // the VT is f80. + if (Subtarget.hasDQI() && VT != MVT::f80) + return SDValue(); + if (!Ld->isVolatile() && !VT.isVector() && ISD::isNON_EXTLoad(Op0.getNode()) && Op0.hasOneUse() && !Subtarget.is64Bit() && LdVT == MVT::i64) { diff --git a/llvm/test/CodeGen/X86/scalar-int-to-fp.ll b/llvm/test/CodeGen/X86/scalar-int-to-fp.ll index 491fd3d05b6..4fe77c60c95 100644 --- a/llvm/test/CodeGen/X86/scalar-int-to-fp.ll +++ b/llvm/test/CodeGen/X86/scalar-int-to-fp.ll @@ -410,20 +410,42 @@ define float @u64_to_f(i64 %a) nounwind { } define float @s64_to_f(i64 %a) nounwind { -; AVX512_32-LABEL: s64_to_f: -; AVX512_32: # %bb.0: -; AVX512_32-NEXT: pushl %eax -; AVX512_32-NEXT: fildll {{[0-9]+}}(%esp) -; AVX512_32-NEXT: fstps (%esp) -; AVX512_32-NEXT: flds (%esp) -; AVX512_32-NEXT: popl %eax -; AVX512_32-NEXT: retl +; AVX512DQVL_32-LABEL: s64_to_f: +; AVX512DQVL_32: # %bb.0: +; AVX512DQVL_32-NEXT: pushl %eax +; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQVL_32-NEXT: vcvtqq2ps %ymm0, %xmm0 +; AVX512DQVL_32-NEXT: vmovss %xmm0, (%esp) +; AVX512DQVL_32-NEXT: flds (%esp) +; AVX512DQVL_32-NEXT: popl %eax +; AVX512DQVL_32-NEXT: vzeroupper +; AVX512DQVL_32-NEXT: retl ; ; AVX512_64-LABEL: s64_to_f: ; AVX512_64: # %bb.0: ; AVX512_64-NEXT: vcvtsi2ssq %rdi, %xmm0, %xmm0 ; AVX512_64-NEXT: retq ; +; AVX512DQ_32-LABEL: s64_to_f: +; AVX512DQ_32: # %bb.0: +; AVX512DQ_32-NEXT: pushl %eax +; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQ_32-NEXT: vcvtqq2ps %zmm0, %ymm0 +; AVX512DQ_32-NEXT: vmovss %xmm0, (%esp) +; AVX512DQ_32-NEXT: flds (%esp) +; AVX512DQ_32-NEXT: popl %eax +; AVX512DQ_32-NEXT: vzeroupper +; AVX512DQ_32-NEXT: retl +; +; AVX512F_32-LABEL: s64_to_f: +; AVX512F_32: # %bb.0: +; AVX512F_32-NEXT: pushl %eax +; AVX512F_32-NEXT: fildll {{[0-9]+}}(%esp) +; AVX512F_32-NEXT: fstps (%esp) +; AVX512F_32-NEXT: flds (%esp) +; AVX512F_32-NEXT: popl %eax +; AVX512F_32-NEXT: retl +; ; SSE2_32-LABEL: s64_to_f: ; SSE2_32: # %bb.0: ; SSE2_32-NEXT: pushl %eax @@ -656,24 +678,54 @@ define double @u64_to_d(i64 %a) nounwind { } define double @s64_to_d(i64 %a) nounwind { -; AVX512_32-LABEL: s64_to_d: -; AVX512_32: # %bb.0: -; AVX512_32-NEXT: pushl %ebp -; AVX512_32-NEXT: movl %esp, %ebp -; AVX512_32-NEXT: andl $-8, %esp -; AVX512_32-NEXT: subl $8, %esp -; AVX512_32-NEXT: fildll 8(%ebp) -; AVX512_32-NEXT: fstpl (%esp) -; AVX512_32-NEXT: fldl (%esp) -; AVX512_32-NEXT: movl %ebp, %esp -; AVX512_32-NEXT: popl %ebp -; AVX512_32-NEXT: retl +; AVX512DQVL_32-LABEL: s64_to_d: +; AVX512DQVL_32: # %bb.0: +; AVX512DQVL_32-NEXT: pushl %ebp +; AVX512DQVL_32-NEXT: movl %esp, %ebp +; AVX512DQVL_32-NEXT: andl $-8, %esp +; AVX512DQVL_32-NEXT: subl $8, %esp +; AVX512DQVL_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQVL_32-NEXT: vcvtqq2pd %ymm0, %ymm0 +; AVX512DQVL_32-NEXT: vmovlps %xmm0, (%esp) +; AVX512DQVL_32-NEXT: fldl (%esp) +; AVX512DQVL_32-NEXT: movl %ebp, %esp +; AVX512DQVL_32-NEXT: popl %ebp +; AVX512DQVL_32-NEXT: vzeroupper +; AVX512DQVL_32-NEXT: retl ; ; AVX512_64-LABEL: s64_to_d: ; AVX512_64: # %bb.0: ; AVX512_64-NEXT: vcvtsi2sdq %rdi, %xmm0, %xmm0 ; AVX512_64-NEXT: retq ; +; AVX512DQ_32-LABEL: s64_to_d: +; AVX512DQ_32: # %bb.0: +; AVX512DQ_32-NEXT: pushl %ebp +; AVX512DQ_32-NEXT: movl %esp, %ebp +; AVX512DQ_32-NEXT: andl $-8, %esp +; AVX512DQ_32-NEXT: subl $8, %esp +; AVX512DQ_32-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; AVX512DQ_32-NEXT: vcvtqq2pd %zmm0, %zmm0 +; AVX512DQ_32-NEXT: vmovlps %xmm0, (%esp) +; AVX512DQ_32-NEXT: fldl (%esp) +; AVX512DQ_32-NEXT: movl %ebp, %esp +; AVX512DQ_32-NEXT: popl %ebp +; AVX512DQ_32-NEXT: vzeroupper +; AVX512DQ_32-NEXT: retl +; +; AVX512F_32-LABEL: s64_to_d: +; AVX512F_32: # %bb.0: +; AVX512F_32-NEXT: pushl %ebp +; AVX512F_32-NEXT: movl %esp, %ebp +; AVX512F_32-NEXT: andl $-8, %esp +; AVX512F_32-NEXT: subl $8, %esp +; AVX512F_32-NEXT: fildll 8(%ebp) +; AVX512F_32-NEXT: fstpl (%esp) +; AVX512F_32-NEXT: fldl (%esp) +; AVX512F_32-NEXT: movl %ebp, %esp +; AVX512F_32-NEXT: popl %ebp +; AVX512F_32-NEXT: retl +; ; SSE2_32-LABEL: s64_to_d: ; SSE2_32: # %bb.0: ; SSE2_32-NEXT: pushl %ebp |