summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorGuy Blank <guy.blank@intel.com>2017-08-13 08:03:37 +0000
committerGuy Blank <guy.blank@intel.com>2017-08-13 08:03:37 +0000
commitde425ae753866c521c7a69099e38ccbaaf31e92b (patch)
treec85bd4199a7447475577f03049fdf2f625614666 /llvm/lib
parent77dd1407867d737b31710552669d18ef0ec50f16 (diff)
downloadbcm5719-llvm-de425ae753866c521c7a69099e38ccbaaf31e92b.tar.gz
bcm5719-llvm-de425ae753866c521c7a69099e38ccbaaf31e92b.zip
[X86][AVX512] Add combine for TESTM
Add an X86 combine for TESTM when one of the operands is a BUILD_VECTOR(0,0,...). TESTM op0, BUILD_VECTOR(0,0,...) -> BUILD_VECTOR(0,0,...) TESTM BUILD_VECTOR(0,0,...), op1 -> BUILD_VECTOR(0,0,...) Differential Revision: https://reviews.llvm.org/D36536 llvm-svn: 310787
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 3860d947741..aab8df81597 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -35468,19 +35468,26 @@ static SDValue combineLockSub(SDNode *N, SelectionDAG &DAG,
{Chain, LHS, RHS}, VT, MMO);
}
-// TEST (AND a, b) ,(AND a, b) -> TEST a, b
-static SDValue combineTestM(SDNode *N, SelectionDAG &DAG) {
+static SDValue combineTestM(SDNode *N, SelectionDAG &DAG,
+ const X86Subtarget &Subtarget) {
SDValue Op0 = N->getOperand(0);
SDValue Op1 = N->getOperand(1);
- if (Op0 != Op1 || Op1->getOpcode() != ISD::AND)
- return SDValue();
-
- EVT VT = N->getValueType(0);
+ MVT VT = N->getSimpleValueType(0);
SDLoc DL(N);
- return DAG.getNode(X86ISD::TESTM, DL, VT,
- Op0->getOperand(0), Op0->getOperand(1));
+ // TEST (AND a, b) ,(AND a, b) -> TEST a, b
+ if (Op0 == Op1 && Op1->getOpcode() == ISD::AND)
+ return DAG.getNode(X86ISD::TESTM, DL, VT, Op0->getOperand(0),
+ Op0->getOperand(1));
+
+ // TEST op0, BUILD_VECTOR(all_zero) -> BUILD_VECTOR(all_zero)
+ // TEST BUILD_VECTOR(all_zero), op1 -> BUILD_VECTOR(all_zero)
+ if (ISD::isBuildVectorAllZeros(Op0.getNode()) ||
+ ISD::isBuildVectorAllZeros(Op1.getNode()))
+ return getZeroVector(VT, Subtarget, DAG, DL);
+
+ return SDValue();
}
static SDValue combineVectorCompare(SDNode *N, SelectionDAG &DAG,
@@ -35702,7 +35709,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
case ISD::MGATHER:
case ISD::MSCATTER: return combineGatherScatter(N, DAG);
case X86ISD::LSUB: return combineLockSub(N, DAG, Subtarget);
- case X86ISD::TESTM: return combineTestM(N, DAG);
+ case X86ISD::TESTM: return combineTestM(N, DAG, Subtarget);
case X86ISD::PCMPEQ:
case X86ISD::PCMPGT: return combineVectorCompare(N, DAG, Subtarget);
}
OpenPOWER on IntegriCloud