[llvm] r333393 - [X86] Disable a DAG combine to allow packed AVX512DQ instructions to be consistently used for i64->float/double conversions.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Mon May 28 23:22:46 PDT 2018
Author: ctopper
Date: Mon May 28 23:22:45 2018
New Revision: 333393
URL: http://llvm.org/viewvc/llvm-project?rev=333393&view=rev
Log:
[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
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=333393&r1=333392&r2=333393&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon May 28 23:22:45 2018
@@ -37729,6 +37729,11 @@ static SDValue combineSIntToFP(SDNode *N
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) {
Modified: llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll?rev=333393&r1=333392&r2=333393&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll (original)
+++ llvm/trunk/test/CodeGen/X86/scalar-int-to-fp.ll Mon May 28 23:22:45 2018
@@ -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
More information about the llvm-commits
mailing list