Update documentation about convergent attribute.

Summary:
Be more explicit about what 'convergent' means, and indicate that the
compiler may remove the attribute from a function if it can prove that
the function doesn't in fact execute any convergent ops.

Reviewers: resistor, jingyue, joker.eph

Subscribers: hfinkel, chandlerc, arsenm, jhen, tra, llvm-commits

Differential Revision: http://reviews.llvm.org/D17012

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Justin Lebar 2016-02-09 23:03:17 +00:00
parent 4162134c71
commit 96d6052072

View File

@ -1238,10 +1238,17 @@ example:
function call are also considered to be cold; and, thus, given low
weight.
``convergent``
This attribute indicates that the callee is dependent on a convergent
thread execution pattern under certain parallel execution models.
Transformations that are execution model agnostic may not make the execution
of a convergent operation control dependent on any additional values.
In some parallel execution models, there exist operations that cannot be
made control-dependent on any additional values. We call such operations
``convergent``, and mark them with this function attribute.
For example, the intrinsic ``llvm.cuda.syncthreads`` is ``convergent``, so
calls to this intrinsic cannot be made control-dependent on additional
values. Other functions may also be marked as convergent; this prevents
the same optimization on those functions.
The optimizer may remove the ``convergent`` attribute when it can prove
that the function does not execute any convergent operations.
``inaccessiblememonly``
This attribute indicates that the function may only access memory that
is not accessible by the module being compiled. This is a weaker form