diff options
author | Justin Bogner <mail@justinbogner.com> | 2015-09-24 04:59:24 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2015-09-24 04:59:24 +0000 |
commit | 49655f806fa7867ba85f81621b9045821d033c77 (patch) | |
tree | f1278c572651d861f9c7f9c0fa7329c17f5f397d /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 3ad353f3f44efdb9559adb4b690ef1b3098f0ad7 (diff) | |
download | llvm-49655f806fa7867ba85f81621b9045821d033c77.zip llvm-49655f806fa7867ba85f81621b9045821d033c77.tar.gz llvm-49655f806fa7867ba85f81621b9045821d033c77.tar.bz2 |
BasicAA: Move BasicAAResult::alias out-of-line. NFC
This makes the header more readable and cleans up some unnecessary
header differences between NDEBUG and !NDEBUG.
llvm-svn: 248462
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 04e6d98..2e927ed 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -627,6 +627,47 @@ static bool isAssumeIntrinsic(ImmutableCallSite CS) { return false; } +static const Function *getParent(const Value *V) { + if (const Instruction *inst = dyn_cast<Instruction>(V)) + return inst->getParent()->getParent(); + + if (const Argument *arg = dyn_cast<Argument>(V)) + return arg->getParent(); + + return nullptr; +} + +static bool notDifferentParent(const Value *O1, const Value *O2) { + + const Function *F1 = getParent(O1); + const Function *F2 = getParent(O2); + + return !F1 || !F2 || F1 == F2; +} + +AliasResult BasicAAResult::alias(const MemoryLocation &LocA, + const MemoryLocation &LocB) { + assert(notDifferentParent(LocA.Ptr, LocB.Ptr) && + "BasicAliasAnalysis doesn't support interprocedural queries."); + + // If we have a directly cached entry for these locations, we have recursed + // through this once, so just return the cached results. Notably, when this + // happens, we don't clear the cache. + auto CacheIt = AliasCache.find(LocPair(LocA, LocB)); + if (CacheIt != AliasCache.end()) + return CacheIt->second; + + AliasResult Alias = aliasCheck(LocA.Ptr, LocA.Size, LocA.AATags, LocB.Ptr, + LocB.Size, LocB.AATags); + // AliasCache rarely has more than 1 or 2 elements, always use + // shrink_and_clear so it quickly returns to the inline capacity of the + // SmallDenseMap if it ever grows larger. + // FIXME: This should really be shrink_to_inline_capacity_and_clear(). + AliasCache.shrink_and_clear(); + VisitedPhiBBs.clear(); + return Alias; +} + /// Checks to see if the specified callsite can clobber the specified memory /// object. /// |