Index: llvm/include/llvm/Analysis/LoopInfo.h =================================================================== --- llvm/include/llvm/Analysis/LoopInfo.h +++ llvm/include/llvm/Analysis/LoopInfo.h @@ -346,6 +346,43 @@ return PreOrderLoops; } + /// Return all inner loops in the loop nest rooted by the loop in + /// breadth-first order. + template + static void + getInnerLoopsInBreadthFirstOrder(const LoopT &L, + SmallVectorImpl &BreadthFirstLoops) { + SmallVector BreadthFirstWorklist; + BreadthFirstWorklist.push_back(const_cast(&L)); + + while (!BreadthFirstWorklist.empty()) { + LoopT *L = BreadthFirstWorklist.pop_back_val(); + const auto &SubLoops = L->getSubLoops(); + if (!SubLoops.empty()) { + BreadthFirstWorklist.insert(BreadthFirstWorklist.begin(), + SubLoops.rbegin(), SubLoops.rend()); + BreadthFirstLoops.append(SubLoops.begin(), SubLoops.end()); + } + } + } + + /// Return all loops in the loop nest rooted by the loop in breadth-first + /// order. + SmallVector getLoopsInBreadthFirstOrder() const { + SmallVector BreadthFirstLoops; + const LoopT *CurLoop = static_cast(this); + BreadthFirstLoops.push_back(CurLoop); + getInnerLoopsInBreadthFirstOrder(*CurLoop, BreadthFirstLoops); + return BreadthFirstLoops; + } + SmallVector getLoopsInBreadthFirstOrder() { + SmallVector BreadthFirstLoops; + LoopT *CurLoop = static_cast(this); + BreadthFirstLoops.push_back(CurLoop); + getInnerLoopsInBreadthFirstOrder(*CurLoop, BreadthFirstLoops); + return BreadthFirstLoops; + } + //===--------------------------------------------------------------------===// // APIs for updating loop information after changing the CFG //