[llvm] 2dbc6d4 - [SLP][NFC]Assert total number of scalar uses not less than number of scalar uses, NFC.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 27 09:57:31 PDT 2024
Author: Alexey Bataev
Date: 2024-08-27T09:57:08-07:00
New Revision: 2dbc6d4d4b88c4453acfe51cf20f22847aabeaab
URL: https://github.com/llvm/llvm-project/commit/2dbc6d4d4b88c4453acfe51cf20f22847aabeaab
DIFF: https://github.com/llvm/llvm-project/commit/2dbc6d4d4b88c4453acfe51cf20f22847aabeaab.diff
LOG: [SLP][NFC]Assert total number of scalar uses not less than number of scalar uses, 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 be8e2aa99d503d..4613d22fb3acf8 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10842,17 +10842,22 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
// Leave the scalar instructions as is if they are cheaper than extracts.
if (Entry->Idx != 0 || Entry->getOpcode() == Instruction::GetElementPtr ||
Entry->getOpcode() == Instruction::Load) {
+ // Checks if the user of the external scalar is phi in loop body.
+ auto IsPhiInLoop = [&](const ExternalUser &U) {
+ if (auto *Phi = dyn_cast_if_present<PHINode>(U.User)) {
+ auto *I = cast<Instruction>(U.Scalar);
+ const Loop *L = LI->getLoopFor(Phi->getParent());
+ return L && (Phi->getParent() == I->getParent() ||
+ L == LI->getLoopFor(I->getParent()));
+ }
+ return false;
+ };
if (!ValueToExtUses) {
ValueToExtUses.emplace();
for_each(enumerate(ExternalUses), [&](const auto &P) {
// Ignore phis in loops.
- if (auto *Phi = dyn_cast_if_present<PHINode>(P.value().User)) {
- auto *I = cast<Instruction>(P.value().Scalar);
- const Loop *L = LI->getLoopFor(Phi->getParent());
- if (L && (Phi->getParent() == I->getParent() ||
- L == LI->getLoopFor(I->getParent())))
- return;
- }
+ if (IsPhiInLoop(P.value()))
+ return;
ValueToExtUses->try_emplace(P.value().Scalar, P.index());
});
@@ -10903,8 +10908,12 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
return ValueToExtUses->contains(V);
});
auto It = ExtractsCount.find(Entry);
- if (It != ExtractsCount.end())
+ if (It != ExtractsCount.end()) {
+ assert(ScalarUsesCount >= It->getSecond().size() &&
+ "Expected total number of external uses not less than "
+ "number of scalar uses.");
ScalarUsesCount -= It->getSecond().size();
+ }
// Keep original scalar if number of externally used instructions in
// the same entry is not power of 2. It may help to do some extra
// vectorization for now.
@@ -10920,7 +10929,8 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
}
});
ExtraCost = ScalarCost;
- ExtractsCount[Entry].insert(Inst);
+ if (!IsPhiInLoop(EU))
+ ExtractsCount[Entry].insert(Inst);
}
}
}
More information about the llvm-commits
mailing list