[llvm] ef67f31 - [SCEV] Compute symbolic max backedge taken count in BTI directly. (NFC)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue May 28 10:51:32 PDT 2024
Author: Florian Hahn
Date: 2024-05-28T10:51:21-07:00
New Revision: ef67f31e88dbae46811f03da945cfb8130c6fa15
URL: https://github.com/llvm/llvm-project/commit/ef67f31e88dbae46811f03da945cfb8130c6fa15
DIFF: https://github.com/llvm/llvm-project/commit/ef67f31e88dbae46811f03da945cfb8130c6fa15.diff
LOG: [SCEV] Compute symbolic max backedge taken count in BTI directly. (NFC)
Move symbolic max backedge taken count computation to BackedgeTakenInfo,
use existing ExitNotTaken info.
In preparation for https://github.com/llvm/llvm-project/pull/93498.
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h
index 5828cc156cc78..1d016b28347d2 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolution.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -1761,11 +1761,6 @@ class ScalarEvolution {
ExitLimit computeExitLimit(const Loop *L, BasicBlock *ExitingBlock,
bool AllowPredicates = false);
- /// Return a symbolic upper bound for the backedge taken count of the loop.
- /// This is more general than getConstantMaxBackedgeTakenCount as it returns
- /// an arbitrary expression as opposed to only constants.
- const SCEV *computeSymbolicMaxBackedgeTakenCount(const Loop *L);
-
// Helper functions for computeExitLimitFromCond to avoid exponential time
// complexity.
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 8d971e6a78e42..bb56b41fe15d5 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8647,8 +8647,28 @@ ScalarEvolution::BackedgeTakenInfo::getConstantMax(ScalarEvolution *SE) const {
const SCEV *
ScalarEvolution::BackedgeTakenInfo::getSymbolicMax(const Loop *L,
ScalarEvolution *SE) {
- if (!SymbolicMax)
- SymbolicMax = SE->computeSymbolicMaxBackedgeTakenCount(L);
+ if (!SymbolicMax) {
+ // Form an expression for the maximum exit count possible for this loop. We
+ // merge the max and exact information to approximate a version of
+ // getConstantMaxBackedgeTakenCount which isn't restricted to just
+ // constants.
+ SmallVector<const SCEV *, 4> ExitCounts;
+
+ for (const auto &ENT : ExitNotTaken) {
+ const SCEV *ExitCount = ENT.SymbolicMaxNotTaken;
+ if (!isa<SCEVCouldNotCompute>(ExitCount)) {
+ assert(SE->DT.dominates(ENT.ExitingBlock, L->getLoopLatch()) &&
+ "We should only have known counts for exiting blocks that "
+ "dominate latch!");
+ ExitCounts.push_back(ExitCount);
+ }
+ }
+ if (ExitCounts.empty())
+ SymbolicMax = SE->getCouldNotCompute();
+ else
+ SymbolicMax =
+ SE->getUMinFromMismatchedTypes(ExitCounts, /*Sequential*/ true);
+ }
return SymbolicMax;
}
@@ -14964,30 +14984,6 @@ bool ScalarEvolution::matchURem(const SCEV *Expr, const SCEV *&LHS,
return false;
}
-const SCEV *
-ScalarEvolution::computeSymbolicMaxBackedgeTakenCount(const Loop *L) {
- SmallVector<BasicBlock*, 16> ExitingBlocks;
- L->getExitingBlocks(ExitingBlocks);
-
- // Form an expression for the maximum exit count possible for this loop. We
- // merge the max and exact information to approximate a version of
- // getConstantMaxBackedgeTakenCount which isn't restricted to just constants.
- SmallVector<const SCEV*, 4> ExitCounts;
- for (BasicBlock *ExitingBB : ExitingBlocks) {
- const SCEV *ExitCount =
- getExitCount(L, ExitingBB, ScalarEvolution::SymbolicMaximum);
- if (!isa<SCEVCouldNotCompute>(ExitCount)) {
- assert(DT.dominates(ExitingBB, L->getLoopLatch()) &&
- "We should only have known counts for exiting blocks that "
- "dominate latch!");
- ExitCounts.push_back(ExitCount);
- }
- }
- if (ExitCounts.empty())
- return getCouldNotCompute();
- return getUMinFromMismatchedTypes(ExitCounts, /*Sequential*/ true);
-}
-
/// A rewriter to replace SCEV expressions in Map with the corresponding entry
/// in the map. It skips AddRecExpr because we cannot guarantee that the
/// replacement is loop invariant in the loop of the AddRec.
More information about the llvm-commits
mailing list