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 @@ -12737,9 +12737,21 @@ } void ScalarEvolution::forgetMemoizedResults(ArrayRef SCEVs) { - for (auto *S : SCEVs) - forgetMemoizedResultsImpl(S); SmallPtrSet ToForget(SCEVs.begin(), SCEVs.end()); + SmallVector Worklist(ToForget.begin(), ToForget.end()); + + while (!Worklist.empty()) { + const SCEV *Curr = Worklist.pop_back_val(); + auto Users = SCEVUsers.find(Curr); + if (Users != SCEVUsers.end()) + for (auto *User : Users->second) + if (ToForget.insert(User).second) + Worklist.push_back(User); + } + + for (auto *S : ToForget) + forgetMemoizedResultsImpl(S); + for (auto I = PredicatedSCEVRewrites.begin(); I != PredicatedSCEVRewrites.end();) { std::pair Entry = I->first;