Skip to content

Commit 52f3cad

Browse files
authored
[X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks (#134227)
No need to ignore one use checks for the INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) fold Noticed while working on the #133947 regressions
1 parent 41a6bb4 commit 52f3cad

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)