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;
}
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();
doesAlias = true;
break;
}
-
+
if (!doesAlias)
return NoModRef;
}