Index: include/llvm/Transforms/Utils/LoopUtils.h =================================================================== --- include/llvm/Transforms/Utils/LoopUtils.h +++ include/llvm/Transforms/Utils/LoopUtils.h @@ -455,6 +455,11 @@ Loop *, AliasSetTracker *, LoopSafetyInfo *, OptimizationRemarkEmitter *); +/// Does a BFS from a given node to all of its children inside a given loop. +/// The returned vector of nodes includes the starting point. +SmallVector collectChildrenInLoop(DomTreeNode *N, + const Loop *CurLoop); + /// \brief Computes safety information for a loop /// checks loop body & header for the possibility of may throw /// exception, it takes LoopSafetyInfo and loop as argument. Index: lib/Transforms/Scalar/LICM.cpp =================================================================== --- lib/Transforms/Scalar/LICM.cpp +++ lib/Transforms/Scalar/LICM.cpp @@ -345,29 +345,6 @@ return Changed; } -// Does a BFS from a given node to all of its children inside a given loop. -// The returned vector of nodes includes the starting point. -static SmallVector -collectChildrenInLoop(DomTreeNode *N, const Loop *CurLoop) { - SmallVector Worklist; - auto add_region_to_worklist = [&](DomTreeNode *DTN) { - // Only include subregions in the top level loop. - BasicBlock *BB = DTN->getBlock(); - if (CurLoop->contains(BB)) - Worklist.push_back(DTN); - }; - - add_region_to_worklist(N); - - for (size_t I = 0; I < Worklist.size(); I++) { - DomTreeNode *DTN = Worklist[I]; - for (DomTreeNode *Child : DTN->getChildren()) - add_region_to_worklist(Child); - } - - return Worklist; -} - /// Walk the specified region of the CFG (defined by all blocks dominated by /// the specified block, and that are in the current loop) in reverse depth /// first order w.r.t the DominatorTree. This allows us to visit uses before Index: lib/Transforms/Utils/LoopUtils.cpp =================================================================== --- lib/Transforms/Utils/LoopUtils.cpp +++ lib/Transforms/Utils/LoopUtils.cpp @@ -1116,6 +1116,29 @@ return None; } +/// Does a BFS from a given node to all of its children inside a given loop. +/// The returned vector of nodes includes the starting point. +SmallVector +llvm::collectChildrenInLoop(DomTreeNode *N, const Loop *CurLoop) { + SmallVector Worklist; + auto add_region_to_worklist = [&](DomTreeNode *DTN) { + // Only include subregions in the top level loop. + BasicBlock *BB = DTN->getBlock(); + if (CurLoop->contains(BB)) + Worklist.push_back(DTN); + }; + + add_region_to_worklist(N); + + for (size_t I = 0; I < Worklist.size(); I++) { + DomTreeNode *DTN = Worklist[I]; + for (DomTreeNode *Child : DTN->getChildren()) + add_region_to_worklist(Child); + } + + return Worklist; +} + /// Returns true if the instruction in a loop is guaranteed to execute at least /// once. bool llvm::isGuaranteedToExecute(const Instruction &Inst,