Skip to content

Commit 2f1e33d

Browse files
committed
[X86] Fold add(psadbw(X,0),psadbw(Y,0)) -> psadbw(add(X,Y),0)
If the vXi8 add(X,Y) is guaranteed not to overflow then we can push the addition though the psadbw nodes (being used for reduction) and only need a single psadbw node. Noticed while working on CTPOP reduction codegen
1 parent 539febf commit 2f1e33d

File tree

2 files changed

+44
-38
lines changed

2 files changed

+44
-38
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54560,6 +54560,20 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5456054560
if (SDValue V = combineToHorizontalAddSub(N, DAG, Subtarget))
5456154561
return V;
5456254562

54563+
// add(psadbw(X,0),psadbw(Y,0)) -> psadbw(add(X,Y),0)
54564+
// iff X and Y won't overflow.
54565+
if (Op0.getOpcode() == X86ISD::PSADBW && Op1.getOpcode() == X86ISD::PSADBW &&
54566+
ISD::isBuildVectorAllZeros(Op0.getOperand(1).getNode()) &&
54567+
ISD::isBuildVectorAllZeros(Op1.getOperand(1).getNode())) {
54568+
if (DAG.willNotOverflowAdd(false, Op0.getOperand(0), Op1.getOperand(0))) {
54569+
MVT OpVT = Op0.getOperand(1).getSimpleValueType();
54570+
SDValue Sum =
54571+
DAG.getNode(ISD::ADD, DL, OpVT, Op0.getOperand(0), Op1.getOperand(0));
54572+
return DAG.getNode(X86ISD::PSADBW, DL, VT, Sum,
54573+
getZeroVector(OpVT, Subtarget, DAG, DL));
54574+
}
54575+
}
54576+
5456354577
// If vectors of i1 are legal, turn (add (zext (vXi1 X)), Y) into
5456454578
// (sub Y, (sext (vXi1 X))).
5456554579
// FIXME: We have the (sub Y, (zext (vXi1 X))) -> (add (sext (vXi1 X)), Y) in

llvm/test/CodeGen/X86/vector-reduce-add-mask.ll

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,23 +1171,21 @@ define i16 @test_v64i16_v64i8(<64 x i16> %a0) {
11711171
; SSE2-NEXT: pand %xmm8, %xmm5
11721172
; SSE2-NEXT: pand %xmm8, %xmm4
11731173
; SSE2-NEXT: packuswb %xmm5, %xmm4
1174+
; SSE2-NEXT: paddb %xmm0, %xmm4
11741175
; SSE2-NEXT: pand %xmm8, %xmm3
11751176
; SSE2-NEXT: pand %xmm8, %xmm2
11761177
; SSE2-NEXT: packuswb %xmm3, %xmm2
11771178
; SSE2-NEXT: pand %xmm8, %xmm7
11781179
; SSE2-NEXT: pand %xmm8, %xmm6
11791180
; SSE2-NEXT: packuswb %xmm7, %xmm6
1180-
; SSE2-NEXT: pxor %xmm1, %xmm1
1181-
; SSE2-NEXT: psadbw %xmm1, %xmm6
1182-
; SSE2-NEXT: psadbw %xmm1, %xmm2
1183-
; SSE2-NEXT: paddq %xmm6, %xmm2
1184-
; SSE2-NEXT: psadbw %xmm1, %xmm4
1185-
; SSE2-NEXT: psadbw %xmm1, %xmm0
1181+
; SSE2-NEXT: paddb %xmm2, %xmm6
1182+
; SSE2-NEXT: pxor %xmm0, %xmm0
1183+
; SSE2-NEXT: psadbw %xmm0, %xmm6
1184+
; SSE2-NEXT: psadbw %xmm0, %xmm4
1185+
; SSE2-NEXT: paddq %xmm6, %xmm4
1186+
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
11861187
; SSE2-NEXT: paddq %xmm4, %xmm0
1187-
; SSE2-NEXT: paddq %xmm2, %xmm0
1188-
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1189-
; SSE2-NEXT: paddq %xmm0, %xmm1
1190-
; SSE2-NEXT: movd %xmm1, %eax
1188+
; SSE2-NEXT: movd %xmm0, %eax
11911189
; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
11921190
; SSE2-NEXT: retq
11931191
;
@@ -1200,23 +1198,21 @@ define i16 @test_v64i16_v64i8(<64 x i16> %a0) {
12001198
; SSE41-NEXT: pand %xmm8, %xmm5
12011199
; SSE41-NEXT: pand %xmm8, %xmm4
12021200
; SSE41-NEXT: packuswb %xmm5, %xmm4
1201+
; SSE41-NEXT: paddb %xmm0, %xmm4
12031202
; SSE41-NEXT: pand %xmm8, %xmm3
12041203
; SSE41-NEXT: pand %xmm8, %xmm2
12051204
; SSE41-NEXT: packuswb %xmm3, %xmm2
12061205
; SSE41-NEXT: pand %xmm8, %xmm7
12071206
; SSE41-NEXT: pand %xmm8, %xmm6
12081207
; SSE41-NEXT: packuswb %xmm7, %xmm6
1209-
; SSE41-NEXT: pxor %xmm1, %xmm1
1210-
; SSE41-NEXT: psadbw %xmm1, %xmm6
1211-
; SSE41-NEXT: psadbw %xmm1, %xmm2
1212-
; SSE41-NEXT: paddq %xmm6, %xmm2
1213-
; SSE41-NEXT: psadbw %xmm1, %xmm4
1214-
; SSE41-NEXT: psadbw %xmm1, %xmm0
1208+
; SSE41-NEXT: paddb %xmm2, %xmm6
1209+
; SSE41-NEXT: pxor %xmm0, %xmm0
1210+
; SSE41-NEXT: psadbw %xmm0, %xmm6
1211+
; SSE41-NEXT: psadbw %xmm0, %xmm4
1212+
; SSE41-NEXT: paddq %xmm6, %xmm4
1213+
; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
12151214
; SSE41-NEXT: paddq %xmm4, %xmm0
1216-
; SSE41-NEXT: paddq %xmm2, %xmm0
1217-
; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1218-
; SSE41-NEXT: paddq %xmm0, %xmm1
1219-
; SSE41-NEXT: movd %xmm1, %eax
1215+
; SSE41-NEXT: movd %xmm0, %eax
12201216
; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
12211217
; SSE41-NEXT: retq
12221218
;
@@ -1229,19 +1225,17 @@ define i16 @test_v64i16_v64i8(<64 x i16> %a0) {
12291225
; AVX1-NEXT: vandps %ymm4, %ymm3, %ymm3
12301226
; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
12311227
; AVX1-NEXT: vpackuswb %xmm4, %xmm3, %xmm3
1232-
; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
1233-
; AVX1-NEXT: vpsadbw %xmm4, %xmm3, %xmm3
1234-
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1235-
; AVX1-NEXT: vpackuswb %xmm5, %xmm1, %xmm1
1236-
; AVX1-NEXT: vpsadbw %xmm4, %xmm1, %xmm1
1237-
; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
1238-
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
1239-
; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
1240-
; AVX1-NEXT: vpsadbw %xmm4, %xmm2, %xmm2
1241-
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1242-
; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
1243-
; AVX1-NEXT: vpsadbw %xmm4, %xmm0, %xmm0
1244-
; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
1228+
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1229+
; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm1
1230+
; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
1231+
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
1232+
; AVX1-NEXT: vpsadbw %xmm3, %xmm1, %xmm1
1233+
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1234+
; AVX1-NEXT: vpackuswb %xmm4, %xmm2, %xmm2
1235+
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1236+
; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0
1237+
; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
1238+
; AVX1-NEXT: vpsadbw %xmm3, %xmm0, %xmm0
12451239
; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
12461240
; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
12471241
; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
@@ -1259,12 +1253,10 @@ define i16 @test_v64i16_v64i8(<64 x i16> %a0) {
12591253
; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm1
12601254
; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2
12611255
; AVX2-NEXT: vpackuswb %ymm1, %ymm2, %ymm1
1262-
; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
1263-
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1264-
; AVX2-NEXT: vpsadbw %ymm2, %ymm1, %ymm1
1256+
; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
12651257
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1266-
; AVX2-NEXT: vpsadbw %ymm2, %ymm0, %ymm0
1267-
; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1258+
; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1259+
; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
12681260
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
12691261
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
12701262
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]

0 commit comments

Comments
 (0)