[llvm] f676944 - [SLP][NFC] Use BoUpSLP::getNumberOfParts() where appropriate (#225995)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 24 10:50:45 PDT 2026
Author: Ryan Buchner
Date: 2026-09-24T17:50:39Z
New Revision: f676944065576ceba42691edeba053898b57c1bf
URL: https://github.com/llvm/llvm-project/commit/f676944065576ceba42691edeba053898b57c1bf
DIFF: https://github.com/llvm/llvm-project/commit/f676944065576ceba42691edeba053898b57c1bf.diff
LOG: [SLP][NFC] Use BoUpSLP::getNumberOfParts() where appropriate (#225995)
Caches the results for better performance rather than directly calling
slpvectorizer::getNumberOrParts().
Small improvement in compile time.
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 f6c0f9e08a2af..6287cb856c2ed 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,8 @@ 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](Instruction *I1, Instruction *I2,
+ SmallVectorImpl<int> &NewMask) {
if (I1->getType() != I2->getType())
return false;
auto *SI1 = dyn_cast<ShuffleVectorInst>(I1);
@@ -26516,14 +26509,10 @@ 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,
- getWidenedType(SI1->getType()->getElementType(),
- SM1.size() - LastUndefsCnt),
- SI1->getType()->getElementType(), SLPReVec);
+ getNumberOfParts(SI1->getType(), SI1->getType()->getElementType()) ==
+ getNumberOfParts(getWidenedType(SI1->getType()->getElementType(),
+ SM1.size() - LastUndefsCnt),
+ 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 +32364,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 +32372,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 +33079,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