diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2008-12-19 06:39:12 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2008-12-19 06:39:12 +0000 |
commit | f23d0d392ab47e191e1bbd17dc7487b9d461485c (patch) | |
tree | f7b614552c1261a2700e9e1ae056dab091dfffa3 /lib/Analysis/BasicAliasAnalysis.cpp | |
parent | bebbded574f3be2756ac04746b982bdfb90cb7c4 (diff) |
Resubmit support for the 'nocapture' attribute.
The problematic part of this patch is that we were out of attribute bits,
requiring some fancy bit hacking to make it fit (by shrinking alignment)
without breaking existing users or the file format.
This change will require users to rebuild llvm-gcc to match llvm.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61239 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | lib/Analysis/BasicAliasAnalysis.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 3270f35ac4..57d320971d 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -63,12 +63,23 @@ static bool AddressMightEscape(const Value *V) { // callees could modify it. break; // next use case Instruction::Call: - // If the call is to a few known safe intrinsics, we know that it does - // not escape. - // TODO: Eventually just check the 'nocapture' attribute. - if (!isa<MemIntrinsic>(I)) - return true; - break; // next use + // If the argument to the call has the nocapture attribute, then the call + // may store or load to the pointer, but it cannot escape. + if (cast<CallInst>(I)->paramHasAttr(UI.getOperandNo(), + Attribute::NoCapture)) + continue; + + // FIXME: MemIntrinsics should have their operands marked nocapture! + if (isa<MemIntrinsic>(I)) + continue; // next use + return true; + case Instruction::Invoke: + // If the argument to the call has the nocapture attribute, then the call + // may store or load to the pointer, but it cannot escape. + if (cast<InvokeInst>(I)->paramHasAttr(UI.getOperandNo()-2, + Attribute::NoCapture)) + continue; + return true; default: return true; } |