diff options
author | Bryant Wong <llvm-commits@xorshift.org> | 2016-12-25 22:42:27 +0000 |
---|---|---|
committer | Bryant Wong <llvm-commits@xorshift.org> | 2016-12-25 22:42:27 +0000 |
commit | a07d9b14603780b70c61a8d5741bc5eb4ab7be69 (patch) | |
tree | d45fa135783373d0aa69641f827cb959a699a413 /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | d7c12ee54ccf5db8c85426f13e37616106e883f7 (diff) | |
download | bcm5719-llvm-a07d9b14603780b70c61a8d5741bc5eb4ab7be69.tar.gz bcm5719-llvm-a07d9b14603780b70c61a8d5741bc5eb4ab7be69.zip |
[AliasAnalysis] Teach BasicAA about memcpy.
Differential Revision: https://reviews.llvm.org/D27034
llvm-svn: 290526
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 50a43fe22e8..14d9abfbdac 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -776,6 +776,31 @@ ModRefInfo BasicAAResult::getModRefInfo(ImmutableCallSite CS, return MRI_NoModRef; } + // The semantics of memcpy intrinsics forbid overlap between their respective + // operands, i.e., source and destination of any given memcpy must no-alias. + // If Loc must-aliases either one of these two locations, then it necessarily + // no-aliases the other. + if (auto *Inst = dyn_cast<MemCpyInst>(CS.getInstruction())) { + AliasResult SrcAA, DestAA; + + if ((SrcAA = getBestAAResults().alias(MemoryLocation::getForSource(Inst), + Loc)) == MustAlias) + // Loc is exactly the memcpy source thus disjoint from memcpy dest. + return MRI_Ref; + if ((DestAA = getBestAAResults().alias(MemoryLocation::getForDest(Inst), + Loc)) == MustAlias) + // The converse case. + return MRI_Mod; + + // It's also possible for Loc to alias both src and dest, or neither. + ModRefInfo rv = MRI_NoModRef; + if (SrcAA != NoAlias) + rv = static_cast<ModRefInfo>(rv | MRI_Ref); + if (DestAA != NoAlias) + rv = static_cast<ModRefInfo>(rv | MRI_Mod); + return rv; + } + // While the assume intrinsic is marked as arbitrarily writing so that // proper control dependencies will be maintained, it never aliases any // particular memory location. |