[X86] Move a transform out of combineConcatVectorOps so we don't prematurely turn CONCAT_VECTORS into INSERT_SUBVECTORS.

CONCAT_VECTORS and INSERT_SUBVECTORS can both call combineConcatVectorOps,
but we shouldn't produce INSERT_SUBVECTORS from there. We should
keep CONCAT_VECTORS until vector legalization.

Noticed while looking at the madd_quad_reduction test from madd.ll

llvm-svn: 369802
This commit is contained in:
Craig Topper 2019-08-23 19:52:24 +00:00
parent 07a3b59279
commit bc173d4c51
1 changed files with 13 additions and 9 deletions

View File

@ -44247,14 +44247,6 @@ static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
} }
} }
// If we're inserting all zeros into the upper half, change this to
// an insert into an all zeros vector. We will match this to a move
// with implicit upper bit zeroing during isel.
if (Ops.size() == 2 && ISD::isBuildVectorAllZeros(Ops[1].getNode()))
return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT,
getZeroVector(VT, Subtarget, DAG, DL), Ops[0],
DAG.getIntPtrConstant(0, DL));
return SDValue(); return SDValue();
} }
@ -44360,11 +44352,23 @@ static SDValue combineInsertSubvector(SDNode *N, SelectionDAG &DAG,
// Match concat_vector style patterns. // Match concat_vector style patterns.
SmallVector<SDValue, 2> SubVectorOps; SmallVector<SDValue, 2> SubVectorOps;
if (collectConcatOps(N, SubVectorOps)) if (collectConcatOps(N, SubVectorOps)) {
if (SDValue Fold = if (SDValue Fold =
combineConcatVectorOps(dl, OpVT, SubVectorOps, DAG, DCI, Subtarget)) combineConcatVectorOps(dl, OpVT, SubVectorOps, DAG, DCI, Subtarget))
return Fold; return Fold;
// If we're inserting all zeros into the upper half, change this to
// a concat with zero. We will match this to a move
// with implicit upper bit zeroing during isel.
// We do this here because we don't want combineConcatVectorOps to
// create INSERT_SUBVECTOR from CONCAT_VECTORS.
if (SubVectorOps.size() == 2 &&
ISD::isBuildVectorAllZeros(SubVectorOps[1].getNode()))
return DAG.getNode(ISD::INSERT_SUBVECTOR, dl, OpVT,
getZeroVector(OpVT, Subtarget, DAG, dl),
SubVectorOps[0], DAG.getIntPtrConstant(0, dl));
}
// If this is a broadcast insert into an upper undef, use a larger broadcast. // If this is a broadcast insert into an upper undef, use a larger broadcast.
if (Vec.isUndef() && IdxVal != 0 && SubVec.getOpcode() == X86ISD::VBROADCAST) if (Vec.isUndef() && IdxVal != 0 && SubVec.getOpcode() == X86ISD::VBROADCAST)
return DAG.getNode(X86ISD::VBROADCAST, dl, OpVT, SubVec.getOperand(0)); return DAG.getNode(X86ISD::VBROADCAST, dl, OpVT, SubVec.getOperand(0));