[llvm-commits] [llvm] r90905 - /llvm/trunk/lib/Analysis/CaptureTracking.cpp
Chris Lattner
clattner at apple.com
Tue Dec 8 16:04:52 PST 2009
Ok, typo 'conservativelty' though. You might as well bump up the
'small' datastructures to 32 so that they are "really" unlikely to
have to resize as well.
-Chris
On Dec 8, 2009, at 3:59 PM, Dan Gohman wrote:
> Author: djg
> Date: Tue Dec 8 17:59:12 2009
> New Revision: 90905
>
> URL: http://llvm.org/viewvc/llvm-project?rev=90905&view=rev
> Log:
> 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.
>
> Modified:
> llvm/trunk/lib/Analysis/CaptureTracking.cpp
>
> Modified: llvm/trunk/lib/Analysis/CaptureTracking.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CaptureTracking.cpp?rev=90905&r1=90904&r2=90905&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Analysis/CaptureTracking.cpp (original)
> +++ llvm/trunk/lib/Analysis/CaptureTracking.cpp Tue Dec 8 17:59:12
> 2009
> @@ -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 @@
> 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()) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list