@@ -6185,18 +6185,26 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
61856185 }
61866186 if (!N->isOnlyUserOf(Sub.getNode()))
61876187 return false;
6188- SDValue SubBC = peekThroughBitcasts(Sub);
6188+
6189+ SmallVector<int, 64> SubMask;
6190+ SmallVector<SDValue, 2> SubInputs;
6191+ SDValue SubSrc = peekThroughOneUseBitcasts(Sub);
6192+ EVT SubSrcVT = SubSrc.getValueType();
6193+ if (!SubSrcVT.isVector())
6194+ return false;
6195+
61896196 // Handle INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)).
6190- if (SubBC.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
6191- SubBC.getOperand(0).getValueSizeInBits() == NumSizeInBits) {
6192- uint64_t ExtractIdx = SubBC.getConstantOperandVal(1);
6193- SDValue SubBCSrc = SubBC.getOperand(0);
6194- unsigned NumSubSrcBCElts = SubBCSrc.getValueType().getVectorNumElements();
6195- unsigned MaxElts = std::max(NumElts, NumSubSrcBCElts);
6196- assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcBCElts) == 0 &&
6197+ if (SubSrc.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
6198+ SubSrc.getOperand(0).getValueSizeInBits() == NumSizeInBits) {
6199+ uint64_t ExtractIdx = SubSrc.getConstantOperandVal(1);
6200+ SDValue SubSrcSrc = SubSrc.getOperand(0);
6201+ unsigned NumSubSrcSrcElts =
6202+ SubSrcSrc.getValueType().getVectorNumElements();
6203+ unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
6204+ assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
61976205 "Subvector valuetype mismatch");
61986206 InsertIdx *= (MaxElts / NumElts);
6199- ExtractIdx *= (MaxElts / NumSubSrcBCElts );
6207+ ExtractIdx *= (MaxElts / NumSubSrcSrcElts );
62006208 NumSubElts *= (MaxElts / NumElts);
62016209 bool SrcIsUndef = Src.isUndef();
62026210 for (int i = 0; i != (int)MaxElts; ++i)
@@ -6205,17 +6213,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
62056213 Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
62066214 if (!SrcIsUndef)
62076215 Ops.push_back(Src);
6208- Ops.push_back(SubBCSrc );
6216+ Ops.push_back(SubSrcSrc );
62096217 return true;
62106218 }
6211- // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)).
6212- SmallVector<int, 64> SubMask;
6213- SmallVector<SDValue, 2> SubInputs;
6214- SDValue SubSrc = peekThroughOneUseBitcasts(Sub);
6215- EVT SubSrcVT = SubSrc.getValueType();
6216- if (!SubSrcVT.isVector())
6217- return false;
62186219
6220+ // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)).
62196221 APInt SubDemand = APInt::getAllOnes(SubSrcVT.getVectorNumElements());
62206222 if (!getTargetShuffleInputs(SubSrc, SubDemand, SubInputs, SubMask, DAG,
62216223 Depth + 1, ResolveKnownElts))
@@ -6230,10 +6232,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
62306232
62316233 if (SubMask.size() != NumSubElts) {
62326234 assert(((SubMask.size() % NumSubElts) == 0 ||
6233- (NumSubElts % SubMask.size()) == 0) && "Illegal submask scale");
6235+ (NumSubElts % SubMask.size()) == 0) &&
6236+ "Illegal submask scale");
62346237 if ((NumSubElts % SubMask.size()) == 0) {
62356238 int Scale = NumSubElts / SubMask.size();
6236- SmallVector<int,64> ScaledSubMask;
6239+ SmallVector<int, 64> ScaledSubMask;
62376240 narrowShuffleMaskElts(Scale, SubMask, ScaledSubMask);
62386241 SubMask = ScaledSubMask;
62396242 } else {
0 commit comments