forked from OSchip/llvm-project
[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:
parent
07a3b59279
commit
bc173d4c51
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue