[llvm] [SLP][NFC] Use BoUpSLP::getNumberOfParts() where appropriate (PR #225995)
Ryan Buchner via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 19:04:21 PDT 2026
https://github.com/bababuck created https://github.com/llvm/llvm-project/pull/225995
Caches the results for better performance rather than directly calling slpvectorizer::getNumberOrParts().
Small improvement in compile time.
>From d968247ae7046845b37d28002bb116a845fa61a4 Mon Sep 17 00:00:00 2001
From: bababuck <buchner.ryan at gmail.com>
Date: Wed, 23 Sep 2026 14:09:13 -0700
Subject: [PATCH] [SLP][NFC] Use BoUpSLP::getNumberOfParts() where appropriate
Caches the results for better performance rather than directly
calling slpvectorizer::getNumberOrParts()
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 48 ++++++++-----------
1 file changed, 19 insertions(+), 29 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index f6c0f9e08a2af..a900dfeadb24e 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -6651,11 +6651,10 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom,
}
}
if (Sz == 2 && TE.getVectorFactor() == 4 &&
- slpvectorizer::getNumberOfParts(
- *TTI,
+ getNumberOfParts(
getWidenedType(getValueType(TE.Scalars.front(), SLPReVec),
2 * TE.getVectorFactor()),
- getValueType(TE.Scalars.front(), SLPReVec), SLPReVec) == 1)
+ getValueType(TE.Scalars.front(), SLPReVec)) == 1)
return std::nullopt;
if (TE.ReuseShuffleIndices.size() % Sz != 0)
return std::nullopt;
@@ -10122,10 +10121,8 @@ static bool tryToFindDuplicates(SmallVectorImpl<Value *> &VL,
auto *VecTy = cast<VectorType>(getWidenedType(ScalarTy, VL.size()));
auto *UniquesVecTy =
cast<VectorType>(getWidenedType(ScalarTy, NumUniqueScalarValues));
- const unsigned NumParts =
- slpvectorizer::getNumberOfParts(TTI, VecTy, ScalarTy, SLPReVec);
- const unsigned UniquesNumParts =
- slpvectorizer::getNumberOfParts(TTI, UniquesVecTy, ScalarTy, SLPReVec);
+ const unsigned NumParts = R.getNumberOfParts(VecTy, ScalarTy);
+ const unsigned UniquesNumParts = R.getNumberOfParts(UniquesVecTy, ScalarTy);
// No need to schedule scalars and only single register used? Use original
// scalars, do not pack.
if (!RequireScheduling) {
@@ -14296,10 +14293,9 @@ void BoUpSLP::transformNodes() {
bool IsSplat = isSplat(Slice);
bool IsTwoRegisterSplat = true;
if (IsSplat && VF == 2) {
- unsigned NumRegs2VF = slpvectorizer::getNumberOfParts(
- *TTI,
+ unsigned NumRegs2VF = getNumberOfParts(
getWidenedType(getValueType(Slice.front(), SLPReVec), 2 * VF),
- getValueType(Slice.front(), SLPReVec), SLPReVec);
+ getValueType(Slice.front(), SLPReVec));
IsTwoRegisterSplat = NumRegs2VF == 2;
}
if (Slices.empty() || !IsSplat || !IsTwoRegisterSplat ||
@@ -15540,8 +15536,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
}
assert(!CommonMask.empty() && "Expected non-empty common mask.");
auto *MaskVecTy = getWidenedType(ScalarTy, Mask.size());
- unsigned NumParts = slpvectorizer::getNumberOfParts(
- TTI, MaskVecTy, ScalarTy, SLPReVec, Mask.size());
+ unsigned NumParts = R.getNumberOfParts(MaskVecTy, ScalarTy, Mask.size());
unsigned SliceSize = getPartNumElems(Mask.size(), NumParts);
const auto *It = find_if(Mask, not_equal_to(PoisonMaskElem));
unsigned Part = std::distance(Mask.begin(), It) / SliceSize;
@@ -15556,8 +15551,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
}
assert(!CommonMask.empty() && "Expected non-empty common mask.");
auto *MaskVecTy = getWidenedType(ScalarTy, Mask.size());
- unsigned NumParts = slpvectorizer::getNumberOfParts(
- TTI, MaskVecTy, ScalarTy, SLPReVec, Mask.size());
+ unsigned NumParts = R.getNumberOfParts(MaskVecTy, ScalarTy, Mask.size());
unsigned SliceSize = getPartNumElems(Mask.size(), NumParts);
const auto *It = find_if(Mask, not_equal_to(PoisonMaskElem));
unsigned Part = std::distance(Mask.begin(), It) / SliceSize;
@@ -26482,9 +26476,9 @@ void BoUpSLP::optimizeGatherSequence() {
// and its mask indeces are the same as in the first one or undefs. E.g.
// shuffle %0, poison, <0, 0, 0, undef> is less defined than shuffle %0,
// poison, <0, 0, 0, 0>.
- auto &&IsIdenticalOrLessDefined = [TTI = TTI](Instruction *I1,
- Instruction *I2,
- SmallVectorImpl<int> &NewMask) {
+ auto &&IsIdenticalOrLessDefined = [this, TTI = TTI](
+ Instruction *I1, Instruction *I2,
+ SmallVectorImpl<int> &NewMask) {
if (I1->getType() != I2->getType())
return false;
auto *SI1 = dyn_cast<ShuffleVectorInst>(I1);
@@ -26516,14 +26510,12 @@ void BoUpSLP::optimizeGatherSequence() {
// Check if the last undefs actually change the final number of used vector
// registers.
return SM1.size() - LastUndefsCnt > 1 &&
- slpvectorizer::getNumberOfParts(*TTI, SI1->getType(),
- SI1->getType()->getElementType(),
- SLPReVec) ==
- slpvectorizer::getNumberOfParts(
- *TTI,
+ this->getNumberOfParts(SI1->getType(),
+ SI1->getType()->getElementType()) ==
+ this->getNumberOfParts(
getWidenedType(SI1->getType()->getElementType(),
SM1.size() - LastUndefsCnt),
- SI1->getType()->getElementType(), SLPReVec);
+ SI1->getType()->getElementType());
};
// Perform O(N^2) search over the gather/shuffle sequences and merge identical
// instructions. TODO: We can further optimize this scan if we split the
@@ -32375,7 +32367,7 @@ class HorizontalReduction {
ReduxWidth = getFloorFullVectorNumberOfElements(TTI, ScalarTy,
ReduxWidth, SLPReVec);
VectorType *Tp = cast<VectorType>(getWidenedType(ScalarTy, ReduxWidth));
- NumParts = slpvectorizer::getNumberOfParts(TTI, Tp, ScalarTy, SLPReVec);
+ NumParts = V.getNumberOfParts(Tp, ScalarTy);
NumRegs =
TTI.getNumberOfRegisters(TTI.getRegisterClassForType(true, Tp));
while (NumParts > NumRegs) {
@@ -32383,8 +32375,7 @@ class HorizontalReduction {
ReduxWidth = bit_floor(ReduxWidth - 1);
VectorType *Tp =
cast<VectorType>(getWidenedType(ScalarTy, ReduxWidth));
- NumParts =
- slpvectorizer::getNumberOfParts(TTI, Tp, ScalarTy, SLPReVec);
+ NumParts = V.getNumberOfParts(Tp, ScalarTy);
NumRegs =
TTI.getNumberOfRegisters(TTI.getRegisterClassForType(true, Tp));
}
@@ -33091,15 +33082,14 @@ class HorizontalReduction {
ReduxWidth = getFloorFullVectorNumberOfElements(TTI, ScalarTy, ReduxWidth,
SLPReVec);
Type *Tp = getWidenedType(ScalarTy, ReduxWidth);
- unsigned NumParts =
- slpvectorizer::getNumberOfParts(TTI, Tp, ScalarTy, SLPReVec);
+ unsigned NumParts = V.getNumberOfParts(Tp, ScalarTy);
unsigned NumRegs =
TTI.getNumberOfRegisters(TTI.getRegisterClassForType(true, Tp));
while (NumParts > NumRegs) {
assert(ReduxWidth > 0 && "ReduxWidth is unexpectedly 0.");
ReduxWidth = bit_floor(ReduxWidth - 1);
Type *Tp = getWidenedType(ScalarTy, ReduxWidth);
- NumParts = slpvectorizer::getNumberOfParts(TTI, Tp, ScalarTy, SLPReVec);
+ NumParts = V.getNumberOfParts(Tp, ScalarTy);
NumRegs =
TTI.getNumberOfRegisters(TTI.getRegisterClassForType(true, Tp));
}
More information about the llvm-commits
mailing list