Skip to content

Commit 90933d8

Browse files
committed
[DAG][X86] Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
1 parent 1fe9a56 commit 90933d8

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
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: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,28 @@
44
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
55
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
66

7-
; should Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
7+
; PR66101 - Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
88
define <4 x i32> @masked_select_const(<4 x i32> %a, <4 x i32> %x, <4 x i32> %y) {
9-
; SSE2-LABEL: masked_select_const:
10-
; SSE2: # %bb.0:
11-
; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967272,4294967272,4294967272,4294967272]
12-
; SSE2-NEXT: paddd %xmm0, %xmm3
13-
; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
14-
; SSE2-NEXT: pand %xmm1, %xmm3
15-
; SSE2-NEXT: pandn %xmm0, %xmm1
16-
; SSE2-NEXT: por %xmm1, %xmm3
17-
; SSE2-NEXT: movdqa %xmm3, %xmm0
18-
; SSE2-NEXT: retq
19-
;
20-
; SSE41-LABEL: masked_select_const:
21-
; SSE41: # %bb.0:
22-
; SSE41-NEXT: movdqa %xmm0, %xmm3
23-
; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [4294967272,4294967272,4294967272,4294967272]
24-
; SSE41-NEXT: paddd %xmm0, %xmm4
25-
; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
26-
; SSE41-NEXT: movdqa %xmm1, %xmm0
27-
; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm3
28-
; SSE41-NEXT: movaps %xmm3, %xmm0
29-
; SSE41-NEXT: retq
9+
; SSE-LABEL: masked_select_const:
10+
; SSE: # %bb.0:
11+
; SSE-NEXT: pcmpgtd %xmm2, %xmm1
12+
; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
13+
; SSE-NEXT: paddd %xmm1, %xmm0
14+
; SSE-NEXT: retq
3015
;
3116
; AVX1-LABEL: masked_select_const:
3217
; AVX1: # %bb.0:
33-
; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
3418
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
35-
; AVX1-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0
19+
; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
20+
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
3621
; AVX1-NEXT: retq
3722
;
3823
; AVX2-LABEL: masked_select_const:
3924
; AVX2: # %bb.0:
4025
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294967272,4294967272,4294967272,4294967272]
41-
; AVX2-NEXT: vpaddd %xmm3, %xmm0, %xmm3
4226
; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
43-
; AVX2-NEXT: vblendvps %xmm1, %xmm3, %xmm0, %xmm0
27+
; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1
28+
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
4429
; AVX2-NEXT: retq
4530
%sub.i = add <4 x i32> %a, <i32 -24, i32 -24, i32 -24, i32 -24>
4631
%cmp.i = icmp sgt <4 x i32> %x, %y

0 commit comments

Comments
 (0)