Template-ize more of the DomTree internal implementation details. Only the calculate...
[oota-llvm.git] / include / llvm / Analysis / MemoryDependenceAnalysis.h
index 76425d12bef14cafa2b5b5f7be9e0f58e07240ec..733e702506eed3b52e17369a891e956f9b6c5859 100644 (file)
@@ -33,23 +33,35 @@ class MemoryDependenceAnalysis : public FunctionPass {
   private:
     // A map from instructions to their dependency, with a boolean
     // flags for whether this mapping is confirmed or not
-    typedef DenseMap<Instruction*, std::pair<const Instruction*, bool> > 
+    typedef DenseMap<Instruction*, std::pair<Instruction*, bool> > 
             depMapType;
     depMapType depGraphLocal;
 
+    // A map from instructions to their non-local dependencies.
+    typedef DenseMap<Instruction*, DenseMap<BasicBlock*, Value*> >
+            nonLocalDepMapType;
+    nonLocalDepMapType depGraphNonLocal;
+    
     // A reverse mapping form dependencies to the dependees.  This is
     // used when removing instructions to keep the cache coherent.
-    typedef DenseMap<const Instruction*, SmallPtrSet<Instruction*, 4> >
+    typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> >
             reverseDepMapType;
     reverseDepMapType reverseDep;
     
+    // A reverse mapping form dependencies to the non-local dependees.
+    reverseDepMapType reverseDepNonLocal;
+    
   public:
     // Special marker indicating that the query has no dependency
     // in the specified block.
-    static const Instruction* NonLocal;
+    static Instruction* const NonLocal;
     
     // Special marker indicating that the query has no dependency at all
-    static const Instruction* None;
+    static Instruction* const None;
+    
+    
+    // Special marker indicating a dirty cache entry
+    static Instruction* const Dirty;
     
     static char ID; // Class identification, replacement for typeinfo
     MemoryDependenceAnalysis() : FunctionPass((intptr_t)&ID) {}
@@ -61,7 +73,9 @@ class MemoryDependenceAnalysis : public FunctionPass {
     /// Clean up memory in between runs
     void releaseMemory() {
       depGraphLocal.clear();
+      depGraphNonLocal.clear();
       reverseDep.clear();
+      reverseDepNonLocal.clear();
     }
 
     /// getAnalysisUsage - Does not modify anything.  It uses Value Numbering
@@ -71,7 +85,7 @@ class MemoryDependenceAnalysis : public FunctionPass {
     
     /// getDependency - Return the instruction on which a memory operation
     /// depends, starting with start.
-    const Instruction* getDependency(Instruction* query, Instruction* start = 0,
+    Instruction* getDependency(Instruction* query, Instruction* start = 0,
                                BasicBlock* block = 0);
     
     /// getNonLocalDependency - Fills the passed-in map with the non-local 
@@ -85,7 +99,7 @@ class MemoryDependenceAnalysis : public FunctionPass {
     void removeInstruction(Instruction* rem);
     
   private:
-    const Instruction* getCallSiteDependency(CallSite C, Instruction* start,
+    Instruction* getCallSiteDependency(CallSite C, Instruction* start,
                                        BasicBlock* block);
     void nonLocalHelper(Instruction* query, BasicBlock* block,
                         DenseMap<BasicBlock*, Value*>& resp);