Skip to content

Commit de425ae

Browse files
author
Guy Blank
committed
[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
1 parent 77dd140 commit de425ae

File tree

2 files changed

+895
-1286
lines changed

2 files changed

+895
-1286
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35468,19 +35468,26 @@ static SDValue combineLockSub(SDNode *N, SelectionDAG &DAG,
3546835468
{Chain, LHS, RHS}, VT, MMO);
3546935469
}
3547035470

35471-
// TEST (AND a, b) ,(AND a, b) -> TEST a, b
35472-
static SDValue combineTestM(SDNode *N, SelectionDAG &DAG) {
35471+
static SDValue combineTestM(SDNode *N, SelectionDAG &DAG,
35472+
const X86Subtarget &Subtarget) {
3547335473
SDValue Op0 = N->getOperand(0);
3547435474
SDValue Op1 = N->getOperand(1);
3547535475

35476-
if (Op0 != Op1 || Op1->getOpcode() != ISD::AND)
35477-
return SDValue();
35478-
35479-
EVT VT = N->getValueType(0);
35476+
MVT VT = N->getSimpleValueType(0);
3548035477
SDLoc DL(N);
3548135478

35482-
return DAG.getNode(X86ISD::TESTM, DL, VT,
35483-
Op0->getOperand(0), Op0->getOperand(1));
35479+
// TEST (AND a, b) ,(AND a, b) -> TEST a, b
35480+
if (Op0 == Op1 && Op1->getOpcode() == ISD::AND)
35481+
return DAG.getNode(X86ISD::TESTM, DL, VT, Op0->getOperand(0),
35482+
Op0->getOperand(1));
35483+
35484+
// TEST op0, BUILD_VECTOR(all_zero) -> BUILD_VECTOR(all_zero)
35485+
// TEST BUILD_VECTOR(all_zero), op1 -> BUILD_VECTOR(all_zero)
35486+
if (ISD::isBuildVectorAllZeros(Op0.getNode()) ||
35487+
ISD::isBuildVectorAllZeros(Op1.getNode()))
35488+
return getZeroVector(VT, Subtarget, DAG, DL);
35489+
35490+
return SDValue();
3548435491
}
3548535492

3548635493
static SDValue combineVectorCompare(SDNode *N, SelectionDAG &DAG,
@@ -35702,7 +35709,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
3570235709
case ISD::MGATHER:
3570335710
case ISD::MSCATTER: return combineGatherScatter(N, DAG);
3570435711
case X86ISD::LSUB: return combineLockSub(N, DAG, Subtarget);
35705-
case X86ISD::TESTM: return combineTestM(N, DAG);
35712+
case X86ISD::TESTM: return combineTestM(N, DAG, Subtarget);
3570635713
case X86ISD::PCMPEQ:
3570735714
case X86ISD::PCMPGT: return combineVectorCompare(N, DAG, Subtarget);
3570835715
}

0 commit comments

Comments
 (0)