Skip to content

Commit 26058e6

Browse files
authored
[DAG] select (sext m), (add X, C), X --> (add X, (and C, (sext m)))) (#83640)
- [DAG][X86] Add tests for Folding select m, add(X, C), X --> add (X, and(C, m))(NFC) - [DAG][X86] Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m)))) - Fixes: #66101
1 parent e49479b commit 26058e6

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

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

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

llvm/test/CodeGen/X86/vselect.ll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,35 @@
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+
; PR66101 - Fold select (sext m), (add X, C), X --> (add X, (and C, (sext m))))
8+
define <4 x i32> @masked_select_const(<4 x i32> %a, <4 x i32> %x, <4 x i32> %y) {
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
15+
;
16+
; AVX1-LABEL: masked_select_const:
17+
; AVX1: # %bb.0:
18+
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
19+
; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
20+
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
21+
; AVX1-NEXT: retq
22+
;
23+
; AVX2-LABEL: masked_select_const:
24+
; AVX2: # %bb.0:
25+
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294967272,4294967272,4294967272,4294967272]
26+
; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
27+
; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1
28+
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
29+
; AVX2-NEXT: retq
30+
%sub.i = add <4 x i32> %a, <i32 -24, i32 -24, i32 -24, i32 -24>
31+
%cmp.i = icmp sgt <4 x i32> %x, %y
32+
%sel = select <4 x i1> %cmp.i, <4 x i32> %sub.i, <4 x i32> %a
33+
ret <4 x i32> %sel
34+
}
35+
736
; Verify that we don't emit packed vector shifts instructions if the
837
; condition used by the vector select is a vector of constants.
938

0 commit comments

Comments
 (0)