[llvm] [SLPVectorizer] Use accurate cost for external users of resize shuffles (PR #137419)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 27 06:47:09 PDT 2025
================
@@ -14802,7 +14803,39 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals,
<< " for final shuffle of insertelement external users.\n";
TE->dump(); dbgs() << "SLP: Current total cost = " << Cost << "\n");
Cost += C;
- return std::make_pair(TE, true);
+
----------------
alexey-bataev wrote:
Thanks for the patch! What about something like this, which is more close to the codegen:
```
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index afba099f5154..c269a1efa415 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -14757,25 +14757,43 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals,
Cost += ExtractCost;
auto &&ResizeToVF = [this, &Cost](const TreeEntry *TE, ArrayRef<int> Mask,
- bool) {
+ bool ForSingleMask) {
InstructionCost C = 0;
unsigned VF = Mask.size();
unsigned VecVF = TE->getVectorFactor();
if (VF != VecVF &&
(any_of(Mask, [VF](int Idx) { return Idx >= static_cast<int>(VF); }) ||
!ShuffleVectorInst::isIdentityMask(Mask, VF))) {
- SmallVector<int> OrigMask(VecVF, PoisonMaskElem);
- std::copy(Mask.begin(), std::next(Mask.begin(), std::min(VF, VecVF)),
- OrigMask.begin());
- C = ::getShuffleCost(*TTI, TTI::SK_PermuteSingleSrc,
- getWidenedType(TE->getMainOp()->getType(), VecVF),
- OrigMask);
- LLVM_DEBUG(
- dbgs() << "SLP: Adding cost " << C
- << " for final shuffle of insertelement external users.\n";
- TE->dump(); dbgs() << "SLP: Current total cost = " << Cost << "\n");
- Cost += C;
- return std::make_pair(TE, true);
+ if (any_of(Mask, [VF](int Idx) { return Idx >= static_cast<int>(VF); })) {
+ SmallVector<int> OrigMask(VecVF, PoisonMaskElem);
+ std::copy(Mask.begin(), std::next(Mask.begin(), std::min(VF, VecVF)),
+ OrigMask.begin());
+ C = ::getShuffleCost(*TTI, TTI::SK_PermuteSingleSrc,
+ getWidenedType(TE->getMainOp()->getType(), VecVF),
+ OrigMask);
+ LLVM_DEBUG(
+ dbgs() << "SLP: Adding cost " << C
+ << " for final shuffle of insertelement external users.\n";
+ TE->dump(); dbgs() << "SLP: Current total cost = " << Cost << "\n");
+ Cost += C;
+ return std::make_pair(TE, true);
+ }
+ if (!ForSingleMask) {
+ SmallVector<int> ResizeMask(VF, PoisonMaskElem);
+ for (unsigned I = 0; I < VF; ++I) {
+ if (Mask[I] != PoisonMaskElem)
+ ResizeMask[Mask[I]] = Mask[I];
+ }
+ if (!ShuffleVectorInst::isIdentityMask(Mask, VF))
+ C = ::getShuffleCost(
+ *TTI, TTI::SK_PermuteSingleSrc,
+ getWidenedType(TE->getMainOp()->getType(), VecVF), ResizeMask);
+ LLVM_DEBUG(
+ dbgs() << "SLP: Adding cost " << C
+ << " for final shuffle of insertelement external users.\n";
+ TE->dump(); dbgs() << "SLP: Current total cost = " << Cost << "\n");
+ Cost += C;
+ }
}
return std::make_pair(TE, false);
};
```
https://github.com/llvm/llvm-project/pull/137419
More information about the llvm-commits
mailing list