summaryrefslogtreecommitdiff
path: root/lib/Analysis/CaptureTracking.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-12-08 23:59:12 +0000
committerDan Gohman <gohman@apple.com>2009-12-08 23:59:12 +0000
commit8456d60becd2b502e3d6ebf124ea324ec5d1c108 (patch)
tree3a261d0cd0079ef49ed826805492c98423c9813e /lib/Analysis/CaptureTracking.cpp
parent43678f41a37c077f28517c2e4889cca88cada6ce (diff)
downloadllvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.tar.gz
llvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.tar.bz2
llvm-8456d60becd2b502e3d6ebf124ea324ec5d1c108.tar.xz
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
Diffstat (limited to 'lib/Analysis/CaptureTracking.cpp')
-rw-r--r--lib/Analysis/CaptureTracking.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Analysis/CaptureTracking.cpp b/lib/Analysis/CaptureTracking.cpp
index a276c64c9a..7a2f60b5e9 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()) {