forked from OSchip/llvm-project
[X86][AVX] combineExtractSubvector - merge duplicate variables. NFCI.
llvm-svn: 373849
This commit is contained in:
parent
61c22a83de
commit
2dee7e5561
|
@ -44176,12 +44176,15 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
|
|||
return SDValue();
|
||||
|
||||
MVT VT = N->getSimpleValueType(0);
|
||||
EVT WideVecVT = N->getOperand(0).getValueType();
|
||||
SDValue WideVec = peekThroughBitcasts(N->getOperand(0));
|
||||
SDValue InVec = N->getOperand(0);
|
||||
SDValue InVecBC = peekThroughBitcasts(InVec);
|
||||
EVT InVecVT = InVec.getValueType();
|
||||
EVT InVecBCVT = InVecBC.getValueType();
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
if (Subtarget.hasAVX() && !Subtarget.hasAVX2() &&
|
||||
TLI.isTypeLegal(WideVecVT) &&
|
||||
WideVecVT.getSizeInBits() == 256 && WideVec.getOpcode() == ISD::AND) {
|
||||
TLI.isTypeLegal(InVecVT) &&
|
||||
InVecVT.getSizeInBits() == 256 && InVecBC.getOpcode() == ISD::AND) {
|
||||
auto isConcatenatedNot = [] (SDValue V) {
|
||||
V = peekThroughBitcasts(V);
|
||||
if (!isBitwiseNot(V))
|
||||
|
@ -44189,12 +44192,12 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
|
|||
SDValue NotOp = V->getOperand(0);
|
||||
return peekThroughBitcasts(NotOp).getOpcode() == ISD::CONCAT_VECTORS;
|
||||
};
|
||||
if (isConcatenatedNot(WideVec.getOperand(0)) ||
|
||||
isConcatenatedNot(WideVec.getOperand(1))) {
|
||||
if (isConcatenatedNot(InVecBC.getOperand(0)) ||
|
||||
isConcatenatedNot(InVecBC.getOperand(1))) {
|
||||
// extract (and v4i64 X, (not (concat Y1, Y2))), n -> andnp v2i64 X(n), Y1
|
||||
SDValue Concat = split256IntArith(WideVec, DAG);
|
||||
SDValue Concat = split256IntArith(InVecBC, DAG);
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(N), VT,
|
||||
DAG.getBitcast(WideVecVT, Concat), N->getOperand(1));
|
||||
DAG.getBitcast(InVecVT, Concat), N->getOperand(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44204,7 +44207,6 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
|
|||
if (SDValue V = narrowExtractedVectorSelect(N, DAG))
|
||||
return V;
|
||||
|
||||
SDValue InVec = N->getOperand(0);
|
||||
unsigned IdxVal = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
|
||||
|
||||
if (ISD::isBuildVectorAllZeros(InVec.getNode()))
|
||||
|
@ -44224,25 +44226,22 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
|
|||
// Try to move vector bitcast after extract_subv by scaling extraction index:
|
||||
// extract_subv (bitcast X), Index --> bitcast (extract_subv X, Index')
|
||||
// TODO: Move this to DAGCombiner::visitEXTRACT_SUBVECTOR
|
||||
if (InVec.getOpcode() == ISD::BITCAST &&
|
||||
InVec.getOperand(0).getValueType().isVector()) {
|
||||
SDValue SrcOp = InVec.getOperand(0);
|
||||
EVT SrcVT = SrcOp.getValueType();
|
||||
unsigned SrcNumElts = SrcVT.getVectorNumElements();
|
||||
unsigned DestNumElts = InVec.getValueType().getVectorNumElements();
|
||||
if (InVec != InVecBC && InVecBCVT.isVector()) {
|
||||
unsigned SrcNumElts = InVecBCVT.getVectorNumElements();
|
||||
unsigned DestNumElts = InVecVT.getVectorNumElements();
|
||||
if ((DestNumElts % SrcNumElts) == 0) {
|
||||
unsigned DestSrcRatio = DestNumElts / SrcNumElts;
|
||||
if ((VT.getVectorNumElements() % DestSrcRatio) == 0) {
|
||||
unsigned NewExtNumElts = VT.getVectorNumElements() / DestSrcRatio;
|
||||
EVT NewExtVT = EVT::getVectorVT(*DAG.getContext(),
|
||||
SrcVT.getScalarType(), NewExtNumElts);
|
||||
InVecBCVT.getScalarType(), NewExtNumElts);
|
||||
if ((N->getConstantOperandVal(1) % DestSrcRatio) == 0 &&
|
||||
TLI.isOperationLegalOrCustom(ISD::EXTRACT_SUBVECTOR, NewExtVT)) {
|
||||
unsigned IndexValScaled = N->getConstantOperandVal(1) / DestSrcRatio;
|
||||
SDLoc DL(N);
|
||||
SDValue NewIndex = DAG.getIntPtrConstant(IndexValScaled, DL);
|
||||
SDValue NewExtract = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, NewExtVT,
|
||||
SrcOp, NewIndex);
|
||||
InVecBC, NewIndex);
|
||||
return DAG.getBitcast(VT, NewExtract);
|
||||
}
|
||||
}
|
||||
|
@ -44288,7 +44287,7 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG,
|
|||
// we may be able to perform this with a smaller vector width.
|
||||
if (IdxVal == 0 && InVec.hasOneUse()) {
|
||||
unsigned InOpcode = InVec.getOpcode();
|
||||
if (VT == MVT::v2f64 && InVec.getValueType() == MVT::v4f64) {
|
||||
if (VT == MVT::v2f64 && InVecVT == MVT::v4f64) {
|
||||
// v2f64 CVTDQ2PD(v4i32).
|
||||
if (InOpcode == ISD::SINT_TO_FP &&
|
||||
InVec.getOperand(0).getValueType() == MVT::v4i32) {
|
||||
|
|
Loading…
Reference in New Issue