diff options
author | Duncan Sands <baldrick@free.fr> | 2009-01-05 21:19:53 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2009-01-05 21:19:53 +0000 |
commit | 91c9c31033ff8166289bfee050b02bb6b586d510 (patch) | |
tree | 756b6aa3fa90ec7b412c81dbae935f360456fc90 /lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 7e66c0d43aefce78948f0b73422f6e5bb28e2077 (diff) |
When checking if an Argument escapes, check if
the argument is marked nocapture - no need to
analyze the argument if the answer is already
known!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61753 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | lib/Analysis/BasicAliasAnalysis.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 57d320971d..9608a28edd 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -35,10 +35,11 @@ using namespace llvm; // Useful predicates //===----------------------------------------------------------------------===// -// Determine if an AllocationInst instruction escapes from the function it is -// contained in. If it does not escape, there is no way for another function to -// mod/ref it. We do this by looking at its uses and determining if the uses -// can escape (recursively). +// Determine if a value escapes from the function it is contained in (being +// returned by the function does not count as escaping here). If a value local +// to the function does not escape, there is no way another function can mod/ref +// it. We do this by looking at its uses and determining if they can escape +// (recursively). static bool AddressMightEscape(const Value *V) { for (Value::use_const_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI) { @@ -161,12 +162,17 @@ static bool isNonEscapingLocalObject(const Value *V) { // If this is a local allocation, check to see if it escapes. if (isa<AllocationInst>(V) || isNoAliasCall(V)) return !AddressMightEscape(V); - + // If this is an argument that corresponds to a byval or noalias argument, - // it can't escape either. + // then it has not escaped before entering the function. Check if it escapes + // inside the function. if (const Argument *A = dyn_cast<Argument>(V)) - if (A->hasByValAttr() || A->hasNoAliasAttr()) + if (A->hasByValAttr() || A->hasNoAliasAttr()) { + // Don't bother analyzing arguments already known not to escape. + if (A->hasNoCaptureAttr()) + return true; return !AddressMightEscape(V); + } return false; } |