[llvm] 56b2be4 - [X86] Fold scalar_to_vector(funnel(x,y,imm)) -> funnel(scalar_to_vector(x),scalar_to_vector(y),imm)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 5 08:47:06 PDT 2024
Author: Simon Pilgrim
Date: 2024-09-05T16:46:13+01:00
New Revision: 56b2be4a7608770bae5db9d467f50c232c3cf19a
URL: https://github.com/llvm/llvm-project/commit/56b2be4a7608770bae5db9d467f50c232c3cf19a
DIFF: https://github.com/llvm/llvm-project/commit/56b2be4a7608770bae5db9d467f50c232c3cf19a.diff
LOG: [X86] Fold scalar_to_vector(funnel(x,y,imm)) -> funnel(scalar_to_vector(x),scalar_to_vector(y),imm)
Limit this to cases where x, y are known to be extracted from a vector.
Addresses poor x86 codegen on #107289
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/vector-shuffle-combining.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a4ad4a1bb12013..c91d37727b6117 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -57500,6 +57500,24 @@ static SDValue combineScalarToVector(SDNode *N, SelectionDAG &DAG,
}
}
break;
+ case ISD::FSHL:
+ case ISD::FSHR:
+ if (auto *Amt = dyn_cast<ConstantSDNode>(Src.getOperand(2))) {
+ if (supportedVectorShiftWithImm(VT, Subtarget, ISD::SHL) &&
+ Src.getOperand(0).getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
+ Src.getOperand(1).getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
+ Src.hasOneUse()) {
+ uint64_t AmtVal =
+ Amt->getAPIntValue().urem(Src.getScalarValueSizeInBits());
+ SDValue SrcVec0 =
+ DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, Src.getOperand(0));
+ SDValue SrcVec1 =
+ DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, Src.getOperand(1));
+ return DAG.getNode(Src.getOpcode(), DL, VT, SrcVec0, SrcVec1,
+ DAG.getConstant(AmtVal, DL, VT));
+ }
+ }
+ break;
}
return SDValue();
diff --git a/llvm/test/CodeGen/X86/vector-shuffle-combining.ll b/llvm/test/CodeGen/X86/vector-shuffle-combining.ll
index 04262b42492560..36c4be5f1939ec 100644
--- a/llvm/test/CodeGen/X86/vector-shuffle-combining.ll
+++ b/llvm/test/CodeGen/X86/vector-shuffle-combining.ll
@@ -3534,46 +3534,14 @@ define <4 x i32> @PR63700(i128 %0) {
}
define <16 x i8> @PR107289(<16 x i8> %0) {
-; SSE2-LABEL: PR107289:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movq %xmm0, %rax
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; SSE2-NEXT: movq %xmm1, %rcx
-; SSE2-NEXT: shldq $8, %rax, %rcx
-; SSE2-NEXT: movq %rcx, %xmm1
-; SSE2-NEXT: psllq $8, %xmm0
-; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
-; SSE2-NEXT: retq
-;
-; SSSE3-LABEL: PR107289:
-; SSSE3: # %bb.0:
-; SSSE3-NEXT: movq %xmm0, %rax
-; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; SSSE3-NEXT: movq %xmm1, %rcx
-; SSSE3-NEXT: shldq $8, %rax, %rcx
-; SSSE3-NEXT: movq %rcx, %xmm1
-; SSSE3-NEXT: psllq $8, %xmm0
-; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
-; SSSE3-NEXT: retq
-;
-; SSE41-LABEL: PR107289:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movq %xmm0, %rax
-; SSE41-NEXT: pextrq $1, %xmm0, %rcx
-; SSE41-NEXT: shldq $8, %rax, %rcx
-; SSE41-NEXT: movq %rcx, %xmm1
-; SSE41-NEXT: psllq $8, %xmm0
-; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
-; SSE41-NEXT: retq
+; SSE-LABEL: PR107289:
+; SSE: # %bb.0:
+; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
+; SSE-NEXT: retq
;
; AVX-LABEL: PR107289:
; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: vpextrq $1, %xmm0, %rcx
-; AVX-NEXT: shldq $8, %rax, %rcx
-; AVX-NEXT: vmovq %rcx, %xmm1
-; AVX-NEXT: vpsllq $8, %xmm0, %xmm0
-; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
; AVX-NEXT: retq
%src = bitcast <16 x i8> %0 to i128
%shl = shl i128 %src, 8
More information about the llvm-commits
mailing list