diff options
author | Dan Gohman <gohman@apple.com> | 2010-11-09 19:56:27 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-11-09 19:56:27 +0000 |
commit | de521556851ba48736786ce23488682e29376da8 (patch) | |
tree | 1c72c995d9a503a1bff1b641c444aa6866e0c7d8 /llvm/lib/Transforms/IPO/FunctionAttrs.cpp | |
parent | 7c1fddb531e7a816af7e75103766d3162e06c22d (diff) | |
download | bcm5719-llvm-de521556851ba48736786ce23488682e29376da8.tar.gz bcm5719-llvm-de521556851ba48736786ce23488682e29376da8.zip |
Teach FunctionAttrs about AccessesArgumentsReadonly.
llvm-svn: 118617
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionAttrs.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index a2173933efb..71671d6fe9a 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -152,6 +152,25 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) { } // Only reads and writes local memory. continue; + case AliasAnalysis::AccessesArgumentsReadonly: + // Check whether all pointer arguments point to local memory, and + // ignore calls that only access local memory. + for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); + CI != CE; ++CI) { + Value *Arg = *CI; + if (Arg->getType()->isPointerTy()) { + AliasAnalysis::Location Loc(Arg, + AliasAnalysis::UnknownSize, + I->getMetadata(LLVMContext::MD_tbaa)); + if (!AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) { + // Reads non-local memory. + ReadsMemory = true; + break; + } + } + } + // Only reads memory. + continue; default: // Otherwise, be conservative. break; |