clover: Link libclc before running any optimizations
authorTom Stellard <thomas.stellard@amd.com>
Mon, 16 Sep 2013 17:32:59 +0000 (10:32 -0700)
committerTom Stellard <thomas.stellard@amd.com>
Wed, 16 Oct 2013 16:39:15 +0000 (09:39 -0700)
commitde1de88dfc478db597726d88231c6c0a7f936121
treed6c680df0d7890b784f980e8256eaabc05724f9c
parent2273b04c6198d591c3dc5123c4d100da5bcc0e18
clover: Link libclc before running any optimizations

This is required in order for clang to correctly handle the OpenCL C
barrier() builtin which has the following restrictions acording to
the OpenCL 1.1 Specification:

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.

By linking before otimizations, we can replace calls to barrier() with
calls to a target specific intrinsic which has the noduplicate attribute
This attribute prevents clang from performing optimizations which could
violate the above rules.

This attribute must be applied to the call instruction that invokes
the function, so it is not enough to add this attribute the barrier()
declaration.

As a bonus this will probably speed up compile times since we will no
longer need to run link-time optimizations.
src/gallium/state_trackers/clover/llvm/invocation.cpp