API changes for class Use size reduction, wave 1.
[oota-llvm.git] / lib / Transforms / Utils / LCSSA.cpp
index c43370be9b9c4e7f87d2ef35e801ae1464ae76c7..a9d1dc40cf6cfdddc07fd43785f7047722c56c7d 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Owen Anderson and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -36,7 +36,8 @@
 #include "llvm/ADT/SetVector.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/Dominators.h"
-#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/LoopPass.h"
+#include "llvm/Analysis/ScalarEvolution.h"
 #include "llvm/Support/CFG.h"
 #include "llvm/Support/Compiler.h"
 #include <algorithm>
@@ -46,19 +47,19 @@ using namespace llvm;
 STATISTIC(NumLCSSA, "Number of live out of a loop variables");
 
 namespace {
-  struct VISIBILITY_HIDDEN LCSSA : public FunctionPass {
+  struct VISIBILITY_HIDDEN LCSSA : public LoopPass {
     static char ID; // Pass identification, replacement for typeid
-    LCSSA() : FunctionPass((intptr_t)&ID) {}
+    LCSSA() : LoopPass((intptr_t)&ID) {}
 
     // Cached analysis information for the current function.
     LoopInfo *LI;
     DominatorTree *DT;
     std::vector<BasicBlock*> LoopBlocks;
     
-    virtual bool runOnFunction(Function &F);
-    bool visitSubloop(Loop* L);
+    virtual bool runOnLoop(Loop *L, LPPassManager &LPM);
+
     void ProcessInstruction(Instruction* Instr,
-                            const std::vector<BasicBlock*>& exitBlocks);
+                            const SmallVector<BasicBlock*, 8>& exitBlocks);
     
     /// This transformation requires natural loop information & requires that
     /// loop preheaders be inserted into the CFG.  It maintains both of these,
@@ -69,7 +70,17 @@ namespace {
       AU.addRequiredID(LoopSimplifyID);
       AU.addPreservedID(LoopSimplifyID);
       AU.addRequired<LoopInfo>();
+      AU.addPreserved<LoopInfo>();
       AU.addRequired<DominatorTree>();
+      AU.addPreserved<ScalarEvolution>();
+      AU.addPreserved<DominatorTree>();
+
+      // Request DominanceFrontier now, even though LCSSA does
+      // not use it. This allows Pass Manager to schedule Dominance
+      // Frontier early enough such that one LPPassManager can handle
+      // multiple loop transformation passes.
+      AU.addRequired<DominanceFrontier>(); 
+      AU.addPreserved<DominanceFrontier>();
     }
   private:
     void getLoopValuesUsedOutsideLoop(Loop *L,
@@ -79,7 +90,7 @@ namespace {
                             std::map<DomTreeNode*, Value*> &Phis);
 
     /// inLoop - returns true if the given block is within the current loop
-    const bool inLoop(BasicBlock* B) {
+    bool inLoop(BasicBlock* B) {
       return std::binary_search(LoopBlocks.begin(), LoopBlocks.end(), B);
     }
   };
@@ -88,28 +99,15 @@ namespace {
   RegisterPass<LCSSA> X("lcssa", "Loop-Closed SSA Form Pass");
 }
 
-FunctionPass *llvm::createLCSSAPass() { return new LCSSA(); }
+LoopPass *llvm::createLCSSAPass() { return new LCSSA(); }
 const PassInfo *llvm::LCSSAID = X.getPassInfo();
 
 /// runOnFunction - Process all loops in the function, inner-most out.
-bool LCSSA::runOnFunction(Function &F) {
-  bool changed = false;
+bool LCSSA::runOnLoop(Loop *L, LPPassManager &LPM) {
   
-  LI = &getAnalysis<LoopInfo>();
+  LI = &LPM.getAnalysis<LoopInfo>();
   DT = &getAnalysis<DominatorTree>();
-    
-  for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
-    changed |= visitSubloop(*I);
-      
-  return changed;
-}
 
-/// visitSubloop - Recursively process all subloops, and then process the given
-/// loop if it has live-out values.
-bool LCSSA::visitSubloop(Loop* L) {
-  for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
-    visitSubloop(*I);
-    
   // Speed up queries by creating a sorted list of blocks
   LoopBlocks.clear();
   LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end());
@@ -123,9 +121,8 @@ bool LCSSA::visitSubloop(Loop* L) {
   if (AffectedValues.empty())
     return false;
   
-  std::vector<BasicBlock*> exitBlocks;
-  L->getExitBlocks(exitBlocks);
-  
+  SmallVector<BasicBlock*, 8> exitBlocks;
+  L->getExitBlocks(exitBlocks);  
   
   // Iterate over all affected values for this loop and insert Phi nodes
   // for them in the appropriate exit blocks
@@ -142,7 +139,7 @@ bool LCSSA::visitSubloop(Loop* L) {
 /// processInstruction - Given a live-out instruction, insert LCSSA Phi nodes,
 /// eliminate all out-of-loop uses.
 void LCSSA::ProcessInstruction(Instruction *Instr,
-                               const std::vector<BasicBlock*>& exitBlocks) {
+                               const SmallVector<BasicBlock*, 8>& exitBlocks) {
   ++NumLCSSA; // We are applying the transformation
 
   // Keep track of the blocks that have the value available already.
@@ -152,14 +149,14 @@ void LCSSA::ProcessInstruction(Instruction *Instr,
 
   // Insert the LCSSA phi's into the exit blocks (dominated by the value), and
   // add them to the Phi's map.
-  for (std::vector<BasicBlock*>::const_iterator BBI = exitBlocks.begin(),
+  for (SmallVector<BasicBlock*, 8>::const_iterator BBI = exitBlocks.begin(),
       BBE = exitBlocks.end(); BBI != BBE; ++BBI) {
     BasicBlock *BB = *BBI;
     DomTreeNode *ExitBBNode = DT->getNode(BB);
     Value *&Phi = Phis[ExitBBNode];
-    if (!Phi && InstrNode->dominates(ExitBBNode)) {
-      PHINode *PN = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
-                                BB->begin());
+    if (!Phi && DT->dominates(InstrNode, ExitBBNode)) {
+      PHINode *PN = PHINode::Create(Instr->getType(), Instr->getName()+".lcssa",
+                                    BB->begin());
       PN->reserveOperandSpace(std::distance(pred_begin(BB), pred_end(BB)));
 
       // Remember that this phi makes the value alive in this block.
@@ -262,8 +259,8 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst,
   
   // Otherwise, the idom is the loop, so we need to insert a PHI node.  Do so
   // now, then get values to fill in the incoming values for the PHI.
-  PHINode *PN = new PHINode(OrigInst->getType(), OrigInst->getName()+".lcssa",
-                            BBN->begin());
+  PHINode *PN = PHINode::Create(OrigInst->getType(), OrigInst->getName()+".lcssa",
+                                BBN->begin());
   PN->reserveOperandSpace(std::distance(pred_begin(BBN), pred_end(BBN)));
   V = PN;