Skip to content

Commit d88067c

Browse files
committed
[X86] combineTargetShuffle - canonicalize vperm2x128(x,x)/vperm2x128(undef,x) -> vperm2x128(x,undef)
Improves fold matching for future patches.
1 parent 91ab832 commit d88067c

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42649,7 +42649,15 @@ static SDValue combineTargetShuffle(SDValue N, const SDLoc &DL,
4264942649
case X86ISD::VPERM2X128: {
4265042650
SDValue LHS = N->getOperand(0);
4265142651
SDValue RHS = N->getOperand(1);
42652-
unsigned Imm = N.getConstantOperandVal(2);
42652+
unsigned Imm = N.getConstantOperandVal(2) & 255;
42653+
42654+
// Canonicalize unary/repeated operands to LHS.
42655+
if (LHS.isUndef() && !RHS.isUndef())
42656+
return DAG.getNode(X86ISD::VPERM2X128, DL, VT, RHS, LHS,
42657+
DAG.getTargetConstant(Imm ^ 0x22, DL, MVT::i8));
42658+
if (LHS == RHS)
42659+
return DAG.getNode(X86ISD::VPERM2X128, DL, VT, LHS, DAG.getUNDEF(VT),
42660+
DAG.getTargetConstant(Imm & ~0x22, DL, MVT::i8));
4265342661

4265442662
// Fold vperm2x128(bitcast(x),bitcast(y),c) -> bitcast(vperm2x128(x,y,c)).
4265542663
if (LHS.getOpcode() == ISD::BITCAST &&

llvm/test/CodeGen/X86/matrix-multiply.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ define <4 x double> @test_mul2x2_f64(<4 x double> %a0, <4 x double> %a1) nounwin
119119
;
120120
; AVX1-LABEL: test_mul2x2_f64:
121121
; AVX1: # %bb.0: # %entry
122-
; AVX1-NEXT: vshufpd {{.*#+}} ymm2 = ymm1[1,1,3,3]
123-
; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]
124-
; AVX1-NEXT: vmulpd %ymm2, %ymm3, %ymm2
122+
; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]
123+
; AVX1-NEXT: vshufpd {{.*#+}} ymm3 = ymm1[1,1,3,3]
124+
; AVX1-NEXT: vmulpd %ymm3, %ymm2, %ymm2
125125
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
126126
; AVX1-NEXT: vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
127127
; AVX1-NEXT: vmulpd %ymm1, %ymm0, %ymm0

0 commit comments

Comments
 (0)