Fix a bug in non-local memdep that was causing an infinite loop on 175.vpr.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40495 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp
index ae26c26..e260b27 100644
--- a/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -103,7 +103,8 @@
 
 bool MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
                                               BasicBlock* block,
-                                              DenseMap<BasicBlock*, Value*>& resp) {
+                                              DenseMap<BasicBlock*, Value*>& resp,
+                                              SmallPtrSet<BasicBlock*, 4>& visited) {
   if (resp.count(block))
     return resp[block] != None;
   
@@ -113,10 +114,15 @@
     return true;
   }
   
+  visited.insert(block);
+  
   bool inserted = false;
   for (pred_iterator PI = pred_begin(block), PE = pred_end(block);
        PI != PE; ++PI)
-    inserted |= nonLocalHelper(query, *PI, resp);
+    if (!visited.count(*PI))
+      inserted |= nonLocalHelper(query, *PI, resp, visited);
+  
+  visited.erase(block);
   
   if (!inserted)
     resp.insert(std::make_pair(block, None));
@@ -133,11 +139,14 @@
   }
   
   bool inserted = false;
+  SmallPtrSet<BasicBlock*, 4> visited;
+  visited.insert(query->getParent());
   
   BasicBlock* parent = query->getParent();
   for (pred_iterator PI = pred_begin(parent), PE = pred_end(parent);
        PI != PE; ++PI) {
-    inserted |= nonLocalHelper(query, *PI, resp);
+    if (!visited.count(*PI))
+      inserted |= nonLocalHelper(query, *PI, resp, visited);
   }
   
   if (!inserted)