Filter nested structs
[oota-llvm.git] / lib / Transforms / Utils / LCSSA.cpp
index 220241df3356b7321a6f09d694f65ec4cb0f6dac..567b23e6ffe473037ff95e1aa7a0e345aa1aaeb6 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.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -59,7 +59,7 @@ namespace {
     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,
@@ -73,6 +73,14 @@ namespace {
       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,
@@ -82,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);
     }
   };
@@ -99,7 +107,7 @@ bool LCSSA::runOnLoop(Loop *L, LPPassManager &LPM) {
   
   LI = &LPM.getAnalysis<LoopInfo>();
   DT = &getAnalysis<DominatorTree>();
-    
+
   // Speed up queries by creating a sorted list of blocks
   LoopBlocks.clear();
   LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end());
@@ -113,9 +121,8 @@ bool LCSSA::runOnLoop(Loop *L, LPPassManager &LPM) {
   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
@@ -132,7 +139,7 @@ bool LCSSA::runOnLoop(Loop *L, LPPassManager &LPM) {
 /// 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.
@@ -142,7 +149,7 @@ 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);
@@ -231,10 +238,6 @@ Value *LCSSA::GetValueForBlock(DomTreeNode *BB, Instruction *OrigInst,
 
   DomTreeNode *IDom = BB->getIDom();
 
-  // If the block has no dominator, bail
-  if (!IDom)
-    return V = UndefValue::get(OrigInst->getType());
-
   // Otherwise, there are two cases: we either have to insert a PHI node or we
   // don't.  We need to insert a PHI node if this block is not dominated by one
   // of the exit nodes from the loop (the loop could have multiple exits, and