[llvm] 009002a - [SLP][NFC]Unify matching for perfect diamond match between cost and codegen
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 16 08:14:20 PST 2023
Author: Alexey Bataev
Date: 2023-11-16T08:11:52-08:00
New Revision: 009002a8cb1343a5ab8a8f39354925d4f2d20aee
URL: https://github.com/llvm/llvm-project/commit/009002a8cb1343a5ab8a8f39354925d4f2d20aee
DIFF: https://github.com/llvm/llvm-project/commit/009002a8cb1343a5ab8a8f39354925d4f2d20aee.diff
LOG: [SLP][NFC]Unify matching for perfect diamond match between cost and codegen
models, NFC.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f8fde8bec9027e6..5b9c20671d248b9 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -7659,16 +7659,24 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
<< "SLP: perfect diamond match for gather bundle "
<< shortBundleName(VL) << ".\n");
// Restore the mask for previous partially matched values.
- for (auto [I, V] : enumerate(E->Scalars)) {
- if (isa<PoisonValue>(V)) {
- Mask[I] = PoisonMaskElem;
- continue;
+ Mask.resize(E->Scalars.size());
+ const TreeEntry *FrontTE = Entries.front().front();
+ if (FrontTE->ReorderIndices.empty() &&
+ ((FrontTE->ReuseShuffleIndices.empty() &&
+ E->Scalars.size() == FrontTE->Scalars.size()) ||
+ (E->Scalars.size() == FrontTE->ReuseShuffleIndices.size()))) {
+ std::iota(Mask.begin(), Mask.end(), 0);
+ } else {
+ for (auto [I, V] : enumerate(E->Scalars)) {
+ if (isa<PoisonValue>(V)) {
+ Mask[I] = PoisonMaskElem;
+ continue;
+ }
+ Mask[I] = FrontTE->findLaneForValue(V);
}
- if (Mask[I] == PoisonMaskElem)
- Mask[I] = Entries.front().front()->findLaneForValue(V);
}
- Estimator.add(*Entries.front().front(), Mask);
- return Estimator.finalize(E->ReuseShuffleIndices);
+ Estimator.add(*FrontTE, Mask);
+ return Estimator.finalize(E->getCommonMask());
}
if (!Resized) {
if (GatheredScalars.size() != VF &&
@@ -9460,10 +9468,19 @@ BoUpSLP::isGatherShuffledSingleRegisterEntry(
auto *It = find_if(FirstEntries, [=](const TreeEntry *EntryPtr) {
return EntryPtr->isSame(VL) || EntryPtr->isSame(TE->Scalars);
});
- if (It != FirstEntries.end() && (*It)->getVectorFactor() == VL.size()) {
+ if (It != FirstEntries.end() &&
+ ((*It)->getVectorFactor() == VL.size() ||
+ ((*It)->getVectorFactor() == TE->Scalars.size() &&
+ TE->ReuseShuffleIndices.size() == VL.size() &&
+ (*It)->isSame(TE->Scalars)))) {
Entries.push_back(*It);
- std::iota(std::next(Mask.begin(), Part * VL.size()),
- std::next(Mask.begin(), (Part + 1) * VL.size()), 0);
+ if ((*It)->getVectorFactor() == VL.size()) {
+ std::iota(std::next(Mask.begin(), Part * VL.size()),
+ std::next(Mask.begin(), (Part + 1) * VL.size()), 0);
+ } else {
+ SmallVector<int> CommonMask = TE->getCommonMask();
+ copy(CommonMask, Mask.begin());
+ }
// Clear undef scalars.
for (int I = 0, Sz = VL.size(); I < Sz; ++I)
if (isa<PoisonValue>(VL[I]))
@@ -10657,6 +10674,7 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
<< "SLP: perfect diamond match for gather bundle "
<< shortBundleName(E->Scalars) << ".\n");
// Restore the mask for previous partially matched values.
+ Mask.resize(E->Scalars.size());
const TreeEntry *FrontTE = Entries.front().front();
if (FrontTE->ReorderIndices.empty() &&
((FrontTE->ReuseShuffleIndices.empty() &&
More information about the llvm-commits
mailing list