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 | 87c5c2f069fe18df5a372e6eb7bbca3be4d09fac (patch) | |
tree | 20d66952a576f68e579d50d4c0ef85a738353b13 /lib/Analysis/TypeBasedAliasAnalysis.cpp | |
parent | df8370bd70c228036f887a3f500ad3e79bc657b9 (diff) | |
download | llvm-87c5c2f069fe18df5a372e6eb7bbca3be4d09fac.tar.gz llvm-87c5c2f069fe18df5a372e6eb7bbca3be4d09fac.tar.bz2 llvm-87c5c2f069fe18df5a372e6eb7bbca3be4d09fac.tar.xz |
Support TBAA attachments on calls. This is somewhat experimental.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117317 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/TypeBasedAliasAnalysis.cpp')
-rw-r--r-- | lib/Analysis/TypeBasedAliasAnalysis.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/Analysis/TypeBasedAliasAnalysis.cpp b/lib/Analysis/TypeBasedAliasAnalysis.cpp index 626517ad9a..0516d64a71 100644 --- a/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ b/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); +} |