[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopSimplify.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Apr 13 10:22:01 PDT 2004


Changes in directory llvm/lib/Transforms/Scalar:

LoopSimplify.cpp updated: 1.40 -> 1.41

---
Log message:

Refactor code a bit to make it simpler and eliminate the goto


---
Diffs of the changes:  (+31 -27)

Index: llvm/lib/Transforms/Scalar/LoopSimplify.cpp
diff -u llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.40 llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.41
--- llvm/lib/Transforms/Scalar/LoopSimplify.cpp:1.40	Tue Apr 13 00:05:33 2004
+++ llvm/lib/Transforms/Scalar/LoopSimplify.cpp	Tue Apr 13 10:21:18 2004
@@ -469,6 +469,28 @@
     VerifyExitBlocks(*I);
 }
 
+/// FindPHIToPartitionLoops - The first part of loop-nestification is to find a
+/// PHI node that tells us how to partition the loops.
+static PHINode *FindPHIToPartitionLoops(Loop *L) {
+  for (BasicBlock::iterator I = L->getHeader()->begin();
+       PHINode *PN = dyn_cast<PHINode>(I); ) {
+    ++I;
+    if (Value *V = hasConstantValue(PN)) {
+      // This is a degenerate PHI already, don't modify it!
+      PN->replaceAllUsesWith(V);
+      PN->getParent()->getInstList().erase(PN);
+    } else {
+      // Scan this PHI node looking for a use of the PHI node by itself.
+      for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+        if (PN->getIncomingValue(i) == PN &&
+            L->contains(PN->getIncomingBlock(i)))
+          // We found something tasty to remove.
+          return PN;
+    }
+  }
+  return 0;
+}
+
 /// SeparateNestedLoop - If this loop has multiple backedges, try to pull one of
 /// them out into a nested loop.  This is important for code that looks like
 /// this:
@@ -488,36 +510,18 @@
 ///
 Loop *LoopSimplify::SeparateNestedLoop(Loop *L) {
   BasicBlock *Header = L->getHeader();
+  PHINode *PN = FindPHIToPartitionLoops(L);
+  if (PN == 0) return 0;  // No known way to partition.
 
+  // Pull out all predecessors that have varying values in the loop.  This
+  // handles the case when a PHI node has multiple instances of itself as
+  // arguments.
   std::vector<BasicBlock*> OuterLoopPreds;
-  for (BasicBlock::iterator I = Header->begin();
-       PHINode *PN = dyn_cast<PHINode>(I); ) {
-    ++I;
-    if (Value *V = hasConstantValue(PN)) {
-      // This is a degenerate PHI already, don't modify it!
-      PN->replaceAllUsesWith(V);
-      Header->getInstList().erase(PN);
-      continue;
-    }
-
-    // Scan this PHI node looking for a use of the PHI node by itself.
-    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
-      if (PN->getIncomingValue(i) == PN &&
-          L->contains(PN->getIncomingBlock(i))) {
-        // Wow, we found something tasty to remove.  Pull out all predecessors
-        // that have varying values in the loop.  This handles the case when a
-        // PHI node has multiple instances of itself as arguments.
-        for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
-          if (PN->getIncomingValue(i) != PN ||
-              !L->contains(PN->getIncomingBlock(i)))
-            OuterLoopPreds.push_back(PN->getIncomingBlock(i));
-        goto FoundExtraction;
-      }
-  }
-
-  return 0;  // Nothing looks appetizing to separate out
+  for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+    if (PN->getIncomingValue(i) != PN ||
+        !L->contains(PN->getIncomingBlock(i)))
+      OuterLoopPreds.push_back(PN->getIncomingBlock(i));
 
-FoundExtraction:
   BasicBlock *NewBB = SplitBlockPredecessors(Header, ".outer", OuterLoopPreds);
 
   // Update dominator information (set, immdom, domtree, and domfrontier)





More information about the llvm-commits mailing list