diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h --- a/llvm/include/llvm/Analysis/ScalarEvolution.h +++ b/llvm/include/llvm/Analysis/ScalarEvolution.h @@ -2043,7 +2043,8 @@ /// from ValueExprMap and collect SCEV expressions in \p ToForget void visitAndClearUsers(SmallVectorImpl &Worklist, SmallPtrSetImpl &Visited, - SmallVectorImpl &ToForget); + SmallVectorImpl &ToForget, + const Loop *CurrL); #ifndef NDEBUG /// Iterate over instructions in \p Worlist and their users. Assert all users diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -8438,7 +8438,7 @@ void ScalarEvolution::visitAndClearUsers( SmallVectorImpl &Worklist, SmallPtrSetImpl &Visited, - SmallVectorImpl &ToForget) { + SmallVectorImpl &ToForget, const Loop *CurrL) { while (!Worklist.empty()) { Instruction *I = Worklist.pop_back_val(); if (!isSCEVable(I->getType())) @@ -8451,9 +8451,10 @@ ToForget.push_back(It->second); if (PHINode *PN = dyn_cast(I)) ConstantEvolutionLoopExitValue.erase(PN); - } - - PushDefUseChildren(I, Worklist, Visited); + PushDefUseChildren(I, Worklist, Visited); + } else if ((CurrL && LI.getLoopFor(I->getParent()) == CurrL) || + isa(I)) + PushDefUseChildren(I, Worklist, Visited); } } @@ -8512,7 +8513,7 @@ #ifndef NDEBUG PushLoopPHIs(CurrL, VerificationWorklist, VerificationVisited); #endif - visitAndClearUsers(Worklist, Visited, ToForget); + visitAndClearUsers(Worklist, Visited, ToForget, CurrL); LoopPropertiesCache.erase(CurrL); // Forget all contained loops too, to avoid dangling entries in the @@ -8540,7 +8541,8 @@ SmallVector ToForget; Worklist.push_back(I); Visited.insert(I); - visitAndClearUsers(Worklist, Visited, ToForget); + visitAndClearUsers(Worklist, Visited, ToForget, + LI.getLoopFor(I->getParent())); forgetMemoizedResults(ToForget);