[llvm-commits] [llvm] r123075 - /llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp

Chris Lattner sabre at nondot.org
Sat Jan 8 11:10:28 PST 2011


Author: lattner
Date: Sat Jan  8 13:10:28 2011
New Revision: 123075

URL: http://llvm.org/viewvc/llvm-project?rev=123075&view=rev
Log:
Implement a TODO: Enhance loopinfo to merge away the unconditional branch
that it was leaving in loops after rotation (between the original latch
block and the original header.

With this change, it is possible for rotated loops to have just a single
basic block, which is useful.

Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=123075&r1=123074&r2=123075&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp Sat Jan  8 13:10:28 2011
@@ -264,6 +264,7 @@
 
   // NewHeader is now the header of the loop.
   L->moveToHeader(NewHeader);
+  assert(L->getHeader() == NewHeader && "Latch block is our new header");
 
   // Move the original header to the bottom of the loop, where it now more
   // naturally belongs. This isn't necessary for correctness, and CodeGen can
@@ -277,16 +278,9 @@
          "Original loop header has too many predecessors after loop rotation!");
   OrigHeader->moveAfter(OrigHeader->getSinglePredecessor());
 
-  // Also, since this original header only has one predecessor, zap its
-  // PHI nodes, which are now trivial.
-  FoldSingleEntryPHINodes(OrigHeader);
-
-  
   
   // Update DominatorTree to reflect the CFG change we just made.  Then split
   // edges as necessary to preserve LoopSimplify form.
-  assert(L->getHeader() == NewHeader && "Latch block is our new header");
-  
   if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>()) {
     // Since OrigPreheader now has the conditional branch to Exit block, it is
     // the dominator of Exit.
@@ -310,12 +304,14 @@
          "Invalid loop preheader after loop rotation");
   assert(L->getLoopLatch() && "Invalid loop latch after loop rotation");
 
-  
-  // TODO: We could just go ahead and merge OrigHeader into its predecessor
-  // at this point, if we don't mind updating dominator info.
+  // Now that the CFG and DomTree are in a consistent state again, merge the
+  // OrigHeader block into OrigLatch.  We know that they are joined by an
+  // unconditional branch.  This is just a cleanup so the emitted code isn't
+  // too gross.
+  bool DidIt = MergeBlockIntoPredecessor(OrigHeader, this);
+  assert(DidIt && "Block merge failed??"); (void)DidIt;
   
   ++NumRotated;
   return true;
 }
 
-





More information about the llvm-commits mailing list