diff options
author | Dan Gohman <gohman@apple.com> | 2010-10-25 21:38:20 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-10-25 21:38:20 +0000 |
commit | c6096263e289baad6d8b9d3fe7f4858cd8147d1d (patch) | |
tree | a4a36e7dd2a71a7dffb9704f43b52014d1204914 /llvm/lib | |
parent | 43c3f4b63ce61daafa7055f9944319e8030633af (diff) | |
download | bcm5719-llvm-c6096263e289baad6d8b9d3fe7f4858cd8147d1d.tar.gz bcm5719-llvm-c6096263e289baad6d8b9d3fe7f4858cd8147d1d.zip |
Support TBAA attachments on calls. This is somewhat experimental.
llvm-svn: 117317
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp b/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp index 626517ad9ae..0516d64a710 100644 --- a/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ b/llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -59,6 +59,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/Passes.h" +#include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Metadata.h" #include "llvm/Pass.h" @@ -138,6 +139,10 @@ namespace { virtual void getAnalysisUsage(AnalysisUsage &AU) const; virtual AliasResult alias(const Location &LocA, const Location &LocB); virtual bool pointsToConstantMemory(const Location &Loc); + virtual ModRefResult getModRefInfo(ImmutableCallSite CS, + const Location &Loc); + virtual ModRefResult getModRefInfo(ImmutableCallSite CS1, + ImmutableCallSite CS2); }; } // End of anonymous namespace @@ -234,3 +239,34 @@ bool TypeBasedAliasAnalysis::pointsToConstantMemory(const Location &Loc) { return AliasAnalysis::pointsToConstantMemory(Loc); } + +AliasAnalysis::ModRefResult +TypeBasedAliasAnalysis::getModRefInfo(ImmutableCallSite CS, + const Location &Loc) { + if (!EnableTBAA) + return AliasAnalysis::getModRefInfo(CS, Loc); + + if (const MDNode *L = Loc.TBAATag) + if (const MDNode *M = + CS.getInstruction()->getMetadata(LLVMContext::MD_tbaa)) + if (!Aliases(L, M)) + return NoModRef; + + return AliasAnalysis::getModRefInfo(CS, Loc); +} + +AliasAnalysis::ModRefResult +TypeBasedAliasAnalysis::getModRefInfo(ImmutableCallSite CS1, + ImmutableCallSite CS2) { + if (!EnableTBAA) + return AliasAnalysis::getModRefInfo(CS1, CS2); + + if (const MDNode *M1 = + CS1.getInstruction()->getMetadata(LLVMContext::MD_tbaa)) + if (const MDNode *M2 = + CS2.getInstruction()->getMetadata(LLVMContext::MD_tbaa)) + if (!Aliases(M1, M2)) + return NoModRef; + + return AliasAnalysis::getModRefInfo(CS1, CS2); +} |