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) {}
/// 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
/// 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
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);