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 | 2d27b191d9b7bd0962c7d167e00ccf416ff6b950 (patch) | |
| tree | b42f7d0ef6864c30b98c4b2dcbbddd0b11c14f6d | |
| parent | e19122ff01fc8a4d4a433750d0773ef03a33c1fb (diff) | |
| download | bcm5719-llvm-2d27b191d9b7bd0962c7d167e00ccf416ff6b950.tar.gz bcm5719-llvm-2d27b191d9b7bd0962c7d167e00ccf416ff6b950.zip | |
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.
llvm-svn: 90905
| -rw-r--r-- | llvm/lib/Analysis/CaptureTracking.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp index a276c64c9a4..7a2f60b5e9e 100644 --- a/llvm/lib/Analysis/CaptureTracking.cpp +++ b/llvm/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()) { |

