summaryrefslogtreecommitdiff
path: root/lib/Analysis
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2008-12-19 06:39:12 +0000
committerNick Lewycky <nicholas@mxc.ca>2008-12-19 06:39:12 +0000
commitf23d0d392ab47e191e1bbd17dc7487b9d461485c (patch)
treef7b614552c1261a2700e9e1ae056dab091dfffa3 /lib/Analysis
parentbebbded574f3be2756ac04746b982bdfb90cb7c4 (diff)
downloadllvm-f23d0d392ab47e191e1bbd17dc7487b9d461485c.tar.gz
llvm-f23d0d392ab47e191e1bbd17dc7487b9d461485c.tar.bz2
llvm-f23d0d392ab47e191e1bbd17dc7487b9d461485c.tar.xz
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')
-rw-r--r--lib/Analysis/BasicAliasAnalysis.cpp23
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;
}