diff options
author | Dan Gohman <gohman@apple.com> | 2009-12-08 23:59:12 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-12-08 23:59:12 +0000 |
commit | 8456d60becd2b502e3d6ebf124ea324ec5d1c108 (patch) | |
tree | 3a261d0cd0079ef49ed826805492c98423c9813e | |
parent | 43678f41a37c077f28517c2e4889cca88cada6ce (diff) | |
download | external_llvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.zip external_llvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.tar.gz external_llvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.tar.bz2 |
Put a threshold on the number of users PointerMayBeCaptured
examines; fall back to a conservative answer if there are
more. This works around some several compile time problems
resulting from BasicAliasAnalysis calling PointerMayBeCaptured.
The value has been chosen arbitrarily.
This fixes rdar://7438917 and may partially address PR5708.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90905 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/CaptureTracking.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Analysis/CaptureTracking.cpp b/lib/Analysis/CaptureTracking.cpp index a276c64..7a2f60b 100644 --- a/lib/Analysis/CaptureTracking.cpp +++ b/lib/Analysis/CaptureTracking.cpp @@ -25,6 +25,16 @@ #include "llvm/Support/CallSite.h" using namespace llvm; +/// As its comment mentions, PointerMayBeCaptured can be expensive. +/// However, it's not easy for BasicAA to cache the result, because +/// it's an ImmutablePass. To work around this, bound queries at a +/// fixed number of uses. +/// +/// TODO: Write a new FunctionPass AliasAnalysis so that it can keep +/// a cache. Then we can move the code from BasicAliasAnalysis into +/// that path, and remove this threshold. +static int const Threshold = 20; + /// PointerMayBeCaptured - Return true if this pointer value may be captured /// by the enclosing function (which is required to exist). This routine can /// be expensive, so consider caching the results. The boolean ReturnCaptures @@ -37,12 +47,18 @@ bool llvm::PointerMayBeCaptured(const Value *V, assert(isa<PointerType>(V->getType()) && "Capture is for pointers only!"); SmallVector<Use*, 16> Worklist; SmallSet<Use*, 16> Visited; + int Count = 0; for (Value::use_const_iterator UI = V->use_begin(), UE = V->use_end(); UI != UE; ++UI) { Use *U = &UI.getUse(); Visited.insert(U); Worklist.push_back(U); + + // If there are lots of uses, conservativelty say that the value + // is captured to avoid taking too much compile time. + if (Count++ >= Threshold) + return true; } while (!Worklist.empty()) { |