[LLVMdev] How to decide whether a function is executed or not

lyh.kernel lyh.kernel at gmail.com
Thu May 22 12:01:21 PDT 2014


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140523/6c0e3317/attachment.html>


More information about the llvm-dev mailing list