Skip to content

Commit 4879a28

Browse files
committed
[DAG][X86] Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
1 parent 7a5a78b commit 4879a28

File tree

2 files changed

+21
-25
lines changed

2 files changed

+21
-25
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12070,6 +12070,17 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
1207012070
if (SDValue F = extractBooleanFlip(N0, DAG, TLI, false))
1207112071
return DAG.getSelect(DL, VT, F, N2, N1);
1207212072

12073+
// select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
12074+
if (N1.getOpcode() == ISD::ADD && N1.getOperand(0) == N2 && N1->hasOneUse() &&
12075+
DAG.isConstantIntBuildVectorOrConstantInt(N1.getOperand(1)) &&
12076+
N0.getScalarValueSizeInBits() == N1.getScalarValueSizeInBits() &&
12077+
TLI.getBooleanContents(N0.getValueType()) ==
12078+
TargetLowering::ZeroOrNegativeOneBooleanContent) {
12079+
return DAG.getNode(
12080+
ISD::ADD, DL, N1.getValueType(), N2,
12081+
DAG.getNode(ISD::AND, DL, N0.getValueType(), N1.getOperand(1), N0));
12082+
}
12083+
1207312084
// Canonicalize integer abs.
1207412085
// vselect (setg[te] X, 0), X, -X ->
1207512086
// vselect (setgt X, -1), X, -X ->

llvm/test/CodeGen/X86/vselect.ll

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,26 @@
88
; condition used by the vector select is a vector of constants.
99

1010
define <2 x i64> @masked_select_const(<2 x i64> %a, <2 x i64> %x, <2 x i64> %y) {
11-
; SSE2-LABEL: masked_select_const:
12-
; SSE2: # %bb.0:
13-
; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967272,4294967272,4294967272,4294967272]
14-
; SSE2-NEXT: paddd %xmm0, %xmm3
15-
; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
16-
; SSE2-NEXT: pand %xmm1, %xmm3
17-
; SSE2-NEXT: pandn %xmm0, %xmm1
18-
; SSE2-NEXT: por %xmm1, %xmm3
19-
; SSE2-NEXT: movdqa %xmm3, %xmm0
20-
; SSE2-NEXT: retq
21-
;
22-
; SSE41-LABEL: masked_select_const:
23-
; SSE41: # %bb.0:
24-
; SSE41-NEXT: movdqa %xmm0, %xmm3
25-
; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [4294967272,4294967272,4294967272,4294967272]
26-
; SSE41-NEXT: paddd %xmm0, %xmm4
27-
; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
28-
; SSE41-NEXT: movdqa %xmm1, %xmm0
29-
; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm3
30-
; SSE41-NEXT: movaps %xmm3, %xmm0
31-
; SSE41-NEXT: retq
11+
; SSE-LABEL: masked_select_const:
12+
; SSE: # %bb.0:
13+
; SSE-NEXT: pcmpgtd %xmm2, %xmm1
14+
; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
15+
; SSE-NEXT: paddd %xmm1, %xmm0
16+
; SSE-NEXT: retq
3217
;
3318
; AVX1-LABEL: masked_select_const:
3419
; AVX1: # %bb.0:
35-
; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
3620
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
37-
; AVX1-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0
21+
; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
22+
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
3823
; AVX1-NEXT: retq
3924
;
4025
; AVX2-LABEL: masked_select_const:
4126
; AVX2: # %bb.0:
4227
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294967272,4294967272,4294967272,4294967272]
43-
; AVX2-NEXT: vpaddd %xmm3, %xmm0, %xmm3
4428
; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
45-
; AVX2-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0
29+
; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1
30+
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
4631
; AVX2-NEXT: retq
4732
%bit_a = bitcast <2 x i64> %a to <4 x i32>
4833
%sub.i = add <4 x i32> %bit_a, <i32 -24, i32 -24, i32 -24, i32 -24>

0 commit comments

Comments
 (0)