[llvm] 921d3f7 - [SCEV] Add a utility for converting from "exit count" to "trip count"
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed May 26 10:41:59 PDT 2021
Author: Philip Reames
Date: 2021-05-26T10:41:49-07:00
New Revision: 921d3f7af09c6a08d2d2897e6fcce6127a9f4fd4
URL: https://github.com/llvm/llvm-project/commit/921d3f7af09c6a08d2d2897e6fcce6127a9f4fd4
DIFF: https://github.com/llvm/llvm-project/commit/921d3f7af09c6a08d2d2897e6fcce6127a9f4fd4.diff
LOG: [SCEV] Add a utility for converting from "exit count" to "trip count"
(Mostly as a logical place to put a comment since this is a reoccuring confusion.)
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/LoopCacheAnalysis.cpp
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h
index 7aa540a5e402..125f034fc21f 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolution.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -705,6 +705,13 @@ class ScalarEvolution {
bool isLoopBackedgeGuardedByCond(const Loop *L, ICmpInst::Predicate Pred,
const SCEV *LHS, const SCEV *RHS);
+ /// Convert from an "exit count" (i.e. "backedge taken count") to a "trip
+ /// count". A "trip count" is the number of times the header of the loop
+ /// will execute if an exit is taken after the specified number of backedges
+ /// have been taken. (e.g. TripCount = ExitCount + 1) A zero result
+ /// must be interpreted as a loop having an unknown trip count.
+ const SCEV *getTripCountFromExitCount(const SCEV *ExitCount);
+
/// Returns the maximum trip count of the loop if it is a single-exit
/// loop and we can compute a small maximum for that loop.
///
diff --git a/llvm/lib/Analysis/LoopCacheAnalysis.cpp b/llvm/lib/Analysis/LoopCacheAnalysis.cpp
index cf68596bfbc3..8a613647bbea 100644
--- a/llvm/lib/Analysis/LoopCacheAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopCacheAnalysis.cpp
@@ -109,9 +109,7 @@ static const SCEV *computeTripCount(const Loop &L, ScalarEvolution &SE) {
if (isa<SCEVCouldNotCompute>(BackedgeTakenCount) ||
!isa<SCEVConstant>(BackedgeTakenCount))
return nullptr;
-
- return SE.getAddExpr(BackedgeTakenCount,
- SE.getOne(BackedgeTakenCount->getType()));
+ return SE.getTripCountFromExitCount(BackedgeTakenCount);
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 5a2a4b8ddfe2..866305137265 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -6927,6 +6927,12 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
// Iteration Count Computation Code
//
+const SCEV *ScalarEvolution::getTripCountFromExitCount(const SCEV *ExitCount) {
+ // Get the trip count from the BE count by adding 1. Overflow, results
+ // in zero which means "unknown".
+ return getAddExpr(ExitCount, getOne(ExitCount->getType()));
+}
+
static unsigned getConstantTripCount(const SCEVConstant *ExitCount) {
if (!ExitCount)
return 0;
@@ -6979,8 +6985,8 @@ unsigned ScalarEvolution::getSmallConstantTripMultiple(const Loop *L,
if (ExitCount == getCouldNotCompute())
return 1;
- // Get the trip count from the BE count by adding 1.
- const SCEV *TCExpr = getAddExpr(ExitCount, getOne(ExitCount->getType()));
+ // Get the trip count
+ const SCEV *TCExpr = getTripCountFromExitCount(ExitCount);
const SCEVConstant *TC = dyn_cast<SCEVConstant>(TCExpr);
if (!TC)
More information about the llvm-commits
mailing list