Changeset View
Changeset View
Standalone View
Standalone View
lib/Analysis/MemoryDependenceAnalysis.cpp
Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | |||||
INITIALIZE_PASS_BEGIN(MemoryDependenceAnalysis, "memdep", | INITIALIZE_PASS_BEGIN(MemoryDependenceAnalysis, "memdep", | ||||
"Memory Dependence Analysis", false, true) | "Memory Dependence Analysis", false, true) | ||||
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) | INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) | ||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis) | INITIALIZE_AG_DEPENDENCY(AliasAnalysis) | ||||
INITIALIZE_PASS_END(MemoryDependenceAnalysis, "memdep", | INITIALIZE_PASS_END(MemoryDependenceAnalysis, "memdep", | ||||
"Memory Dependence Analysis", false, true) | "Memory Dependence Analysis", false, true) | ||||
MemoryDependenceAnalysis::MemoryDependenceAnalysis() | MemoryDependenceAnalysis::MemoryDependenceAnalysis() | ||||
: FunctionPass(ID), PredCache() { | : FunctionPass(ID), PredCache(), Func(nullptr) { | ||||
initializeMemoryDependenceAnalysisPass(*PassRegistry::getPassRegistry()); | initializeMemoryDependenceAnalysisPass(*PassRegistry::getPassRegistry()); | ||||
} | } | ||||
MemoryDependenceAnalysis::~MemoryDependenceAnalysis() { | MemoryDependenceAnalysis::~MemoryDependenceAnalysis() { | ||||
} | } | ||||
/// Clean up memory in between runs | /// Clean up memory in between runs | ||||
void MemoryDependenceAnalysis::releaseMemory() { | void MemoryDependenceAnalysis::releaseMemory() { | ||||
LocalDeps.clear(); | LocalDeps.clear(); | ||||
Show All 9 Lines | |||||
/// | /// | ||||
void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { | void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { | ||||
AU.setPreservesAll(); | AU.setPreservesAll(); | ||||
AU.addRequired<AssumptionCacheTracker>(); | AU.addRequired<AssumptionCacheTracker>(); | ||||
AU.addRequiredTransitive<AliasAnalysis>(); | AU.addRequiredTransitive<AliasAnalysis>(); | ||||
} | } | ||||
bool MemoryDependenceAnalysis::runOnFunction(Function &F) { | bool MemoryDependenceAnalysis::runOnFunction(Function &F) { | ||||
Func = &F; | |||||
AA = &getAnalysis<AliasAnalysis>(); | AA = &getAnalysis<AliasAnalysis>(); | ||||
AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); | AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); | ||||
DominatorTreeWrapperPass *DTWP = | DominatorTreeWrapperPass *DTWP = | ||||
getAnalysisIfAvailable<DominatorTreeWrapperPass>(); | getAnalysisIfAvailable<DominatorTreeWrapperPass>(); | ||||
DT = DTWP ? &DTWP->getDomTree() : nullptr; | DT = DTWP ? &DTWP->getDomTree() : nullptr; | ||||
if (!PredCache) | if (!PredCache) | ||||
PredCache.reset(new PredIteratorCache()); | PredCache.reset(new PredIteratorCache()); | ||||
return false; | return false; | ||||
▲ Show 20 Lines • Show All 1,595 Lines • ▼ Show 20 Lines | for (ReverseNonLocalPtrDepTy::const_iterator | ||||
for (ValueIsLoadPair P : I->second) | for (ValueIsLoadPair P : I->second) | ||||
assert(P != ValueIsLoadPair(D, false) && | assert(P != ValueIsLoadPair(D, false) && | ||||
P != ValueIsLoadPair(D, true) && | P != ValueIsLoadPair(D, true) && | ||||
"Inst occurs in ReverseNonLocalPtrDeps map"); | "Inst occurs in ReverseNonLocalPtrDeps map"); | ||||
} | } | ||||
#endif | #endif | ||||
} | } | ||||
void MemDepResult::print(raw_ostream &OS, unsigned Depth) const { | |||||
const char *type; | |||||
switch (Value.getInt()) { | |||||
case Clobber: type = "Clobber:"; break; | |||||
case Def: type = "Def:"; break; | |||||
case Other: | |||||
if (isNonLocal()) | |||||
type = "NonLocal"; | |||||
else if (isNonFuncLocal()) | |||||
type = "NonFuncLocal"; | |||||
else if (isUnknown()) | |||||
type = "Unknown"; | |||||
break; | |||||
default: | |||||
llvm_unreachable("unknown deptype"); | |||||
} | |||||
OS.indent(Depth) << type; | |||||
Instruction *Inst = getInst(); | |||||
if (Inst) | |||||
OS << " " << *getInst(); | |||||
OS << "\n"; | |||||
} | |||||
void MemoryDependenceAnalysis::print(raw_ostream &OS, | |||||
const Module *M) const { | |||||
MemoryDependenceAnalysis *MD = const_cast<MemoryDependenceAnalysis*>(this); | |||||
for (auto &BB: *Func) | |||||
for (auto &Inst : BB) { | |||||
if (!isa<LoadInst>(&Inst) && !isa<StoreInst>(&Inst)) | |||||
continue; | |||||
OS << Inst << "\n"; | |||||
MemDepResult Dep = MD->getDependency(&Inst); | |||||
Dep.print(OS, 4); | |||||
if (Dep.isNonLocal()) { | |||||
SmallVector<NonLocalDepResult, 4> Deps; | |||||
MD->getNonLocalPointerDependency(&Inst, Deps); | |||||
for (const NonLocalDepResult &NonLocalDep : Deps) { | |||||
OS.indent(6) << NonLocalDep.getBB()->getName() << ": "; | |||||
NonLocalDep.getResult().print(OS); | |||||
} | |||||
} | |||||
} | |||||
} |