Fix a bug that was causing several miscompilations on SPEC.
authorOwen Anderson <resistor@mac.com>
Thu, 2 Aug 2007 17:56:05 +0000 (17:56 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 2 Aug 2007 17:56:05 +0000 (17:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40746 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryDependenceAnalysis.cpp
lib/Transforms/Scalar/GVN.cpp

index a280fffb59b83ea16e71f66bb76de4445c808e56..47e47e5cba143c8dd77d2cefba5314cb876eb57f 100644 (file)
@@ -111,19 +111,31 @@ void MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
   while (!stack.empty()) {
     BasicBlock* BB = stack.back();
     
-    visited.insert(BB);
-    
-    if (resp.count(BB)) {
+    if (visited.count(BB)) {
       stack.pop_back();
       continue;
     }
     
     if (BB != block) {
+      visited.insert(BB);
+      
       Instruction* localDep = getDependency(query, 0, BB);
       if (localDep != NonLocal) {
         resp.insert(std::make_pair(BB, localDep));
+        stack.pop_back();
+        
         continue;
       }
+    } else if (BB == block && stack.size() > 1) {
+      visited.insert(BB);
+      
+      Instruction* localDep = getDependency(query, 0, BB);
+      if (localDep != query)
+        resp.insert(std::make_pair(BB, localDep));
+      
+      stack.pop_back();
+      
+      continue;
     }
     
     bool predOnStack = false;
index e39e2eb16af9da5fd3ad63e7c685ad360b54bd0f..dfe0dff3ad69e3b4c406423ff71d4492a41a4f11 100644 (file)
@@ -658,7 +658,8 @@ namespace {
                             SmallVector<Instruction*, 4>& toErase);
     bool processNonLocalLoad(LoadInst* L, SmallVector<Instruction*, 4>& toErase);
     Value *GetValueForBlock(BasicBlock *BB, LoadInst* orig,
-                                  DenseMap<BasicBlock*, Value*> &Phis);
+                            DenseMap<BasicBlock*, Value*> &Phis,
+                            bool top_level = false);
     void dump(DenseMap<BasicBlock*, Value*>& d);
   };
   
@@ -715,11 +716,12 @@ void GVN::dump(DenseMap<BasicBlock*, Value*>& d) {
 /// GetValueForBlock - Get the value to use within the specified basic block.
 /// available values are in Phis.
 Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
-                               DenseMap<BasicBlock*, Value*> &Phis) { 
+                               DenseMap<BasicBlock*, Value*> &Phis,
+                               bool top_level) { 
                                  
   // If we have already computed this value, return the previously computed val.
   Value *&V = Phis[BB];
-  if (V) return V;
+  if (V && ! top_level) return V;
   
   BasicBlock* singlePred = BB->getSinglePredecessor();
   if (singlePred)
@@ -799,7 +801,7 @@ bool GVN::processNonLocalLoad(LoadInst* L, SmallVector<Instruction*, 4>& toErase
     }
   
   SmallPtrSet<BasicBlock*, 4> visited;
-  Value* v = GetValueForBlock(L->getParent(), L, repl);
+  Value* v = GetValueForBlock(L->getParent(), L, repl, true);
   
   MD.removeInstruction(L);
   L->replaceAllUsesWith(v);