Skip to content

Commit 600a83b

Browse files
committed
[X86] IsNOT - match or(not(X),not(Y)) -> and(X,Y)
Fixes llvm#116977
1 parent 97ac848 commit 600a83b

File tree

2 files changed

+27
-31
lines changed

2 files changed

+27
-31
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5211,8 +5211,10 @@ static bool isConstantPowerOf2(SDValue V, unsigned EltSizeInBIts,
52115211
// Match not(pcmpgt(C, X)) -> pcmpgt(X, C - 1).
52125212
// Match not(extract_subvector(xor X, -1)) -> extract_subvector(X).
52135213
// Match not(concat_vectors(xor X, -1, xor Y, -1)) -> concat_vectors(X, Y).
5214+
// Match or(not(X),not(Y)) -> and(X, Y).
52145215
static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
52155216
V = peekThroughBitcasts(V);
5217+
EVT VT = V.getValueType();
52165218
if (V.getOpcode() == ISD::XOR &&
52175219
(ISD::isBuildVectorAllOnes(V.getOperand(1).getNode()) ||
52185220
isAllOnesConstant(V.getOperand(1))))
@@ -5221,8 +5223,8 @@ static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
52215223
(isNullConstant(V.getOperand(1)) || V.getOperand(0).hasOneUse())) {
52225224
if (SDValue Not = IsNOT(V.getOperand(0), DAG)) {
52235225
Not = DAG.getBitcast(V.getOperand(0).getValueType(), Not);
5224-
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Not), V.getValueType(),
5225-
Not, V.getOperand(1));
5226+
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Not), VT, Not,
5227+
V.getOperand(1));
52265228
}
52275229
}
52285230
if (V.getOpcode() == X86ISD::PCMPGT &&
@@ -5255,7 +5257,15 @@ static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
52555257
if (!NotCat) return SDValue();
52565258
CatOp = DAG.getBitcast(CatOp.getValueType(), NotCat);
52575259
}
5258-
return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(V), V.getValueType(), CatOps);
5260+
return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(V), VT, CatOps);
5261+
}
5262+
if (V.getOpcode() == ISD::OR && DAG.getTargetLoweringInfo().isTypeLegal(VT) &&
5263+
V.getOperand(0).hasOneUse() && V.getOperand(1).hasOneUse()) {
5264+
// TODO: Handle cases with single NOT operand -> ANDNP
5265+
if (SDValue Op1 = IsNOT(V.getOperand(1), DAG))
5266+
if (SDValue Op0 = IsNOT(V.getOperand(0), DAG))
5267+
return DAG.getNode(ISD::AND, SDLoc(V), VT, DAG.getBitcast(VT, Op0),
5268+
DAG.getBitcast(VT, Op1));
52595269
}
52605270
return SDValue();
52615271
}

llvm/test/CodeGen/X86/vector-compare-all_of.ll

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,55 +1599,41 @@ define i1 @PR116977(<32 x i8> %a, <32 x i8> %b, <32 x i8> %v) {
15991599
; SSE-LABEL: PR116977:
16001600
; SSE: # %bb.0:
16011601
; SSE-NEXT: pcmpeqb %xmm4, %xmm0
1602-
; SSE-NEXT: pcmpeqd %xmm6, %xmm6
1603-
; SSE-NEXT: pxor %xmm6, %xmm0
16041602
; SSE-NEXT: pcmpeqb %xmm5, %xmm1
1605-
; SSE-NEXT: pxor %xmm6, %xmm1
16061603
; SSE-NEXT: pcmpeqb %xmm4, %xmm2
1607-
; SSE-NEXT: pxor %xmm6, %xmm2
1608-
; SSE-NEXT: por %xmm0, %xmm2
1604+
; SSE-NEXT: pand %xmm0, %xmm2
16091605
; SSE-NEXT: pcmpeqb %xmm5, %xmm3
1610-
; SSE-NEXT: pxor %xmm6, %xmm3
1611-
; SSE-NEXT: por %xmm1, %xmm3
1612-
; SSE-NEXT: por %xmm2, %xmm3
1606+
; SSE-NEXT: pand %xmm1, %xmm3
1607+
; SSE-NEXT: pand %xmm2, %xmm3
16131608
; SSE-NEXT: pmovmskb %xmm3, %eax
1614-
; SSE-NEXT: testl %eax, %eax
1609+
; SSE-NEXT: cmpl $65535, %eax # imm = 0xFFFF
16151610
; SSE-NEXT: sete %al
16161611
; SSE-NEXT: retq
16171612
;
16181613
; AVX1-LABEL: PR116977:
16191614
; AVX1: # %bb.0:
16201615
; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm3
1621-
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
1622-
; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
16231616
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1624-
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1625-
; AVX1-NEXT: vpcmpeqb %xmm0, %xmm5, %xmm0
1626-
; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0
1617+
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1618+
; AVX1-NEXT: vpcmpeqb %xmm0, %xmm4, %xmm0
16271619
; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm2
1628-
; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
1629-
; AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
1620+
; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2
16301621
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1631-
; AVX1-NEXT: vpcmpeqb %xmm1, %xmm5, %xmm1
1632-
; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
1633-
; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1634-
; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
1622+
; AVX1-NEXT: vpcmpeqb %xmm1, %xmm4, %xmm1
1623+
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
1624+
; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0
16351625
; AVX1-NEXT: vpmovmskb %xmm0, %eax
1636-
; AVX1-NEXT: testl %eax, %eax
1626+
; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
16371627
; AVX1-NEXT: sete %al
16381628
; AVX1-NEXT: vzeroupper
16391629
; AVX1-NEXT: retq
16401630
;
16411631
; AVX2-LABEL: PR116977:
16421632
; AVX2: # %bb.0:
1643-
; AVX2-NEXT: vpcmpeqb %ymm0, %ymm2, %ymm0
1644-
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1645-
; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm0
1646-
; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1
1647-
; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1633+
; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
1634+
; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1
16481635
; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1649-
; AVX2-NEXT: vpmovmskb %ymm0, %eax
1650-
; AVX2-NEXT: testl %eax, %eax
1636+
; AVX2-NEXT: vptest %ymm0, %ymm0
16511637
; AVX2-NEXT: sete %al
16521638
; AVX2-NEXT: vzeroupper
16531639
; AVX2-NEXT: retq

0 commit comments

Comments
 (0)