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

llvm-svn: 260318
This commit is contained in:
Justin Lebar 2016-02-09 23:03:17 +00:00
parent 9b656527f1
commit d5fb6957a9

View File

@ -1238,10 +1238,17 @@ example:
function call are also considered to be cold; and, thus, given low function call are also considered to be cold; and, thus, given low
weight. weight.
``convergent`` ``convergent``
This attribute indicates that the callee is dependent on a convergent In some parallel execution models, there exist operations that cannot be
thread execution pattern under certain parallel execution models. made control-dependent on any additional values. We call such operations
Transformations that are execution model agnostic may not make the execution ``convergent``, and mark them with this function attribute.
of a convergent operation control dependent on any additional values.
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`` ``inaccessiblememonly``
This attribute indicates that the function may only access memory that This attribute indicates that the function may only access memory that
is not accessible by the module being compiled. This is a weaker form is not accessible by the module being compiled. This is a weaker form