diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 34716929f61f1..8271d9c486650 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6185,18 +6185,26 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts, } if (!N->isOnlyUserOf(Sub.getNode())) return false; - SDValue SubBC = peekThroughBitcasts(Sub); + + SmallVector SubMask; + SmallVector SubInputs; + SDValue SubSrc = peekThroughOneUseBitcasts(Sub); + EVT SubSrcVT = SubSrc.getValueType(); + if (!SubSrcVT.isVector()) + return false; + // Handle INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)). - if (SubBC.getOpcode() == ISD::EXTRACT_SUBVECTOR && - SubBC.getOperand(0).getValueSizeInBits() == NumSizeInBits) { - uint64_t ExtractIdx = SubBC.getConstantOperandVal(1); - SDValue SubBCSrc = SubBC.getOperand(0); - unsigned NumSubSrcBCElts = SubBCSrc.getValueType().getVectorNumElements(); - unsigned MaxElts = std::max(NumElts, NumSubSrcBCElts); - assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcBCElts) == 0 && + if (SubSrc.getOpcode() == ISD::EXTRACT_SUBVECTOR && + SubSrc.getOperand(0).getValueSizeInBits() == NumSizeInBits) { + uint64_t ExtractIdx = SubSrc.getConstantOperandVal(1); + SDValue SubSrcSrc = SubSrc.getOperand(0); + unsigned NumSubSrcSrcElts = + SubSrcSrc.getValueType().getVectorNumElements(); + unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts); + assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 && "Subvector valuetype mismatch"); InsertIdx *= (MaxElts / NumElts); - ExtractIdx *= (MaxElts / NumSubSrcBCElts); + ExtractIdx *= (MaxElts / NumSubSrcSrcElts); NumSubElts *= (MaxElts / NumElts); bool SrcIsUndef = Src.isUndef(); for (int i = 0; i != (int)MaxElts; ++i) @@ -6205,17 +6213,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts, Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i; if (!SrcIsUndef) Ops.push_back(Src); - Ops.push_back(SubBCSrc); + Ops.push_back(SubSrcSrc); return true; } - // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)). - SmallVector SubMask; - SmallVector SubInputs; - SDValue SubSrc = peekThroughOneUseBitcasts(Sub); - EVT SubSrcVT = SubSrc.getValueType(); - if (!SubSrcVT.isVector()) - return false; + // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)). APInt SubDemand = APInt::getAllOnes(SubSrcVT.getVectorNumElements()); if (!getTargetShuffleInputs(SubSrc, SubDemand, SubInputs, SubMask, DAG, Depth + 1, ResolveKnownElts)) @@ -6230,10 +6232,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts, if (SubMask.size() != NumSubElts) { assert(((SubMask.size() % NumSubElts) == 0 || - (NumSubElts % SubMask.size()) == 0) && "Illegal submask scale"); + (NumSubElts % SubMask.size()) == 0) && + "Illegal submask scale"); if ((NumSubElts % SubMask.size()) == 0) { int Scale = NumSubElts / SubMask.size(); - SmallVector ScaledSubMask; + SmallVector ScaledSubMask; narrowShuffleMaskElts(Scale, SubMask, ScaledSubMask); SubMask = ScaledSubMask; } else {