Skip to content

Commit 9975600

Browse files
authored
[X86] combineSelect - remove X86ISD::BLENDV if the condition signbit is known (#163974)
Fixes part of #162812
1 parent a55c4c8 commit 9975600

File tree

2 files changed

+25
-34
lines changed

2 files changed

+25
-34
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47726,6 +47726,15 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,
4772647726
DL, DAG, Subtarget))
4772747727
return V;
4772847728

47729+
// If the sign bit is known then BLENDV can be folded away.
47730+
if (N->getOpcode() == X86ISD::BLENDV) {
47731+
KnownBits KnownCond = DAG.computeKnownBits(Cond);
47732+
if (KnownCond.isNegative())
47733+
return LHS;
47734+
if (KnownCond.isNonNegative())
47735+
return RHS;
47736+
}
47737+
4772947738
if (N->getOpcode() == ISD::VSELECT || N->getOpcode() == X86ISD::BLENDV) {
4773047739
SmallVector<int, 64> CondMask;
4773147740
if (createShuffleMaskFromVSELECT(CondMask, Cond,

llvm/test/CodeGen/X86/pr162812.ll

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,61 +34,43 @@ define <32 x i8> @PR162812(<32 x i8> %a, <32 x i8> %mask) {
3434
;
3535
; SSE42-LABEL: PR162812:
3636
; SSE42: # %bb.0:
37-
; SSE42-NEXT: movdqa %xmm2, %xmm5
38-
; SSE42-NEXT: movdqa %xmm0, %xmm2
37+
; SSE42-NEXT: movdqa %xmm0, %xmm4
38+
; SSE42-NEXT: psrlw $2, %xmm2
39+
; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [8224,8224,8224,8224,8224,8224,8224,8224]
40+
; SSE42-NEXT: pand %xmm5, %xmm2
41+
; SSE42-NEXT: paddb %xmm2, %xmm2
42+
; SSE42-NEXT: paddb %xmm2, %xmm2
3943
; SSE42-NEXT: movdqa %xmm0, %xmm6
40-
; SSE42-NEXT: psllw $2, %xmm6
41-
; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
42-
; SSE42-NEXT: pand %xmm7, %xmm6
43-
; SSE42-NEXT: psrlw $2, %xmm5
44-
; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [8224,8224,8224,8224,8224,8224,8224,8224]
45-
; SSE42-NEXT: pand %xmm4, %xmm5
44+
; SSE42-NEXT: paddb %xmm0, %xmm6
45+
; SSE42-NEXT: movdqa %xmm2, %xmm0
46+
; SSE42-NEXT: pblendvb %xmm0, %xmm6, %xmm4
47+
; SSE42-NEXT: psrlw $2, %xmm3
48+
; SSE42-NEXT: pand %xmm3, %xmm5
4649
; SSE42-NEXT: paddb %xmm5, %xmm5
47-
; SSE42-NEXT: movdqa %xmm5, %xmm0
48-
; SSE42-NEXT: pblendvb %xmm0, %xmm6, %xmm2
49-
; SSE42-NEXT: movdqa %xmm2, %xmm6
50-
; SSE42-NEXT: paddb %xmm2, %xmm6
5150
; SSE42-NEXT: paddb %xmm5, %xmm5
51+
; SSE42-NEXT: movdqa %xmm1, %xmm2
52+
; SSE42-NEXT: paddb %xmm1, %xmm2
5253
; SSE42-NEXT: movdqa %xmm5, %xmm0
53-
; SSE42-NEXT: pblendvb %xmm0, %xmm6, %xmm2
54-
; SSE42-NEXT: movdqa %xmm1, %xmm5
55-
; SSE42-NEXT: psllw $2, %xmm5
56-
; SSE42-NEXT: pand %xmm7, %xmm5
57-
; SSE42-NEXT: psrlw $2, %xmm3
58-
; SSE42-NEXT: pand %xmm3, %xmm4
59-
; SSE42-NEXT: paddb %xmm4, %xmm4
60-
; SSE42-NEXT: movdqa %xmm4, %xmm0
61-
; SSE42-NEXT: pblendvb %xmm0, %xmm5, %xmm1
62-
; SSE42-NEXT: movdqa %xmm1, %xmm3
63-
; SSE42-NEXT: paddb %xmm1, %xmm3
64-
; SSE42-NEXT: paddb %xmm4, %xmm4
54+
; SSE42-NEXT: pblendvb %xmm0, %xmm2, %xmm1
6555
; SSE42-NEXT: movdqa %xmm4, %xmm0
66-
; SSE42-NEXT: pblendvb %xmm0, %xmm3, %xmm1
67-
; SSE42-NEXT: movdqa %xmm2, %xmm0
6856
; SSE42-NEXT: retq
6957
;
7058
; AVX2-LABEL: PR162812:
7159
; AVX2: # %bb.0:
72-
; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
73-
; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
60+
; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
7461
; AVX2-NEXT: vpsrlw $2, %ymm1, %ymm1
7562
; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
7663
; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
77-
; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
78-
; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
7964
; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
8065
; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
8166
; AVX2-NEXT: retq
8267
;
8368
; AVX512-LABEL: PR162812:
8469
; AVX512: # %bb.0:
85-
; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
86-
; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2
70+
; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
8771
; AVX512-NEXT: vpsrlw $2, %ymm1, %ymm1
8872
; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1
8973
; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
90-
; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
91-
; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2
9274
; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1
9375
; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
9476
; AVX512-NEXT: retq

0 commit comments

Comments
 (0)