Index: llvm/include/llvm/Analysis/ScalarEvolution.h =================================================================== --- llvm/include/llvm/Analysis/ScalarEvolution.h +++ llvm/include/llvm/Analysis/ScalarEvolution.h @@ -1117,11 +1117,11 @@ /// Return the "disposition" of the given SCEV with respect to the given /// loop. - LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L); + LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L) const; /// Return true if the value of the given SCEV is unchanging in the /// specified loop. - bool isLoopInvariant(const SCEV *S, const Loop *L); + bool isLoopInvariant(const SCEV *S, const Loop *L) const; /// Determine if the SCEV can be evaluated at loop's entry. It is true if it /// doesn't depend on a SCEVUnknown of an instruction which is dominated by @@ -1132,7 +1132,7 @@ /// specified loop. This property being true implies that the value is /// variant in the loop AND that we can emit an expression to compute the /// value of the expression at any particular loop iteration. - bool hasComputableLoopEvolution(const SCEV *S, const Loop *L); + bool hasComputableLoopEvolution(const SCEV *S, const Loop *L) const; /// Return the "disposition" of the given SCEV with respect to the given /// block. @@ -1487,9 +1487,9 @@ ValuesAtScopesUsers; /// Memoized computeLoopDisposition results. - DenseMap, 2>> - LoopDispositions; + mutable DenseMap, + 2> > LoopDispositions; struct LoopProperties { /// Set to true if the loop contains no instruction that can abnormally exit @@ -1515,7 +1515,7 @@ } /// Compute a LoopDisposition value. - LoopDisposition computeLoopDisposition(const SCEV *S, const Loop *L); + LoopDisposition computeLoopDisposition(const SCEV *S, const Loop *L) const; /// Memoized computeBlockDisposition results. DenseMap< Index: llvm/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/lib/Analysis/ScalarEvolution.cpp +++ llvm/lib/Analysis/ScalarEvolution.cpp @@ -13396,7 +13396,7 @@ } ScalarEvolution::LoopDisposition -ScalarEvolution::getLoopDisposition(const SCEV *S, const Loop *L) { +ScalarEvolution::getLoopDisposition(const SCEV *S, const Loop *L) const { auto &Values = LoopDispositions[S]; for (auto &V : Values) { if (V.getPointer() == L) @@ -13415,7 +13415,7 @@ } ScalarEvolution::LoopDisposition -ScalarEvolution::computeLoopDisposition(const SCEV *S, const Loop *L) { +ScalarEvolution::computeLoopDisposition(const SCEV *S, const Loop *L) const { switch (S->getSCEVType()) { case scConstant: return LoopInvariant; @@ -13496,11 +13496,12 @@ llvm_unreachable("Unknown SCEV kind!"); } -bool ScalarEvolution::isLoopInvariant(const SCEV *S, const Loop *L) { +bool ScalarEvolution::isLoopInvariant(const SCEV *S, const Loop *L) const { return getLoopDisposition(S, L) == LoopInvariant; } -bool ScalarEvolution::hasComputableLoopEvolution(const SCEV *S, const Loop *L) { +bool ScalarEvolution::hasComputableLoopEvolution(const SCEV *S, + const Loop *L) const { return getLoopDisposition(S, L) == LoopComputable; }