diff options
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/MemDepPrinter.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 48 |
2 files changed, 49 insertions, 9 deletions
diff --git a/llvm/lib/Analysis/MemDepPrinter.cpp b/llvm/lib/Analysis/MemDepPrinter.cpp index 10da3d5d618..ed77da02690 100644 --- a/llvm/lib/Analysis/MemDepPrinter.cpp +++ b/llvm/lib/Analysis/MemDepPrinter.cpp @@ -92,7 +92,6 @@ const char *const MemDepPrinter::DepTypeStr[] bool MemDepPrinter::runOnFunction(Function &F) { this->F = &F; - AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); MemoryDependenceAnalysis &MDA = getAnalysis<MemoryDependenceAnalysis>(); // All this code uses non-const interfaces because MemDep is not @@ -126,8 +125,7 @@ bool MemDepPrinter::runOnFunction(Function &F) { static_cast<BasicBlock *>(nullptr))); continue; } - AliasAnalysis::Location Loc = AA.getLocation(LI); - MDA.getNonLocalPointerDependency(Loc, true, LI->getParent(), NLDI); + MDA.getNonLocalPointerDependency(LI, NLDI); } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { if (!SI->isUnordered()) { // FIXME: Handle atomic/volatile stores. @@ -135,11 +133,9 @@ bool MemDepPrinter::runOnFunction(Function &F) { static_cast<BasicBlock *>(nullptr))); continue; } - AliasAnalysis::Location Loc = AA.getLocation(SI); - MDA.getNonLocalPointerDependency(Loc, false, SI->getParent(), NLDI); + MDA.getNonLocalPointerDependency(SI, NLDI); } else if (VAArgInst *VI = dyn_cast<VAArgInst>(Inst)) { - AliasAnalysis::Location Loc = AA.getLocation(VI); - MDA.getNonLocalPointerDependency(Loc, false, VI->getParent(), NLDI); + MDA.getNonLocalPointerDependency(VI, NLDI); } else { llvm_unreachable("Unknown memory instruction!"); } diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp index 0fb5a474fd5..cc459482b2c 100644 --- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -859,9 +859,53 @@ MemoryDependenceAnalysis::getNonLocalCallDependency(CallSite QueryCS) { /// own block. /// void MemoryDependenceAnalysis:: -getNonLocalPointerDependency(const AliasAnalysis::Location &Loc, bool isLoad, - BasicBlock *FromBB, +getNonLocalPointerDependency(Instruction *QueryInst, SmallVectorImpl<NonLocalDepResult> &Result) { + + auto getLocation = [](AliasAnalysis *AA, Instruction *Inst) { + if (auto *I = dyn_cast<LoadInst>(Inst)) + return AA->getLocation(I); + else if (auto *I = dyn_cast<StoreInst>(Inst)) + return AA->getLocation(I); + else if (auto *I = dyn_cast<VAArgInst>(Inst)) + return AA->getLocation(I); + else if (auto *I = dyn_cast<AtomicCmpXchgInst>(Inst)) + return AA->getLocation(I); + else if (auto *I = dyn_cast<AtomicRMWInst>(Inst)) + return AA->getLocation(I); + else + llvm_unreachable("unsupported memory instruction"); + }; + + const AliasAnalysis::Location Loc = getLocation(AA, QueryInst); + bool isLoad = isa<LoadInst>(QueryInst); + BasicBlock *FromBB = QueryInst->getParent(); + assert(FromBB); + + // This routine does not expect to deal with volatile instructions. Doing so + // would require piping through the QueryInst all the way through. + // TODO: volatiles can't be elided, but they can be reordered with other + // non-volatile accesses. + if (LoadInst *LI = dyn_cast<LoadInst>(QueryInst)) { + assert(!LI->isVolatile()); + } else if (StoreInst *SI = dyn_cast<StoreInst>(QueryInst)) { + assert(!SI->isVolatile()); + } + + + // We currently give up on any instruction which is ordered, but we do handle + // atomic instructions which are unordered. + // TODO: Handle ordered instructions + auto isOrdered = [](Instruction *Inst) { + if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) { + return !LI->isUnordered(); + } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { + return !SI->isUnordered(); + } + return false; + }; + assert(!isOrdered(QueryInst) && "ordered instructions not expected"); + assert(Loc.Ptr->getType()->isPointerTy() && "Can't get pointer deps of a non-pointer!"); Result.clear(); |