[LLVMdev] How to decide whether a function is executed or not
Peter Collingbourne
peter at pcc.me.uk
Thu May 22 14:06:35 PDT 2014
You might want to look at this paper:
http://www.doc.ic.ac.uk/~afd/homepages/papers/pdfs/2013/ESOP.pdf
It defines a notion of barrier divergence and lays out a scheme for showing
that a program is free from it. There is also an implementation that uses
a theorem prover to show barrier divergence freedom (among other things).
Peter
On Fri, May 23, 2014 at 03:01:21AM +0800, lyh.kernel wrote:
> Hello all (sorry for the long post),
>
> Sorry for the misleading of the previous mail. In fact what I want to
> implement is a uniformness checking pass of OpenCL barrier. Here is the
> description of barrier function:
>
> * All work-items in a work-group executing the kernel on a processor must
> execute this function before any are allowed to continue execution beyond
> the barrier. This function must be encountered by all work-items in a
> work-group executing the kernel. *
>
> * If barrier is inside a conditional statement, then all work-items must
> enter the conditional if any work-item enters the conditional statement and
> executes the barrier. If barrier is inside a loop, all work-items must
> execute the barrier for each iteration of the loop before any are allowed
> to continue execution beyond the barrier. *
>
> So if we have the following SPIR:
>
> entry:
> %tid = tail call i32 @get_global_id(i32 0)
> %cmp = icmp sgt i32 %tid, 25
> br i1 %cmp, label %if, label %exit
>
> if:
> ...
> tail call void @barrier(i32 3)
> ...
> br label %exit
>
> exit:
> ret void
>
> The barrier call is thread dependent and violate uniformness. However if we
> have another SPIR:
>
> entry:
> %tid = tail call i32 @get_global_id(i32 0)
> %cmp = icmp sgt i32 %tid, 25
> br i1 %cmp, label %if, label %else
>
> if:
> ...
> tail call void @barrier(i32 3)
> ...
> br label %exit
>
> else:
> ...
> tail call void @barrier(i32 3)
> ...
> br label %exit
>
> exit:
> ret void
>
> The barrier function would be executed regardless of the value returned by
> get_global_id so it is thread independent.
>
> I have implement a LLVM pass to detect control dependency between "tail
> call void @barrier(i32 3)" and "%tid = tail call i32 @get_global_id(i32
> 0)". But the pass is unuseful for the second example.
>
> Any suggestion and keyword is welcomed and appreciated :)
>
>
>
> 2014-05-20 23:26 GMT+08:00 Renato Golin <renato.golin at linaro.org>:
>
> > On 20 May 2014 16:08, RICHARD STUCKEY <richard.stuckey at virgin.net> wrote:
> > > Consider a function which contains an infinite loop: any algorithm which
> > > could determine whether that function is called or not would effectively
> > be
> > > an algorithm that could determine whether the program containing that
> > > function halts or not. Equally, deciding whether the function contains
> > an
> > > infinite loop or not is itself an instance of the Halting Problem.
> >
> > A more conservative approach, bailing out on any loops or
> > complication, would scan the BB flow graph in between any two nodes
> > (between fully dominating / fully dominated) would return { no, maybe,
> > yes }. I'd guess that it'd return maybe much more often that yes/no
> > for the interesting cases, limiting the possibilities of this
> > approach.
> >
> > Do you have a concrete use in mind? DCE for the "no" cases? Hoisting
> > for the "yes" cases? Wouldn't you have to track the arguments as well?
> > That can quickly get out of hand...
> >
> > cheers,
> > --renato
> >
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
--
Peter
More information about the llvm-dev
mailing list