Fix Regression/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll
by being more careful about updating PHI nodes

llvm-svn: 22739
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 4975614..547fd25 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -423,21 +423,28 @@
   }
   
   // PHI nodes are more complex.  We have to insert one copy of the NewBase+Imm
-  // expression into each operand block that uses it.
+  // expression into each operand block that uses it.  Note that PHI nodes can
+  // have multiple entries for the same predecessor.  We use a map to make sure
+  // that a PHI node only has a single Value* for each predecessor (which also
+  // prevents us from inserting duplicate code in some blocks).
+  std::map<BasicBlock*, Value*> InsertedCode;
   PHINode *PN = cast<PHINode>(Inst);
   for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
     if (PN->getIncomingValue(i) == OperandValToReplace) {
       // FIXME: this should split any critical edges.
 
-      // Insert the code into the end of the predecessor block.
-      BasicBlock::iterator InsertPt = PN->getIncomingBlock(i)->getTerminator();
+      Value *&Code = InsertedCode[PN->getIncomingBlock(i)];
+      if (!Code) {
+        // Insert the code into the end of the predecessor block.
+        BasicBlock::iterator InsertPt =PN->getIncomingBlock(i)->getTerminator();
       
-      SCEVHandle NewValSCEV = SCEVAddExpr::get(NewBase, Imm);
-      Value *NewVal = Rewriter.expandCodeFor(NewValSCEV, InsertPt,
-                                             OperandValToReplace->getType());
+        SCEVHandle NewValSCEV = SCEVAddExpr::get(NewBase, Imm);
+        Code = Rewriter.expandCodeFor(NewValSCEV, InsertPt,
+                                      OperandValToReplace->getType());
+      }
       
       // Replace the use of the operand Value with the new Phi we just created.
-      PN->setIncomingValue(i, NewVal);
+      PN->setIncomingValue(i, Code);
       Rewriter.clear();
     }
   }