Properly handle cases where a predecessor of the block being queried on is unreachable.
authorOwen Anderson <resistor@mac.com>
Tue, 1 Jul 2008 00:40:58 +0000 (00:40 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 1 Jul 2008 00:40:58 +0000 (00:40 +0000)
This fixes PR2503, though we should also fix other passes not to emit this kind of code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52946 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryDependenceAnalysis.cpp

index 2012ab473c98a697650a37a94129bc67a0c1f347..1cd16bb06de03c669d7c28dcad5f6c2352415ee1 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/Function.h"
 #include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/Dominators.h"
 #include "llvm/Support/CFG.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Target/TargetData.h"
@@ -82,6 +83,7 @@ void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
   AU.addRequiredTransitive<AliasAnalysis>();
   AU.addRequiredTransitive<TargetData>();
+  AU.addRequiredTransitive<DominatorTree>();
 }
 
 /// getCallSiteDependency - Private helper for finding the local dependencies
@@ -222,6 +224,17 @@ void MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
       continue;
     }
     
+    // Don't recur upwards if the current block is unreachable.
+    // Instead, mark it as having no dependency on this path,
+    // which will block optzns from occuring.  For this reason,
+    // eliminating unreachable blocks before running a memdep
+    // based optimization is recommended.
+    DominatorTree& DT = getAnalysis<DominatorTree>();
+    if (!DT.isReachableFromEntry(BB)) {
+      resp.insert(std::make_pair(BB, None));
+      continue;
+    }
+    
     // If we didn't find anything, recurse on the precessors of this block
     // Only do this for blocks with a small number of predecessors.
     bool predOnStack = false;