summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2019-05-17 14:04:56 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2019-05-17 14:04:56 +0000
commit62c7032c1832d50d474f562341a3283c5c6aa521 (patch)
tree52c41138b4471b0e71aba91097f8b6d9ab9799e7 /llvm/lib/Target
parentc8dcbed6e4cf3185b292f2a7458c335c002ac5c0 (diff)
downloadbcm5719-llvm-62c7032c1832d50d474f562341a3283c5c6aa521.tar.gz
bcm5719-llvm-62c7032c1832d50d474f562341a3283c5c6aa521.zip
[X86][AVX] isNOT - add extract_subvector(xor X, -1) -> extract_subvector(X) fold.
Prep work for the removal of the remaining x86 CTTZ vector lowering. llvm-svn: 361035
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a63110070c4..6366f2e4f7c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -37448,11 +37448,20 @@ static SDValue combineCompareEqual(SDNode *N, SelectionDAG &DAG,
}
// Match (xor X, -1) -> X.
+// Match extract_subvector(xor X, -1) -> extract_subvector(X).
static SDValue IsNOT(SDValue V, SelectionDAG &DAG) {
V = peekThroughBitcasts(V);
if (V.getOpcode() == ISD::XOR &&
ISD::isBuildVectorAllOnes(V.getOperand(1).getNode()))
return V.getOperand(0);
+ if (V.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
+ (isNullConstant(V.getOperand(1)) || V.getOperand(0).hasOneUse())) {
+ if (SDValue Not = IsNOT(V.getOperand(0), DAG)) {
+ Not = DAG.getBitcast(V.getOperand(0).getValueType(), Not);
+ return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(Not), V.getValueType(),
+ Not, V.getOperand(1));
+ }
+ }
return SDValue();
}
OpenPOWER on IntegriCloud