Index: include/llvm/Analysis/ScalarEvolution.h =================================================================== --- include/llvm/Analysis/ScalarEvolution.h +++ include/llvm/Analysis/ScalarEvolution.h @@ -1764,6 +1764,9 @@ const SCEV *getOrCreateMulExpr(SmallVectorImpl &Ops, SCEV::NoWrapFlags Flags); + /// Find all of the loops transitively used in \p S, and fill \p LoopsUsed. + void getLoopUseLists(const SCEV *S, SmallPtrSetImpl &LoopsUsed); + /// Find all of the loops transitively used in \p S, and update \c LoopUsers /// accordingly. void addToLoopUseLists(const SCEV *S); Index: lib/Analysis/ScalarEvolution.cpp =================================================================== --- lib/Analysis/ScalarEvolution.cpp +++ lib/Analysis/ScalarEvolution.cpp @@ -11339,9 +11339,13 @@ RemoveSCEVFromBackedgeMap(PredicatedBackedgeTakenCounts); } -void ScalarEvolution::addToLoopUseLists(const SCEV *S) { +void +ScalarEvolution::getLoopUseLists(const SCEV *S, + SmallPtrSetImpl &LoopsUsed) { struct FindUsedLoops { - SmallPtrSet LoopsUsed; + FindUsedLoops(SmallPtrSetImpl &LoopsUsed) + : LoopsUsed(LoopsUsed) {} + SmallPtrSetImpl &LoopsUsed; bool follow(const SCEV *S) { if (auto *AR = dyn_cast(S)) LoopsUsed.insert(AR->getLoop()); @@ -11351,10 +11355,14 @@ bool isDone() const { return false; } }; - FindUsedLoops F; + FindUsedLoops F(LoopsUsed); SCEVTraversal(F).visitAll(S); +} - for (auto *L : F.LoopsUsed) +void ScalarEvolution::addToLoopUseLists(const SCEV *S) { + SmallPtrSet LoopsUsed; + getLoopUseLists(S, LoopsUsed); + for (auto *L : LoopsUsed) LoopUsers[L].push_back(S); }