Add a new getLoopLatch() method.
authorChris Lattner <sabre@nondot.org>
Mon, 12 Sep 2005 17:03:55 +0000 (17:03 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 Sep 2005 17:03:55 +0000 (17:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23315 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LoopInfo.cpp

index e12d31759837aeb8e24501a1859f0bd8cccc4f3c..b8315ac1d73bad5b5dc53a568bc5e7609ec79417 100644 (file)
@@ -373,12 +373,36 @@ BasicBlock *Loop::getLoopPreheader() const {
   if (SI != succ_end(Out))
     return 0;  // Multiple exits from the block, must not be a preheader.
 
-
   // If there is exactly one preheader, return it.  If there was zero, then Out
   // is still null.
   return Out;
 }
 
+/// getLoopLatch - If there is a latch block for this loop, return it.  A
+/// latch block is the canonical backedge for a loop.  A loop header in normal
+/// form has two edges into it: one from a preheader and one from a latch
+/// block.
+BasicBlock *Loop::getLoopLatch() const {
+  BasicBlock *Header = getHeader();
+  pred_iterator PI = pred_begin(Header), PE = pred_end(Header);
+  if (PI == PE) return 0;  // no preds?
+  
+  BasicBlock *Latch = 0;
+  if (contains(*PI))
+    Latch = *PI;
+  ++PI;
+  if (PI == PE) return 0;  // only one pred?
+  
+  if (contains(*PI)) {
+    if (Latch) return 0;  // multiple backedges
+    Latch = *PI;
+  }
+  ++PI;
+  if (PI != PE) return 0;  // more than two preds
+  
+  return Latch;  
+}
+
 /// getCanonicalInductionVariable - Check to see if the loop has a canonical
 /// induction variable: an integer recurrence that starts at 0 and increments by
 /// one each time through the loop.  If so, return the phi node that corresponds