[llvm] [SLP][NFC]Remove handling of duplicates from getGatherCost (PR #135834)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 11:30:56 PDT 2025
https://github.com/alexey-bataev created https://github.com/llvm/llvm-project/pull/135834
Duplicates are handled in BoUpSLP::processBuildVector (see TryPackScalars), support for duplicates in getGatherCost is not needed anymore.
>From 4d1d668457b4d9487dc4a3d086804fa8311832da Mon Sep 17 00:00:00 2001
From: Alexey Bataev <a.bataev at outlook.com>
Date: Tue, 15 Apr 2025 18:30:46 +0000
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5
---
.../Transforms/Vectorize/SLPVectorizer.cpp | 34 ++-----------------
1 file changed, 2 insertions(+), 32 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index cc775e4b260dc..3363d4056b300 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -15349,13 +15349,10 @@ InstructionCost BoUpSLP::getGatherCost(ArrayRef<Value *> VL, bool ForPoisonSrc,
Type *ScalarTy) const {
const unsigned VF = VL.size();
auto *VecTy = getWidenedType(ScalarTy, VF);
- bool DuplicateNonConst = false;
// Find the cost of inserting/extracting values from the vector.
// Check if the same elements are inserted several times and count them as
// shuffle candidates.
- APInt ShuffledElements = APInt::getZero(VF);
APInt DemandedElements = APInt::getZero(VF);
- DenseMap<Value *, unsigned> UniqueElements;
constexpr TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
InstructionCost Cost;
auto EstimateInsertCost = [&](unsigned I, Value *V) {
@@ -15364,32 +15361,18 @@ InstructionCost BoUpSLP::getGatherCost(ArrayRef<Value *> VL, bool ForPoisonSrc,
Cost += TTI->getCastInstrCost(Instruction::Trunc, ScalarTy, V->getType(),
TTI::CastContextHint::None, CostKind);
};
- SmallVector<int> ShuffleMask(VF, PoisonMaskElem);
SmallVector<int> ConstantShuffleMask(VF, PoisonMaskElem);
std::iota(ConstantShuffleMask.begin(), ConstantShuffleMask.end(), 0);
for (auto [I, V] : enumerate(VL)) {
// No need to shuffle duplicates for constants.
- if ((ForPoisonSrc && isConstant(V)) || isa<UndefValue>(V)) {
- ShuffledElements.setBit(I);
- ShuffleMask[I] = isa<PoisonValue>(V) ? PoisonMaskElem : I;
+ if ((ForPoisonSrc && isConstant(V)) || isa<UndefValue>(V))
continue;
- }
if (isConstant(V)) {
ConstantShuffleMask[I] = I + VF;
- ShuffleMask[I] = I;
- continue;
- }
- auto Res = UniqueElements.try_emplace(V, I);
- if (Res.second) {
- EstimateInsertCost(I, V);
- ShuffleMask[I] = I;
continue;
}
-
- DuplicateNonConst = true;
- ShuffledElements.setBit(I);
- ShuffleMask[I] = Res.first->second;
+ EstimateInsertCost(I, V);
}
// FIXME: add a cost for constant vector materialization.
bool IsAnyNonUndefConst =
@@ -15398,15 +15381,6 @@ InstructionCost BoUpSLP::getGatherCost(ArrayRef<Value *> VL, bool ForPoisonSrc,
if (!ForPoisonSrc && IsAnyNonUndefConst) {
Cost += ::getShuffleCost(*TTI, TargetTransformInfo::SK_PermuteTwoSrc, VecTy,
ConstantShuffleMask);
- // Update the shuffle mask for shuffling with incoming source (all elements
- // are used!) or with constant subvector.
- for_each(enumerate(ShuffleMask), [&](auto P) {
- if ((!ForPoisonSrc && P.value() == PoisonMaskElem) ||
- ConstantShuffleMask[P.index()] != PoisonMaskElem)
- P.value() = P.index();
- else if (P.value() != PoisonMaskElem)
- P.value() += VF;
- });
}
// 2. Insert unique non-constants.
@@ -15415,10 +15389,6 @@ InstructionCost BoUpSLP::getGatherCost(ArrayRef<Value *> VL, bool ForPoisonSrc,
/*Insert=*/true,
/*Extract=*/false, CostKind,
ForPoisonSrc && !IsAnyNonUndefConst, VL);
- // 3. Shuffle duplicates.
- if (DuplicateNonConst)
- Cost += ::getShuffleCost(*TTI, TargetTransformInfo::SK_PermuteSingleSrc,
- VecTy, ShuffleMask, CostKind);
return Cost;
}
More information about the llvm-commits
mailing list