Skip to content

Commit 84397c6

Browse files
committed
[X86] combineAdd - use SDPatternMatch to simplify "add(psadbw(X,0),psadbw(Y,0)) -> psadbw(add(X,Y),0)" matching.
1 parent 621a5a9 commit 84397c6

File tree

2 files changed

+38
-35
lines changed

2 files changed

+38
-35
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57906,18 +57906,17 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5790657906
if (SDValue V = combineToHorizontalAddSub(N, DAG, Subtarget))
5790757907
return V;
5790857908

57909+
SDValue X, Y;
57910+
5790957911
// add(psadbw(X,0),psadbw(Y,0)) -> psadbw(add(X,Y),0)
5791057912
// iff X and Y won't overflow.
57911-
if (Op0.getOpcode() == X86ISD::PSADBW && Op1.getOpcode() == X86ISD::PSADBW &&
57912-
ISD::isBuildVectorAllZeros(Op0.getOperand(1).getNode()) &&
57913-
ISD::isBuildVectorAllZeros(Op1.getOperand(1).getNode())) {
57914-
if (DAG.willNotOverflowAdd(false, Op0.getOperand(0), Op1.getOperand(0))) {
57915-
MVT OpVT = Op0.getOperand(1).getSimpleValueType();
57916-
SDValue Sum =
57917-
DAG.getNode(ISD::ADD, DL, OpVT, Op0.getOperand(0), Op1.getOperand(0));
57918-
return DAG.getNode(X86ISD::PSADBW, DL, VT, Sum,
57919-
getZeroVector(OpVT, Subtarget, DAG, DL));
57920-
}
57913+
if (sd_match(Op0, m_c_BinOp(X86ISD::PSADBW, m_Value(X), m_Zero())) &&
57914+
sd_match(Op1, m_c_BinOp(X86ISD::PSADBW, m_Value(Y), m_Zero())) &&
57915+
DAG.willNotOverflowAdd(/*IsSigned=*/false, X, Y)) {
57916+
MVT OpVT = X.getSimpleValueType();
57917+
SDValue Sum = DAG.getNode(ISD::ADD, DL, OpVT, X, Y);
57918+
return DAG.getNode(X86ISD::PSADBW, DL, VT, Sum,
57919+
getZeroVector(OpVT, Subtarget, DAG, DL));
5792157920
}
5792257921

5792357922
// If vectors of i1 are legal, turn (add (zext (vXi1 X)), Y) into
@@ -57926,7 +57925,6 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5792657925
// generic DAG combine without a legal type check, but adding this there
5792757926
// caused regressions.
5792857927
if (VT.isVector()) {
57929-
SDValue X, Y;
5793057928
EVT BoolVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
5793157929
VT.getVectorElementCount());
5793257930
if (DAG.getTargetLoweringInfo().isTypeLegal(BoolVT) &&

llvm/test/CodeGen/X86/vector-reduce-ctpop.ll

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,13 @@ define i64 @reduce_ctpop_v8i64(<8 x i64> %a0) {
546546
; SSE42-NEXT: pshufb %xmm1, %xmm4
547547
; SSE42-NEXT: paddb %xmm6, %xmm4
548548
; SSE42-NEXT: paddb %xmm0, %xmm4
549-
; SSE42-NEXT: paddb %xmm2, %xmm4
550549
; SSE42-NEXT: pxor %xmm0, %xmm0
551-
; SSE42-NEXT: psadbw %xmm4, %xmm0
552-
; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
553-
; SSE42-NEXT: paddq %xmm0, %xmm1
554-
; SSE42-NEXT: movq %xmm1, %rax
550+
; SSE42-NEXT: psadbw %xmm0, %xmm4
551+
; SSE42-NEXT: psadbw %xmm0, %xmm2
552+
; SSE42-NEXT: paddq %xmm4, %xmm2
553+
; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
554+
; SSE42-NEXT: paddq %xmm2, %xmm0
555+
; SSE42-NEXT: movq %xmm0, %rax
555556
; SSE42-NEXT: retq
556557
;
557558
; AVX2-LABEL: reduce_ctpop_v8i64:
@@ -811,16 +812,15 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
811812
; SSE42-NEXT: pshufb %xmm3, %xmm1
812813
; SSE42-NEXT: paddb %xmm7, %xmm1
813814
; SSE42-NEXT: paddb %xmm11, %xmm1
814-
; SSE42-NEXT: paddb %xmm5, %xmm1
815815
; SSE42-NEXT: movdqa %xmm4, %xmm3
816816
; SSE42-NEXT: pand %xmm9, %xmm3
817-
; SSE42-NEXT: movdqa %xmm8, %xmm5
818-
; SSE42-NEXT: pshufb %xmm3, %xmm5
817+
; SSE42-NEXT: movdqa %xmm8, %xmm7
818+
; SSE42-NEXT: pshufb %xmm3, %xmm7
819819
; SSE42-NEXT: psrlw $4, %xmm4
820820
; SSE42-NEXT: pand %xmm9, %xmm4
821-
; SSE42-NEXT: movdqa %xmm8, %xmm7
822-
; SSE42-NEXT: pshufb %xmm4, %xmm7
823-
; SSE42-NEXT: paddb %xmm5, %xmm7
821+
; SSE42-NEXT: movdqa %xmm8, %xmm10
822+
; SSE42-NEXT: pshufb %xmm4, %xmm10
823+
; SSE42-NEXT: paddb %xmm7, %xmm10
824824
; SSE42-NEXT: movdqa %xmm0, %xmm3
825825
; SSE42-NEXT: pand %xmm9, %xmm3
826826
; SSE42-NEXT: movdqa %xmm8, %xmm4
@@ -830,7 +830,7 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
830830
; SSE42-NEXT: movdqa %xmm8, %xmm3
831831
; SSE42-NEXT: pshufb %xmm0, %xmm3
832832
; SSE42-NEXT: paddb %xmm4, %xmm3
833-
; SSE42-NEXT: paddb %xmm7, %xmm3
833+
; SSE42-NEXT: paddb %xmm10, %xmm3
834834
; SSE42-NEXT: movdqa %xmm6, %xmm0
835835
; SSE42-NEXT: pand %xmm9, %xmm0
836836
; SSE42-NEXT: movdqa %xmm8, %xmm4
@@ -842,20 +842,24 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
842842
; SSE42-NEXT: paddb %xmm4, %xmm0
843843
; SSE42-NEXT: movdqa %xmm2, %xmm4
844844
; SSE42-NEXT: pand %xmm9, %xmm4
845-
; SSE42-NEXT: movdqa %xmm8, %xmm5
846-
; SSE42-NEXT: pshufb %xmm4, %xmm5
845+
; SSE42-NEXT: movdqa %xmm8, %xmm6
846+
; SSE42-NEXT: pshufb %xmm4, %xmm6
847847
; SSE42-NEXT: psrlw $4, %xmm2
848848
; SSE42-NEXT: pand %xmm9, %xmm2
849849
; SSE42-NEXT: pshufb %xmm2, %xmm8
850-
; SSE42-NEXT: paddb %xmm5, %xmm8
850+
; SSE42-NEXT: paddb %xmm6, %xmm8
851851
; SSE42-NEXT: paddb %xmm0, %xmm8
852-
; SSE42-NEXT: paddb %xmm3, %xmm8
853-
; SSE42-NEXT: paddb %xmm1, %xmm8
854852
; SSE42-NEXT: pxor %xmm0, %xmm0
855-
; SSE42-NEXT: psadbw %xmm8, %xmm0
856-
; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
857-
; SSE42-NEXT: paddq %xmm0, %xmm1
858-
; SSE42-NEXT: movq %xmm1, %rax
853+
; SSE42-NEXT: psadbw %xmm0, %xmm8
854+
; SSE42-NEXT: psadbw %xmm0, %xmm3
855+
; SSE42-NEXT: paddq %xmm8, %xmm3
856+
; SSE42-NEXT: psadbw %xmm0, %xmm1
857+
; SSE42-NEXT: psadbw %xmm0, %xmm5
858+
; SSE42-NEXT: paddq %xmm1, %xmm5
859+
; SSE42-NEXT: paddq %xmm3, %xmm5
860+
; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
861+
; SSE42-NEXT: paddq %xmm5, %xmm0
862+
; SSE42-NEXT: movq %xmm0, %rax
859863
; SSE42-NEXT: retq
860864
;
861865
; AVX2-LABEL: reduce_ctpop_v16i64:
@@ -889,9 +893,10 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
889893
; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1
890894
; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1
891895
; AVX2-NEXT: vpaddb %ymm2, %ymm1, %ymm1
892-
; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
893-
; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
894-
; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
896+
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
897+
; AVX2-NEXT: vpsadbw %ymm2, %ymm1, %ymm1
898+
; AVX2-NEXT: vpsadbw %ymm2, %ymm0, %ymm0
899+
; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
895900
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
896901
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
897902
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]

0 commit comments

Comments
 (0)