} else {
return true; // Argument of an unknown call.
}
+ // If the Callee is not ReadNone, it may read the global,
+ // and if it is not ReadOnly, it may also write to it.
+ Function *CalleeF = CS.getCalledFunction();
+ if (!CalleeF->doesNotAccessMemory()) {
+ if (Readers)
+ Readers->insert(CalleeF);
+ if (Writers && !CalleeF->onlyReadsMemory())
+ Writers->insert(CalleeF);
+ }
}
} else if (ICmpInst *ICI = dyn_cast<ICmpInst>(I)) {
if (!isa<ConstantPointerNull>(ICI->getOperand(1)))
if (F->isDeclaration()) {
// Try to get mod/ref behaviour from function attributes.
- if (F->doesNotAccessMemory()) {
+ if (F->doesNotAccessMemory() || F->onlyAccessesInaccessibleMemory()) {
// Can't do better than that!
} else if (F->onlyReadsMemory()) {
FI.addModRefInfo(MRI_Ref);
// This function might call back into the module and read a global -
// consider every global as possibly being read by this function.
FI.setMayReadAnyGlobal();
+ } else if (F->onlyAccessesArgMemory() ||
+ F->onlyAccessesInaccessibleMemOrArgMem()) {
+ // This function may only access (read/write) memory pointed to by its
+ // arguments. If this pointer is to a global, this escaping use of the
+ // pointer is captured in AnalyzeUsesOfPointer().
+ FI.addModRefInfo(MRI_ModRef);
} else {
FI.addModRefInfo(MRI_ModRef);
// Can't say anything useful unless it's an intrinsic - they don't