diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h --- a/llvm/include/llvm/Analysis/AliasAnalysis.h +++ b/llvm/include/llvm/Analysis/AliasAnalysis.h @@ -62,8 +62,8 @@ class Function; class InvokeInst; class PreservedAnalyses; -class Value; class TargetLibraryInfo; +class Value; /// The possible results of an alias query. /// @@ -691,7 +691,7 @@ /// Return information about whether a call and an instruction may refer to /// the same memory locations. - ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call); + ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call); /// Return information about whether two call sites may refer to the same set /// of memory locations. See the AA documentation for details: @@ -704,12 +704,11 @@ /// Early exits in callCapturesBefore may lead to ModRefInfo::Must not being /// set. ModRefInfo callCapturesBefore(const Instruction *I, - const MemoryLocation &MemLoc, - const DominatorTree *DT); + const MemoryLocation &MemLoc, DominatorTree *DT); /// A convenience wrapper to synthesize a memory location. ModRefInfo callCapturesBefore(const Instruction *I, const Value *P, - LocationSize Size, const DominatorTree *DT) { + LocationSize Size, DominatorTree *DT) { return callCapturesBefore(I, MemoryLocation(P, Size), DT); } @@ -749,7 +748,7 @@ AAQueryInfo &AAQI); bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool OrLocal = false); - ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call2, + ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call2, AAQueryInfo &AAQIP); ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI); @@ -773,39 +772,7 @@ AAQueryInfo &AAQI); ModRefInfo getModRefInfo(const Instruction *I, const Optional &OptLoc, - AAQueryInfo &AAQIP) { - if (OptLoc == None) { - if (const auto *Call = dyn_cast(I)) { - return createModRefInfo(getModRefBehavior(Call)); - } - } - - const MemoryLocation &Loc = OptLoc.getValueOr(MemoryLocation()); - - switch (I->getOpcode()) { - case Instruction::VAArg: - return getModRefInfo((const VAArgInst *)I, Loc, AAQIP); - case Instruction::Load: - return getModRefInfo((const LoadInst *)I, Loc, AAQIP); - case Instruction::Store: - return getModRefInfo((const StoreInst *)I, Loc, AAQIP); - case Instruction::Fence: - return getModRefInfo((const FenceInst *)I, Loc, AAQIP); - case Instruction::AtomicCmpXchg: - return getModRefInfo((const AtomicCmpXchgInst *)I, Loc, AAQIP); - case Instruction::AtomicRMW: - return getModRefInfo((const AtomicRMWInst *)I, Loc, AAQIP); - case Instruction::Call: - case Instruction::Invoke: - return getModRefInfo((const CallBase *)I, Loc, AAQIP); - case Instruction::CatchPad: - return getModRefInfo((const CatchPadInst *)I, Loc, AAQIP); - case Instruction::CatchRet: - return getModRefInfo((const CatchReturnInst *)I, Loc, AAQIP); - default: - return ModRefInfo::NoModRef; - } - } + AAQueryInfo &AAQIP); class Concept; @@ -853,7 +820,7 @@ const Optional &OptLoc) { return AA.getModRefInfo(I, OptLoc, AAQI); } - ModRefInfo getModRefInfo(const Instruction *I, const CallBase *Call2) { + ModRefInfo getModRefInfo(Instruction *I, const CallBase *Call2) { return AA.getModRefInfo(I, Call2, AAQI); } ModRefInfo getArgModRefInfo(const CallBase *Call, unsigned ArgIdx) { diff --git a/llvm/lib/Analysis/AliasAnalysis.cpp b/llvm/lib/Analysis/AliasAnalysis.cpp --- a/llvm/lib/Analysis/AliasAnalysis.cpp +++ b/llvm/lib/Analysis/AliasAnalysis.cpp @@ -166,13 +166,12 @@ return Result; } -ModRefInfo AAResults::getModRefInfo(const Instruction *I, - const CallBase *Call2) { +ModRefInfo AAResults::getModRefInfo(Instruction *I, const CallBase *Call2) { AAQueryInfo AAQIP; return getModRefInfo(I, Call2, AAQIP); } -ModRefInfo AAResults::getModRefInfo(const Instruction *I, const CallBase *Call2, +ModRefInfo AAResults::getModRefInfo(Instruction *I, const CallBase *Call2, AAQueryInfo &AAQI) { // We may have two calls. if (const auto *Call1 = dyn_cast(I)) { @@ -648,6 +647,43 @@ return ModRefInfo::ModRef; } +ModRefInfo AAResults::getModRefInfo(const Instruction *I, + const Optional &OptLoc, + AAQueryInfo &AAQIP) { + if (OptLoc == None) { + if (const auto *Call = dyn_cast(I)) { + return createModRefInfo(getModRefBehavior(Call)); + } + } + + const MemoryLocation &Loc = OptLoc.getValueOr(MemoryLocation()); + + switch (I->getOpcode()) { + case Instruction::VAArg: + return getModRefInfo((const VAArgInst *)I, Loc, AAQIP); + case Instruction::Load: + return getModRefInfo((const LoadInst *)I, Loc, AAQIP); + case Instruction::Store: + return getModRefInfo((const StoreInst *)I, Loc, AAQIP); + case Instruction::Fence: + return getModRefInfo((const FenceInst *)I, Loc, AAQIP); + case Instruction::AtomicCmpXchg: + return getModRefInfo((const AtomicCmpXchgInst *)I, Loc, AAQIP); + case Instruction::AtomicRMW: + return getModRefInfo((const AtomicRMWInst *)I, Loc, AAQIP); + case Instruction::Call: + return getModRefInfo((const CallInst *)I, Loc, AAQIP); + case Instruction::Invoke: + return getModRefInfo((const InvokeInst *)I, Loc, AAQIP); + case Instruction::CatchPad: + return getModRefInfo((const CatchPadInst *)I, Loc, AAQIP); + case Instruction::CatchRet: + return getModRefInfo((const CatchReturnInst *)I, Loc, AAQIP); + default: + return ModRefInfo::NoModRef; + } +} + /// Return information about whether a particular call site modifies /// or reads the specified memory location \p MemLoc before instruction \p I /// in a BasicBlock. @@ -657,7 +693,7 @@ /// with a smarter AA in place, this test is just wasting compile time. ModRefInfo AAResults::callCapturesBefore(const Instruction *I, const MemoryLocation &MemLoc, - const DominatorTree *DT) { + DominatorTree *DT) { if (!DT) return ModRefInfo::ModRef; diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp --- a/llvm/lib/Analysis/CaptureTracking.cpp +++ b/llvm/lib/Analysis/CaptureTracking.cpp @@ -413,8 +413,8 @@ } bool llvm::isNonEscapingLocalObject( - const Value *V, AAQueryInfo::IsCapturedCacheT *IsCapturedCache) { - AAQueryInfo::IsCapturedCacheT::iterator CacheIt; + const Value *V, SmallDenseMap *IsCapturedCache) { + SmallDenseMap::iterator CacheIt; if (IsCapturedCache) { bool Inserted; std::tie(CacheIt, Inserted) = IsCapturedCache->insert({V, false});