Split out the code for finding a unique loop predecessor from
authorDan Gohman <gohman@apple.com>
Tue, 22 Jun 2010 15:25:42 +0000 (15:25 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 22 Jun 2010 15:25:42 +0000 (15:25 +0000)
getLoopPreheader into a separate function, for clients which don't
require a proper preheader.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106543 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LoopInfo.h

index 2babc25cb140a517c89dd315e4835f52342de387..7b38052257aac7890dbc818d7907e5abb2aae68d 100644 (file)
@@ -255,6 +255,27 @@ public:
   /// This method returns null if there is no preheader for the loop.
   ///
   BlockT *getLoopPreheader() const {
+    // Keep track of nodes outside the loop branching to the header...
+    BlockT *Out = getLoopPredecessor();
+    if (!Out) return 0;
+
+    // Make sure there is only one exit out of the preheader.
+    typedef GraphTraits<BlockT*> BlockTraits;
+    typename BlockTraits::ChildIteratorType SI = BlockTraits::child_begin(Out);
+    ++SI;
+    if (SI != BlockTraits::child_end(Out))
+      return 0;  // Multiple exits from the block, must not be a preheader.
+
+    // The predecessor has exactly one successor, so it is a preheader.
+    return Out;
+  }
+
+  /// getLoopPredecessor - If the given loop's header has exactly one unique
+  /// predecessor outside the loop, return it. Otherwise return null.
+  /// This is less strict that the loop "preheader" concept, which requires
+  /// the predecessor to have exactly one successor.
+  ///
+  BlockT *getLoopPredecessor() const {
     // Keep track of nodes outside the loop branching to the header...
     BlockT *Out = 0;
 
@@ -273,13 +294,6 @@ public:
 
     // Make sure there is only one exit out of the preheader.
     assert(Out && "Header of loop has no predecessors from outside loop?");
-    typename BlockTraits::ChildIteratorType SI = BlockTraits::child_begin(Out);
-    ++SI;
-    if (SI != BlockTraits::child_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;
   }