Make non-local memdep not be recursive, and fix a bug on 403.gcc that this exposed.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40692 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index 3d04fc4..e39e2eb 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -721,8 +721,9 @@
   Value *&V = Phis[BB];
   if (V) return V;
   
-  if (std::distance(pred_begin(BB), pred_end(BB)) == 1)
-    return V = GetValueForBlock(*pred_begin(BB), orig, Phis);
+  BasicBlock* singlePred = BB->getSinglePredecessor();
+  if (singlePred)
+    return V = GetValueForBlock(singlePred, orig, Phis);
   
   // 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.
@@ -750,6 +751,16 @@
     
     MD.removeInstruction(PN);
     PN->replaceAllUsesWith(first);
+    
+    SmallVector<BasicBlock*, 4> toRemove;
+    for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
+         E = Phis.end(); I != E; ++I)
+      if (I->second == PN)
+        toRemove.push_back(I->first);
+    for (SmallVector<BasicBlock*, 4>::iterator I = toRemove.begin(),
+         E= toRemove.end(); I != E; ++I)
+      Phis[*I] = first;
+    
     PN->eraseFromParent();
     
     Phis[BB] = first;
@@ -764,9 +775,7 @@
   MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
   
   DenseMap<BasicBlock*, Value*> deps;
-  bool ret = MD.getNonLocalDependency(L, deps);
-  if (!ret)
-    return false;
+  MD.getNonLocalDependency(L, deps);
   
   DenseMap<BasicBlock*, Value*> repl;
   for (DenseMap<BasicBlock*, Value*>::iterator I = deps.begin(), E = deps.end();