[llvm-commits] CVS: llvm/lib/Analysis/LoopInfo.cpp

Chris Lattner sabre at nondot.org
Fri Oct 27 18:24:20 PDT 2006



Changes in directory llvm/lib/Analysis:

LoopInfo.cpp updated: 1.78 -> 1.79
---
Log message:

add a method


---
Diffs of the changes:  (+20 -0)

 LoopInfo.cpp |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+)


Index: llvm/lib/Analysis/LoopInfo.cpp
diff -u llvm/lib/Analysis/LoopInfo.cpp:1.78 llvm/lib/Analysis/LoopInfo.cpp:1.79
--- llvm/lib/Analysis/LoopInfo.cpp:1.78	Tue Aug 29 17:29:16 2006
+++ llvm/lib/Analysis/LoopInfo.cpp	Fri Oct 27 20:24:05 2006
@@ -332,6 +332,26 @@
 // APIs for simple analysis of the loop.
 //
 
+/// getExitingBlocks - Return all blocks inside the loop that have successors
+/// outside of the loop.  These are the blocks _inside of the current loop_
+/// which branch out.  The returned list is always unique.
+///
+void Loop::getExitingBlocks(std::vector<BasicBlock*> &ExitingBlocks) const {
+  // Sort the blocks vector so that we can use binary search to do quick
+  // lookups.
+  std::vector<BasicBlock*> LoopBBs(block_begin(), block_end());
+  std::sort(LoopBBs.begin(), LoopBBs.end());
+  
+  for (std::vector<BasicBlock*>::const_iterator BI = Blocks.begin(),
+       BE = Blocks.end(); BI != BE; ++BI)
+    for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I)
+      if (!std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I)) {
+        // Not in current loop? It must be an exit block.
+        ExitingBlocks.push_back(*BI);
+        break;
+      }
+}
+
 /// getExitBlocks - Return all of the successor blocks of this loop.  These
 /// are the blocks _outside of the current loop_ which are branched to.
 ///






More information about the llvm-commits mailing list