aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-02-04 05:16:46 +0000
committerOwen Anderson <resistor@mac.com>2009-02-04 05:16:46 +0000
commitfe9388ccb4d2449e8e6a62053479a0ba74ae0b2d (patch)
tree8a3d31f8efcb67c2e815938be17abd03952a7149 /lib/Analysis/BasicAliasAnalysis.cpp
parent39355f9fea790c5a1b12ef0fdcfeac3f533232ea (diff)
Finish making AliasAnalysis aware of the fact that most atomic intrinsics only dereference their arguments, and enhance
BasicAA to make use of this fact when computing ModRef info. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63718 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r--lib/Analysis/BasicAliasAnalysis.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp
index ccbe338585..317e9d9e2e 100644
--- a/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/lib/Analysis/BasicAliasAnalysis.cpp
@@ -256,6 +256,22 @@ bool BasicAliasAnalysis::pointsToConstantMemory(const Value *P) {
//
AliasAnalysis::ModRefResult
BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
+ // If the function only accesses its arguments, it suffices to check that
+ // P does not alias any of those arguments.
+ if (AliasAnalysis::getModRefBehavior(CS, 0) ==
+ AliasAnalysis::AccessesArguments) {
+ bool doesAlias = false;
+ for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end();
+ AI != AE; ++AI)
+ if (alias(*AI, ~0U, P, Size) != NoAlias) {
+ doesAlias = true;
+ break;
+ }
+
+ if (!doesAlias)
+ return NoModRef;
+ }
+
if (!isa<Constant>(P)) {
const Value *Object = P->getUnderlyingObject();