diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2013-07-07 10:15:16 +0000 |
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2013-07-07 10:15:16 +0000 |
| commit | 37ade2b8015d86e73c62ab48a2ce5f0ce10de708 (patch) | |
| tree | 63e6197f1885f2eadfb4cac6041a0664b35e48b0 /lib | |
| parent | 6bd46a40e8258b4321a2c6f35a8c61b3fa22116c (diff) | |
| download | external_llvm-37ade2b8015d86e73c62ab48a2ce5f0ce10de708.zip external_llvm-37ade2b8015d86e73c62ab48a2ce5f0ce10de708.tar.gz external_llvm-37ade2b8015d86e73c62ab48a2ce5f0ce10de708.tar.bz2 | |
Eliminate trivial redundant loads across nocapture+readonly calls to uncaptured
pointer arguments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185776 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Analysis/AliasAnalysis.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 3454ce0..054930c 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -450,6 +450,7 @@ AliasAnalysis::callCapturesBefore(const Instruction *I, return AliasAnalysis::ModRef; unsigned ArgNo = 0; + AliasAnalysis::ModRefResult R = AliasAnalysis::NoModRef; for (ImmutableCallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); CI != CE; ++CI, ++ArgNo) { // Only look at the no-capture or byval pointer arguments. If this @@ -463,12 +464,18 @@ AliasAnalysis::callCapturesBefore(const Instruction *I, // is impossible to alias the pointer we're checking. If not, we have to // assume that the call could touch the pointer, even though it doesn't // escape. - if (!isNoAlias(AliasAnalysis::Location(*CI), - AliasAnalysis::Location(Object))) { - return AliasAnalysis::ModRef; + if (isNoAlias(AliasAnalysis::Location(*CI), + AliasAnalysis::Location(Object))) + continue; + if (CS.doesNotAccessMemory(ArgNo)) + continue; + if (CS.onlyReadsMemory(ArgNo)) { + R = AliasAnalysis::Ref; + continue; } + return AliasAnalysis::ModRef; } - return AliasAnalysis::NoModRef; + return R; } // AliasAnalysis destructor: DO NOT move this to the header file for |
