Index: llvm/include/llvm/Analysis/ScalarEvolution.h =================================================================== --- llvm/include/llvm/Analysis/ScalarEvolution.h +++ llvm/include/llvm/Analysis/ScalarEvolution.h @@ -1889,6 +1889,9 @@ /// Drop memoized information computed for S. void forgetMemoizedResults(const SCEV *S); + /// Drop memoized information for all \p SCEVs. + void forgetMemoizedResults(ArrayRef SCEVs); + void forgetMemoizedResultsImpl(const SCEV *S); /// Return an existing SCEV for V if there is one, otherwise return nullptr. Index: llvm/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/lib/Analysis/ScalarEvolution.cpp +++ llvm/lib/Analysis/ScalarEvolution.cpp @@ -7604,6 +7604,7 @@ Worklist.push_back(I); SmallPtrSet Visited; + SmallVector ToForget; while (!Worklist.empty()) { I = Worklist.pop_back_val(); if (!Visited.insert(I).second) @@ -7613,13 +7614,14 @@ ValueExprMap.find_as(static_cast(I)); if (It != ValueExprMap.end()) { eraseValueFromMap(It->first); - forgetMemoizedResults(It->second); + ToForget.push_back(It->second); if (PHINode *PN = dyn_cast(I)) ConstantEvolutionLoopExitValue.erase(PN); } PushDefUseChildren(I, Worklist); } + forgetMemoizedResults(ToForget); } void ScalarEvolution::forgetLoopDispositions(const Loop *L) { @@ -12807,10 +12809,18 @@ } void ScalarEvolution::forgetMemoizedResults(const SCEV *S) { + SmallVector ToForget; + ToForget.push_back(S); + forgetMemoizedResults(ToForget); +} + +void ScalarEvolution::forgetMemoizedResults(ArrayRef SCEVs) { SmallPtrSet Visited; SmallVector Worklist; - Visited.insert(S); - Worklist.push_back(S); + for (auto *S : SCEVs) + if (Visited.insert(S).second) + Worklist.push_back(S); + while (!Worklist.empty()) { const SCEV *Curr = Worklist.pop_back_val(); auto Users = SCEVUsers.find(Curr);