@@ -6185,18 +6185,26 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
6185
6185
}
6186
6186
if (!N->isOnlyUserOf(Sub.getNode()))
6187
6187
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
+
6189
6196
// 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 &&
6197
6205
"Subvector valuetype mismatch");
6198
6206
InsertIdx *= (MaxElts / NumElts);
6199
- ExtractIdx *= (MaxElts / NumSubSrcBCElts );
6207
+ ExtractIdx *= (MaxElts / NumSubSrcSrcElts );
6200
6208
NumSubElts *= (MaxElts / NumElts);
6201
6209
bool SrcIsUndef = Src.isUndef();
6202
6210
for (int i = 0; i != (int)MaxElts; ++i)
@@ -6205,17 +6213,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
6205
6213
Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
6206
6214
if (!SrcIsUndef)
6207
6215
Ops.push_back(Src);
6208
- Ops.push_back(SubBCSrc );
6216
+ Ops.push_back(SubSrcSrc );
6209
6217
return true;
6210
6218
}
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;
6218
6219
6220
+ // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)).
6219
6221
APInt SubDemand = APInt::getAllOnes(SubSrcVT.getVectorNumElements());
6220
6222
if (!getTargetShuffleInputs(SubSrc, SubDemand, SubInputs, SubMask, DAG,
6221
6223
Depth + 1, ResolveKnownElts))
@@ -6230,10 +6232,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
6230
6232
6231
6233
if (SubMask.size() != NumSubElts) {
6232
6234
assert(((SubMask.size() % NumSubElts) == 0 ||
6233
- (NumSubElts % SubMask.size()) == 0) && "Illegal submask scale");
6235
+ (NumSubElts % SubMask.size()) == 0) &&
6236
+ "Illegal submask scale");
6234
6237
if ((NumSubElts % SubMask.size()) == 0) {
6235
6238
int Scale = NumSubElts / SubMask.size();
6236
- SmallVector<int,64> ScaledSubMask;
6239
+ SmallVector<int, 64> ScaledSubMask;
6237
6240
narrowShuffleMaskElts(Scale, SubMask, ScaledSubMask);
6238
6241
SubMask = ScaledSubMask;
6239
6242
} else {
0 commit comments