Skip to content

Commit a9e2891

Browse files
committed
[x86] allow narrowing of vector UINT_TO_FP
As discussed in: D56864 D58197 Always use the narrow (128-bit) instruction when possible. We already had the signed int version of this transform. llvm-svn: 354675
1 parent 1baf789 commit a9e2891

File tree

3 files changed

+13
-24
lines changed

3 files changed

+13
-24
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42016,6 +42016,11 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
4201642016
InVec.getOperand(0).getValueType() == MVT::v4i32) {
4201742017
return DAG.getNode(X86ISD::CVTSI2P, SDLoc(N), VT, InVec.getOperand(0));
4201842018
}
42019+
// v2f64 CVTUDQ2PD(v4i32).
42020+
if (InOpcode == ISD::UINT_TO_FP &&
42021+
InVec.getOperand(0).getValueType() == MVT::v4i32) {
42022+
return DAG.getNode(X86ISD::CVTUI2P, SDLoc(N), VT, InVec.getOperand(0));
42023+
}
4201942024
// v2f64 CVTPS2PD(v4f32).
4202042025
if (InOpcode == ISD::FP_EXTEND &&
4202142026
InVec.getOperand(0).getValueType() == MVT::v4f32) {

llvm/test/CodeGen/X86/vec_int_to_fp-widen.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -684,9 +684,7 @@ define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
684684
;
685685
; AVX512VL-LABEL: uitofp_4i32_to_2f64:
686686
; AVX512VL: # %bb.0:
687-
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %ymm0
688-
; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
689-
; AVX512VL-NEXT: vzeroupper
687+
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0
690688
; AVX512VL-NEXT: retq
691689
;
692690
; AVX512DQ-LABEL: uitofp_4i32_to_2f64:
@@ -699,9 +697,7 @@ define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
699697
;
700698
; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:
701699
; AVX512VLDQ: # %bb.0:
702-
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %ymm0
703-
; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
704-
; AVX512VLDQ-NEXT: vzeroupper
700+
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0
705701
; AVX512VLDQ-NEXT: retq
706702
%cvt = uitofp <4 x i32> %a to <4 x double>
707703
%shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>

llvm/test/CodeGen/X86/vec_int_to_fp.ll

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -684,9 +684,7 @@ define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
684684
;
685685
; AVX512VL-LABEL: uitofp_4i32_to_2f64:
686686
; AVX512VL: # %bb.0:
687-
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %ymm0
688-
; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
689-
; AVX512VL-NEXT: vzeroupper
687+
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0
690688
; AVX512VL-NEXT: retq
691689
;
692690
; AVX512DQ-LABEL: uitofp_4i32_to_2f64:
@@ -699,9 +697,7 @@ define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {
699697
;
700698
; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:
701699
; AVX512VLDQ: # %bb.0:
702-
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %ymm0
703-
; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
704-
; AVX512VLDQ-NEXT: vzeroupper
700+
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0
705701
; AVX512VLDQ-NEXT: retq
706702
%cvt = uitofp <4 x i32> %a to <4 x double>
707703
%shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>
@@ -5699,9 +5695,7 @@ define double @extract0_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
56995695
;
57005696
; AVX512VL-LABEL: extract0_uitofp_v4i32_f64:
57015697
; AVX512VL: # %bb.0:
5702-
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %ymm0
5703-
; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
5704-
; AVX512VL-NEXT: vzeroupper
5698+
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0
57055699
; AVX512VL-NEXT: retq
57065700
;
57075701
; AVX512DQ-LABEL: extract0_uitofp_v4i32_f64:
@@ -5714,9 +5708,7 @@ define double @extract0_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
57145708
;
57155709
; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f64:
57165710
; AVX512VLDQ: # %bb.0:
5717-
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %ymm0
5718-
; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
5719-
; AVX512VLDQ-NEXT: vzeroupper
5711+
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0
57205712
; AVX512VLDQ-NEXT: retq
57215713
%e = extractelement <4 x i32> %x, i32 0
57225714
%r = uitofp i32 %e to double
@@ -5855,9 +5847,7 @@ define double @extract3_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
58555847
; AVX512VL-LABEL: extract3_uitofp_v4i32_f64:
58565848
; AVX512VL: # %bb.0:
58575849
; AVX512VL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
5858-
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %ymm0
5859-
; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
5860-
; AVX512VL-NEXT: vzeroupper
5850+
; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0
58615851
; AVX512VL-NEXT: retq
58625852
;
58635853
; AVX512DQ-LABEL: extract3_uitofp_v4i32_f64:
@@ -5871,9 +5861,7 @@ define double @extract3_uitofp_v4i32_f64(<4 x i32> %x) nounwind {
58715861
; AVX512VLDQ-LABEL: extract3_uitofp_v4i32_f64:
58725862
; AVX512VLDQ: # %bb.0:
58735863
; AVX512VLDQ-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
5874-
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %ymm0
5875-
; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
5876-
; AVX512VLDQ-NEXT: vzeroupper
5864+
; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0
58775865
; AVX512VLDQ-NEXT: retq
58785866
%e = extractelement <4 x i32> %x, i32 3
58795867
%r = uitofp i32 %e to double

0 commit comments

Comments
 (0)