diff options
author | Dan Gohman <gohman@apple.com> | 2010-11-10 01:02:18 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-11-10 01:02:18 +0000 |
commit | 2694e14087e9f56be392c688038050369cc8e6b7 (patch) | |
tree | f20c969f25a3962eb45af5f505886c93bb7b1dfd /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 49609d56d79809b691fc9f8400c229cf821cbd36 (diff) | |
download | bcm5719-llvm-2694e14087e9f56be392c688038050369cc8e6b7.tar.gz bcm5719-llvm-2694e14087e9f56be392c688038050369cc8e6b7.zip |
Make ModRefBehavior a lattice. Use this to clean up AliasAnalysis
chaining and simplify FunctionAttrs' GetModRefBehavior logic.
llvm-svn: 118660
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 73114fe5aab..bf1b689587c 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -595,7 +595,7 @@ BasicAliasAnalysis::getModRefBehavior(ImmutableCallSite CS) { Min = OnlyReadsMemory; // The AliasAnalysis base class has some smarts, lets use them. - return std::min(AliasAnalysis::getModRefBehavior(CS), Min); + return ModRefBehavior(AliasAnalysis::getModRefBehavior(CS) & Min); } /// getModRefBehavior - Return the behavior when calling the given function. @@ -613,12 +613,14 @@ BasicAliasAnalysis::getModRefBehavior(const Function *F) { #undef GET_INTRINSIC_MODREF_BEHAVIOR } + ModRefBehavior Min = UnknownModRefBehavior; + // If the function declares it only reads memory, go with that. if (F->onlyReadsMemory()) - return OnlyReadsMemory; + Min = OnlyReadsMemory; // Otherwise be conservative. - return AliasAnalysis::getModRefBehavior(F); + return ModRefBehavior(AliasAnalysis::getModRefBehavior(F) & Min); } /// getModRefInfo - Check to see if the specified callsite can clobber the @@ -671,6 +673,8 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS, return NoModRef; } + ModRefResult Min = ModRef; + // Finally, handle specific knowledge of intrinsics. const IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction()); if (II != 0) @@ -686,7 +690,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS, if (isNoAlias(Location(Dest, Len), Loc)) { if (isNoAlias(Location(Src, Len), Loc)) return NoModRef; - return Ref; + Min = Ref; } break; } @@ -745,7 +749,7 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS, } // The AliasAnalysis base class has some smarts, lets use them. - return AliasAnalysis::getModRefInfo(CS, Loc); + return ModRefResult(AliasAnalysis::getModRefInfo(CS, Loc) & Min); } /// aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a GEP instruction |