[llvm] d88067c - [X86] combineTargetShuffle - canonicalize vperm2x128(x,x)/vperm2x128(undef,x) -> vperm2x128(x,undef)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 5 05:00:29 PDT 2025
Author: Simon Pilgrim
Date: 2025-06-05T12:50:33+01:00
New Revision: d88067c3410f5bf5d9b892ca421d58ec696b8b79
URL: https://github.com/llvm/llvm-project/commit/d88067c3410f5bf5d9b892ca421d58ec696b8b79
DIFF: https://github.com/llvm/llvm-project/commit/d88067c3410f5bf5d9b892ca421d58ec696b8b79.diff
LOG: [X86] combineTargetShuffle - canonicalize vperm2x128(x,x)/vperm2x128(undef,x) -> vperm2x128(x,undef)
Improves fold matching for future patches.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/matrix-multiply.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5005c5559c59c..9cff3d76913ab 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -42649,7 +42649,15 @@ static SDValue combineTargetShuffle(SDValue N, const SDLoc &DL,
case X86ISD::VPERM2X128: {
SDValue LHS = N->getOperand(0);
SDValue RHS = N->getOperand(1);
- unsigned Imm = N.getConstantOperandVal(2);
+ unsigned Imm = N.getConstantOperandVal(2) & 255;
+
+ // Canonicalize unary/repeated operands to LHS.
+ if (LHS.isUndef() && !RHS.isUndef())
+ return DAG.getNode(X86ISD::VPERM2X128, DL, VT, RHS, LHS,
+ DAG.getTargetConstant(Imm ^ 0x22, DL, MVT::i8));
+ if (LHS == RHS)
+ return DAG.getNode(X86ISD::VPERM2X128, DL, VT, LHS, DAG.getUNDEF(VT),
+ DAG.getTargetConstant(Imm & ~0x22, DL, MVT::i8));
// Fold vperm2x128(bitcast(x),bitcast(y),c) -> bitcast(vperm2x128(x,y,c)).
if (LHS.getOpcode() == ISD::BITCAST &&
diff --git a/llvm/test/CodeGen/X86/matrix-multiply.ll b/llvm/test/CodeGen/X86/matrix-multiply.ll
index 9a5bd1ce87c03..388d8528a2b80 100644
--- a/llvm/test/CodeGen/X86/matrix-multiply.ll
+++ b/llvm/test/CodeGen/X86/matrix-multiply.ll
@@ -119,9 +119,9 @@ define <4 x double> @test_mul2x2_f64(<4 x double> %a0, <4 x double> %a1) nounwin
;
; AVX1-LABEL: test_mul2x2_f64:
; AVX1: # %bb.0: # %entry
-; AVX1-NEXT: vshufpd {{.*#+}} ymm2 = ymm1[1,1,3,3]
-; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]
-; AVX1-NEXT: vmulpd %ymm2, %ymm3, %ymm2
+; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]
+; AVX1-NEXT: vshufpd {{.*#+}} ymm3 = ymm1[1,1,3,3]
+; AVX1-NEXT: vmulpd %ymm3, %ymm2, %ymm2
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; AVX1-NEXT: vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
; AVX1-NEXT: vmulpd %ymm1, %ymm0, %ymm0
More information about the llvm-commits
mailing list