Fix Transforms/IndVarsSimplify/2006-09-20-LFTR-Crash.ll
[oota-llvm.git] / lib / Transforms / Scalar / IndVarSimplify.cpp
index 72ddb07d1eb2b6c8805c348336cc560a0c902b7c..1059159aadcc2b238b408e3aa68bf2174dce1b60 100644 (file)
@@ -11,7 +11,7 @@
 // computations derived from them) into simpler forms suitable for subsequent
 // analysis and transformation.
 //
-// This transformation make the following changes to each loop with an
+// This transformation makes the following changes to each loop with an
 // identifiable induction variable:
 //   1. All loops are transformed to have a SINGLE canonical induction variable
 //      which starts at zero and steps by one.
@@ -79,19 +79,20 @@ namespace {
       AU.addRequired<ScalarEvolution>();
       AU.addRequired<LoopInfo>();
       AU.addPreservedID(LoopSimplifyID);
+      AU.addPreservedID(LCSSAID);
       AU.setPreservesCFG();
     }
   private:
     void runOnLoop(Loop *L);
     void EliminatePointerRecurrence(PHINode *PN, BasicBlock *Preheader,
                                     std::set<Instruction*> &DeadInsts);
-    void LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
-                                   SCEVExpander &RW);
+    Instruction *LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
+                                           SCEVExpander &RW);
     void RewriteLoopExitValues(Loop *L);
 
     void DeleteTriviallyDeadInstructions(std::set<Instruction*> &Insts);
   };
-  RegisterOpt<IndVarSimplify> X("indvars", "Canonicalize Induction Variables");
+  RegisterPass<IndVarSimplify> X("indvars", "Canonicalize Induction Variables");
 }
 
 FunctionPass *llvm::createIndVarSimplifyPass() {
@@ -208,13 +209,17 @@ void IndVarSimplify::EliminatePointerRecurrence(PHINode *PN,
 /// variable.  This pass is able to rewrite the exit tests of any loop where the
 /// SCEV analysis can determine a loop-invariant trip count of the loop, which
 /// is actually a much broader range than just linear tests.
-void IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
-                                               SCEVExpander &RW) {
+///
+/// This method returns a "potentially dead" instruction whose computation chain
+/// should be deleted when convenient.
+Instruction *IndVarSimplify::LinearFunctionTestReplace(Loop *L,
+                                                       SCEV *IterationCount,
+                                                       SCEVExpander &RW) {
   // Find the exit block for the loop.  We can currently only handle loops with
   // a single exit.
   std::vector<BasicBlock*> ExitBlocks;
   L->getExitBlocks(ExitBlocks);
-  if (ExitBlocks.size() != 1) return;
+  if (ExitBlocks.size() != 1) return 0;
   BasicBlock *ExitBlock = ExitBlocks[0];
 
   // Make sure there is only one predecessor block in the loop.
@@ -225,19 +230,17 @@ void IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
       if (ExitingBlock == 0)
         ExitingBlock = *PI;
       else
-        return;  // Multiple exits from loop to this block.
+        return 0;  // Multiple exits from loop to this block.
     }
   assert(ExitingBlock && "Loop info is broken");
 
   if (!isa<BranchInst>(ExitingBlock->getTerminator()))
-    return;  // Can't rewrite non-branch yet
+    return 0;  // Can't rewrite non-branch yet
   BranchInst *BI = cast<BranchInst>(ExitingBlock->getTerminator());
   assert(BI->isConditional() && "Must be conditional to be part of loop!");
 
-  std::set<Instruction*> InstructionsToDelete;
-  if (Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()))
-    InstructionsToDelete.insert(Cond);
-
+  Instruction *PotentiallyDeadInst = dyn_cast<Instruction>(BI->getCondition());
+  
   // If the exiting block is not the same as the backedge block, we must compare
   // against the preincremented value, otherwise we prefer to compare against
   // the post-incremented value.
@@ -278,8 +281,7 @@ void IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
   BI->setCondition(Cond);
   ++NumLFTR;
   Changed = true;
-
-  DeleteTriviallyDeadInstructions(InstructionsToDelete);
+  return PotentiallyDeadInst;
 }
 
 
@@ -321,11 +323,26 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
               HasConstantItCount) {
             // Find out if this predictably varying value is actually used
             // outside of the loop.  "extra" as opposed to "intra".
-            std::vector<User*> ExtraLoopUsers;
+            std::vector<Instruction*> ExtraLoopUsers;
             for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
-                 UI != E; ++UI)
-              if (!L->contains(cast<Instruction>(*UI)->getParent()))
-                ExtraLoopUsers.push_back(*UI);
+                 UI != E; ++UI) {
+              Instruction *User = cast<Instruction>(*UI);
+              if (!L->contains(User->getParent())) {
+                // If this is a PHI node in the exit block and we're inserting,
+                // into the exit block, it must have a single entry.  In this
+                // case, we can't insert the code after the PHI and have the PHI
+                // still use it.  Instead, don't insert the the PHI.
+                if (PHINode *PN = dyn_cast<PHINode>(User)) {
+                  // FIXME: This is a case where LCSSA pessimizes code, this
+                  // should be fixed better.
+                  if (PN->getNumOperands() == 2 && 
+                      PN->getParent() == BlockToInsertInto)
+                    continue;
+                }
+                ExtraLoopUsers.push_back(User);
+              }
+            }
+            
             if (!ExtraLoopUsers.empty()) {
               // Okay, this instruction has a user outside of the current loop
               // and varies predictably in this loop.  Evaluate the value it
@@ -343,8 +360,36 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
 
                 // Rewrite any users of the computed value outside of the loop
                 // with the newly computed value.
-                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i)
-                  ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
+                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i) {
+                  PHINode* PN = dyn_cast<PHINode>(ExtraLoopUsers[i]);
+                  if (PN && PN->getNumOperands() == 2 &&
+                      !L->contains(PN->getParent())) {
+                    // We're dealing with an LCSSA Phi.  Handle it specially.
+                    Instruction* LCSSAInsertPt = BlockToInsertInto->begin();
+                    
+                    Instruction* NewInstr = dyn_cast<Instruction>(NewVal);
+                    if (NewInstr && !isa<PHINode>(NewInstr) &&
+                        !L->contains(NewInstr->getParent()))
+                      for (unsigned j = 0; j < NewInstr->getNumOperands(); ++j){
+                        Instruction* PredI = 
+                                 dyn_cast<Instruction>(NewInstr->getOperand(j));
+                        if (PredI && L->contains(PredI->getParent())) {
+                          PHINode* NewLCSSA = new PHINode(PredI->getType(),
+                                                    PredI->getName() + ".lcssa",
+                                                    LCSSAInsertPt);
+                          NewLCSSA->addIncoming(PredI, 
+                                     BlockToInsertInto->getSinglePredecessor());
+                        
+                          NewInstr->replaceUsesOfWith(PredI, NewLCSSA);
+                        }
+                      }
+                    
+                    PN->replaceAllUsesWith(NewVal);
+                    PN->eraseFromParent();
+                  } else {
+                    ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
+                  }
+                }
 
                 // If this instruction is dead now, schedule it to be removed.
                 if (I->use_empty())
@@ -427,7 +472,12 @@ void IndVarSimplify::runOnLoop(Loop *L) {
       SCEVExpander Rewriter(*SE, *LI);
       Rewriter.getOrInsertCanonicalInductionVariable(L,
                                                      IterationCount->getType());
-      LinearFunctionTestReplace(L, IterationCount, Rewriter);
+      if (Instruction *I = LinearFunctionTestReplace(L, IterationCount,
+                                                     Rewriter)) {
+        std::set<Instruction*> InstructionsToDelete;
+        InstructionsToDelete.insert(I);
+        DeleteTriviallyDeadInstructions(InstructionsToDelete);
+      }
     }
     return;
   }
@@ -454,7 +504,8 @@ void IndVarSimplify::runOnLoop(Loop *L) {
   Changed = true;
 
   if (!isa<SCEVCouldNotCompute>(IterationCount))
-    LinearFunctionTestReplace(L, IterationCount, Rewriter);
+    if (Instruction *DI = LinearFunctionTestReplace(L, IterationCount,Rewriter))
+      DeadInsts.insert(DI);
 
   // Now that we have a canonical induction variable, we can rewrite any
   // recurrences in terms of the induction variable.  Start with the auxillary
@@ -527,4 +578,6 @@ void IndVarSimplify::runOnLoop(Loop *L) {
 #endif
 
   DeleteTriviallyDeadInstructions(DeadInsts);
+  
+  if (mustPreserveAnalysisID(LCSSAID)) assert(L->isLCSSAForm());
 }