diff options
author | Andrew Trick <atrick@apple.com> | 2011-08-26 03:06:34 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2011-08-26 03:06:34 +0000 |
commit | 147d9cde781d88ee5dee85e999fcd85bba8568a0 (patch) | |
tree | 5e344e4b10c86fe9396e92cfbf604bd1c51591df /llvm/lib/Analysis/LoopInfo.cpp | |
parent | 452aae62024ad7aac864c9c4b9dccf37a9e69d0a (diff) | |
download | bcm5719-llvm-147d9cde781d88ee5dee85e999fcd85bba8568a0.tar.gz bcm5719-llvm-147d9cde781d88ee5dee85e999fcd85bba8568a0.zip |
LoopInfo::updateUnloop fix, and verify Block->Loop maps.
Fixes an oversight, and adds verification to catch it in the unloop.ll tests.
llvm-svn: 138622
Diffstat (limited to 'llvm/lib/Analysis/LoopInfo.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopInfo.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp index 6abb14f55ae..85aaccaefc3 100644 --- a/llvm/lib/Analysis/LoopInfo.cpp +++ b/llvm/lib/Analysis/LoopInfo.cpp @@ -509,6 +509,8 @@ void UnloopUpdater::updateSubloopParents() { assert(SubloopParents.count(Subloop) && "DFS failed to visit subloop"); if (SubloopParents[Subloop]) SubloopParents[Subloop]->addChildLoop(Subloop); + else + LI->addTopLevelLoop(Subloop); } } @@ -663,12 +665,21 @@ void LoopInfo::verifyAnalysis() const { if (!VerifyLoopInfo) return; + DenseSet<const Loop*> Loops; for (iterator I = begin(), E = end(); I != E; ++I) { assert(!(*I)->getParentLoop() && "Top-level loop has a parent!"); - (*I)->verifyLoopNest(); + (*I)->verifyLoopNest(&Loops); } - // TODO: check BBMap consistency. + // Verify that blocks are mapped to valid loops. + // + // FIXME: With an up-to-date DFS (see LoopIterator.h) and DominatorTree, we + // could also verify that the blocks are still in the correct loops. + for (DenseMap<BasicBlock*, Loop*>::const_iterator I = LI.BBMap.begin(), + E = LI.BBMap.end(); I != E; ++I) { + assert(Loops.count(I->second) && "orphaned loop"); + assert(I->second->contains(I->first) && "orphaned block"); + } } void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { |