summaryrefslogtreecommitdiff
path: root/include/llvm/Analysis/LoopInfoImpl.h
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-06-20 22:18:33 +0000
committerAndrew Trick <atrick@apple.com>2012-06-20 22:18:33 +0000
commitb9598e41bc5187cfe8fb6345a90be27e6967958f (patch)
treecb3f27d2457ea187f492ceab05b09c49d403959d /include/llvm/Analysis/LoopInfoImpl.h
parent3950e9e650fd2401193cb60535669f6ab4afe746 (diff)
downloadllvm-b9598e41bc5187cfe8fb6345a90be27e6967958f.tar.gz
llvm-b9598e41bc5187cfe8fb6345a90be27e6967958f.tar.bz2
llvm-b9598e41bc5187cfe8fb6345a90be27e6967958f.tar.xz
Restructure PopulateLoopsDFS::insertIntoLoop.
As Nadav pointed out the first implementation was obscure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158862 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis/LoopInfoImpl.h')
-rw-r--r--include/llvm/Analysis/LoopInfoImpl.h21
1 files changed, 11 insertions, 10 deletions
diff --git a/include/llvm/Analysis/LoopInfoImpl.h b/include/llvm/Analysis/LoopInfoImpl.h
index e58654ab87..1be717cb71 100644
--- a/include/llvm/Analysis/LoopInfoImpl.h
+++ b/include/llvm/Analysis/LoopInfoImpl.h
@@ -618,7 +618,7 @@ public:
void traverse(BlockT *EntryBlock);
protected:
- void reverseInsertIntoLoop(BlockT *Block);
+ void insertIntoLoop(BlockT *Block);
BlockT *dfsSource() { return DFSStack.back().first; }
SuccIterTy &dfsSucc() { return DFSStack.back().second; }
@@ -647,7 +647,7 @@ void PopulateLoopsDFS<BlockT, LoopT>::traverse(BlockT *EntryBlock) {
pushBlock(BB);
}
// Visit the top of the stack in postorder and backtrack.
- reverseInsertIntoLoop(dfsSource());
+ insertIntoLoop(dfsSource());
DFSStack.pop_back();
}
}
@@ -656,14 +656,11 @@ void PopulateLoopsDFS<BlockT, LoopT>::traverse(BlockT *EntryBlock) {
/// subloop header, add the subloop to its parent in PostOrder, then reverse the
/// Block and Subloop vectors of the now complete subloop to achieve RPO.
template<class BlockT, class LoopT>
-void PopulateLoopsDFS<BlockT, LoopT>::reverseInsertIntoLoop(BlockT *Block) {
- for (LoopT *Subloop = LI->getLoopFor(Block);
- Subloop; Subloop = Subloop->getParentLoop()) {
-
- if (Block != Subloop->getHeader()) {
- Subloop->getBlocksVector().push_back(Block);
- continue;
- }
+void PopulateLoopsDFS<BlockT, LoopT>::insertIntoLoop(BlockT *Block) {
+ LoopT *Subloop = LI->getLoopFor(Block);
+ if (Subloop && Block == Subloop->getHeader()) {
+ // We reach this point once per subloop after processing all the blocks in
+ // the subloop.
if (Subloop->getParentLoop())
Subloop->getParentLoop()->getSubLoopsVector().push_back(Subloop);
else
@@ -675,7 +672,11 @@ void PopulateLoopsDFS<BlockT, LoopT>::reverseInsertIntoLoop(BlockT *Block) {
Subloop->getBlocksVector().end());
std::reverse(Subloop->getSubLoopsVector().begin(),
Subloop->getSubLoopsVector().end());
+
+ Subloop = Subloop->getParentLoop();
}
+ for (; Subloop; Subloop = Subloop->getParentLoop())
+ Subloop->getBlocksVector().push_back(Block);
}
/// Analyze LoopInfo discovers loops during a postorder DominatorTree traversal