Skip to content

Commit a9c12e4

Browse files
committed
Revert "[SLP]Fix the cost of the adjusted extracts in per-register analysis."
This reverts commit 7841520 to fix buildbots issues reported in https://lab.llvm.org/buildbot/#/builders/4/builds/315 and https://lab.llvm.org/buildbot/#/builders/35/builds/481
1 parent 4713bd4 commit a9c12e4

File tree

4 files changed

+101
-160
lines changed

4 files changed

+101
-160
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8304,57 +8304,35 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
83048304
});
83058305
// FIXME: this must be moved to TTI for better estimation.
83068306
unsigned EltsPerVector = getPartNumElems(VL.size(), NumParts);
8307-
auto CheckPerRegistersShuffle = [&](MutableArrayRef<int> Mask,
8308-
SmallVectorImpl<unsigned> &Indices)
8309-
-> std::optional<TTI::ShuffleKind> {
8307+
auto CheckPerRegistersShuffle =
8308+
[&](MutableArrayRef<int> Mask,
8309+
SmallVector<int> Indices) -> std::optional<TTI::ShuffleKind> {
83108310
if (NumElts <= EltsPerVector)
83118311
return std::nullopt;
8312-
int OffsetReg0 =
8313-
alignDown(std::accumulate(Mask.begin(), Mask.end(), INT_MAX,
8314-
[](int S, int I) {
8315-
if (I == PoisonMaskElem)
8316-
return S;
8317-
return std::min(S, I);
8318-
}),
8319-
EltsPerVector);
8320-
int OffsetReg1 = OffsetReg0;
83218312
DenseSet<int> RegIndices;
83228313
// Check that if trying to permute same single/2 input vectors.
83238314
TTI::ShuffleKind ShuffleKind = TTI::SK_PermuteSingleSrc;
83248315
int FirstRegId = -1;
8325-
Indices.assign(1, OffsetReg0);
8326-
for (auto [Pos, I] : enumerate(Mask)) {
8316+
Indices.assign(1, -1);
8317+
for (int &I : Mask) {
83278318
if (I == PoisonMaskElem)
83288319
continue;
8329-
int Idx = I - OffsetReg0;
8330-
int RegId =
8331-
(Idx / NumElts) * NumParts + (Idx % NumElts) / EltsPerVector;
8320+
int RegId = (I / NumElts) * NumParts + (I % NumElts) / EltsPerVector;
83328321
if (FirstRegId < 0)
83338322
FirstRegId = RegId;
83348323
RegIndices.insert(RegId);
83358324
if (RegIndices.size() > 2)
83368325
return std::nullopt;
83378326
if (RegIndices.size() == 2) {
83388327
ShuffleKind = TTI::SK_PermuteTwoSrc;
8339-
if (Indices.size() == 1) {
8340-
OffsetReg1 = alignDown(
8341-
std::accumulate(
8342-
std::next(Mask.begin(), Pos), Mask.end(), INT_MAX,
8343-
[&](int S, int I) {
8344-
if (I == PoisonMaskElem)
8345-
return S;
8346-
int RegId = ((I - OffsetReg0) / NumElts) * NumParts +
8347-
((I - OffsetReg0) % NumElts) / EltsPerVector;
8348-
if (RegId == FirstRegId)
8349-
return S;
8350-
return std::min(S, I);
8351-
}),
8352-
EltsPerVector);
8353-
Indices.push_back(OffsetReg1);
8354-
}
8355-
Idx = I - OffsetReg1;
8328+
if (Indices.size() == 1)
8329+
Indices.push_back(-1);
83568330
}
8357-
I = (Idx % NumElts) % EltsPerVector +
8331+
if (RegId == FirstRegId)
8332+
Indices.front() = I % NumElts;
8333+
else
8334+
Indices.back() = I % NumElts;
8335+
I = (I % NumElts) % EltsPerVector +
83588336
(RegId == FirstRegId ? 0 : EltsPerVector);
83598337
}
83608338
return ShuffleKind;
@@ -8371,7 +8349,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
83718349
Part * EltsPerVector, getNumElems(Mask.size(), EltsPerVector, Part));
83728350
SmallVector<int> SubMask(EltsPerVector, PoisonMaskElem);
83738351
copy(MaskSlice, SubMask.begin());
8374-
SmallVector<unsigned, 2> Indices;
8352+
SmallVector<int> Indices;
83758353
std::optional<TTI::ShuffleKind> RegShuffleKind =
83768354
CheckPerRegistersShuffle(SubMask, Indices);
83778355
if (!RegShuffleKind) {
@@ -8389,21 +8367,12 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
83898367
FixedVectorType::get(ScalarTy, EltsPerVector),
83908368
SubMask);
83918369
}
8392-
for (unsigned Idx : Indices) {
8370+
for (int Idx : Indices) {
83938371
Cost += ::getShuffleCost(TTI, TTI::SK_ExtractSubvector,
83948372
FixedVectorType::get(ScalarTy, NumElts),
83958373
std::nullopt, CostKind, Idx,
83968374
FixedVectorType::get(ScalarTy, EltsPerVector));
83978375
}
8398-
// Second attempt to check, if just a permute is better estimated than
8399-
// subvector extract.
8400-
SubMask.assign(NumElts, PoisonMaskElem);
8401-
copy(MaskSlice, SubMask.begin());
8402-
InstructionCost OriginalCost =
8403-
::getShuffleCost(TTI, *ShuffleKinds[Part],
8404-
FixedVectorType::get(ScalarTy, NumElts), SubMask);
8405-
if (OriginalCost < Cost)
8406-
Cost = OriginalCost;
84078376
}
84088377
return Cost;
84098378
}

0 commit comments

Comments
 (0)