From a3035a69f95734ff549f3e12d950bf65400329f7 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 20 May 2009 01:01:24 +0000 Subject: [PATCH] Teach SCEV::isLoopInvariant and SCEV::hasComputableLoopEvolution about the convention from LoopInfo that a null Loop* means the entire function body. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72152 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ScalarEvolution.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 50ba7ecd540..85586a20ebf 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -388,7 +388,9 @@ replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym, bool SCEVAddRecExpr::isLoopInvariant(const Loop *QueryLoop) const { // This recurrence is invariant w.r.t to QueryLoop iff QueryLoop doesn't // contain L and if the start is invariant. - return !QueryLoop->contains(L->getHeader()) && + // Add recurrences are never invariant in the function-body (null loop). + return QueryLoop && + !QueryLoop->contains(L->getHeader()) && getOperand(0)->isLoopInvariant(QueryLoop); } @@ -410,8 +412,10 @@ SCEVUnknown::~SCEVUnknown() { SCEVUnknowns->erase(V); } bool SCEVUnknown::isLoopInvariant(const Loop *L) const { // All non-instruction values are loop invariant. All instructions are loop // invariant if they are not contained in the specified loop. + // Instructions are never considered invariant in the function body + // (null loop) because they are defined within the "loop". if (Instruction *I = dyn_cast(V)) - return !L->contains(I->getParent()); + return L && !L->contains(I->getParent()); return true; }