aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Analysis
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2009-02-13 17:32:26 +0000
committerDuncan Sands <baldrick@free.fr>2009-02-13 17:32:26 +0000
commitddd8c450ece6a3c637441992852193a6c5b2fed6 (patch)
tree6aede67104484663803b8254eb368d8e3b90db83 /lib/Analysis
parent02b6a6a75f29f59a4ea267608c6d3f6b1ebbf0d5 (diff)
downloadexternal_llvm-ddd8c450ece6a3c637441992852193a6c5b2fed6.zip
external_llvm-ddd8c450ece6a3c637441992852193a6c5b2fed6.tar.gz
external_llvm-ddd8c450ece6a3c637441992852193a6c5b2fed6.tar.bz2
If a function only reads memory, then we know that...
it only reads memory! The other change has no functional effect, it just seems more logical to go in order of decreasing knowledge. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r--lib/Analysis/AliasAnalysis.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp
index 369f2f4..67b2faa 100644
--- a/lib/Analysis/AliasAnalysis.cpp
+++ b/lib/Analysis/AliasAnalysis.cpp
@@ -120,9 +120,13 @@ AliasAnalysis::getModRefBehavior(CallSite CS,
AliasAnalysis::ModRefBehavior
AliasAnalysis::getModRefBehavior(Function *F,
std::vector<PointerAccessInfo> *Info) {
- if (F && F->doesNotAccessMemory())
- // Can't do better than this.
- return DoesNotAccessMemory;
+ if (F) {
+ if (F->doesNotAccessMemory())
+ // Can't do better than this.
+ return DoesNotAccessMemory;
+ else if (F->onlyReadsMemory())
+ return OnlyReadsMemory;
+ }
return UnknownModRefBehavior;
}
@@ -130,10 +134,10 @@ AliasAnalysis::ModRefResult
AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
ModRefResult Mask = ModRef;
ModRefBehavior MRB = getModRefBehavior(CS);
- if (MRB == OnlyReadsMemory)
- Mask = Ref;
- else if (MRB == DoesNotAccessMemory)
+ if (MRB == DoesNotAccessMemory)
return NoModRef;
+ else if (MRB == OnlyReadsMemory)
+ Mask = Ref;
else if (MRB == AliasAnalysis::AccessesArguments) {
bool doesAlias = false;
for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end();
@@ -142,7 +146,7 @@ AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
doesAlias = true;
break;
}
-
+
if (!doesAlias)
return NoModRef;
}