forked from OSchip/llvm-project
[docs] Update llvm.loop metadata documentation.
Loop metadata nodes do not adhere to the documented property: (a) LoopIDs are not unique: Any pass that duplicates IR will do it including its metadata (e.g. LoopVersioning) such that multiple loops are linked with the same LoopID. There is even a test case (Transforms/LoopUnroll/unroll-pragmas-disabled.ll) for multiple loops with the same LoopID. (b) LoopIDs are not persistent: Adding or removing an item from a LoopID can only be done by creating a new MDNode and assigning it to the loop's branch(es). Passes such as LoopUnroll (llvm.loop.unroll.disable) and LoopVectorize (llvm.loop.isvectorized) use this to mark loops to not be transformed multiple times or to avoid that a LoopVersioned original loop is transformed. Update the documentation according to how llvm.loop is used in practice. Differential Revision: https://reviews.llvm.org/D55290
This commit is contained in:
parent
2c2a297bb6
commit
322e7cfab5
|
@ -5718,33 +5718,34 @@ attribute on parameters and return values.
|
||||||
|
|
||||||
It is sometimes useful to attach information to loop constructs. Currently,
|
It is sometimes useful to attach information to loop constructs. Currently,
|
||||||
loop metadata is implemented as metadata attached to the branch instruction
|
loop metadata is implemented as metadata attached to the branch instruction
|
||||||
in the loop latch block. This type of metadata refer to a metadata node that is
|
in the loop latch block. The loop metadata node is a list of
|
||||||
guaranteed to be separate for each loop. The loop identifier metadata is
|
other metadata nodes, each representing a property of the loop. Usually,
|
||||||
specified with the name ``llvm.loop``.
|
the first item of the property node is a string. For example, the
|
||||||
|
``llvm.loop.unroll.count`` suggests an unroll factor to the loop
|
||||||
The loop identifier metadata is implemented using a metadata that refers to
|
unroller:
|
||||||
itself to avoid merging it with any other identifier metadata, e.g.,
|
|
||||||
during module linkage or function inlining. That is, each loop should refer
|
|
||||||
to their own identification metadata even if they reside in separate functions.
|
|
||||||
The following example contains loop identifier metadata for two separate loop
|
|
||||||
constructs:
|
|
||||||
|
|
||||||
.. code-block:: llvm
|
|
||||||
|
|
||||||
!0 = !{!0}
|
|
||||||
!1 = !{!1}
|
|
||||||
|
|
||||||
The loop identifier metadata can be used to specify additional
|
|
||||||
per-loop metadata. Any operands after the first operand can be treated
|
|
||||||
as user-defined metadata. For example the ``llvm.loop.unroll.count``
|
|
||||||
suggests an unroll factor to the loop unroller:
|
|
||||||
|
|
||||||
.. code-block:: llvm
|
.. code-block:: llvm
|
||||||
|
|
||||||
br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !0
|
br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !0
|
||||||
...
|
...
|
||||||
!0 = !{!0, !1}
|
!0 = !{!0, !1, !2}
|
||||||
!1 = !{!"llvm.loop.unroll.count", i32 4}
|
!1 = !{!"llvm.loop.unroll.enable"}
|
||||||
|
!2 = !{!"llvm.loop.unroll.count", i32 4}
|
||||||
|
|
||||||
|
For legacy reasons, the first item of a loop metadata node must be a
|
||||||
|
reference to itself. Before the advent of the 'distinct' keyword, this
|
||||||
|
forced the preservation of otherwise identical metadata nodes. Since
|
||||||
|
the loop-metadata node can be attached to multiple nodes, the 'distinct'
|
||||||
|
keyword has become unnecessary.
|
||||||
|
|
||||||
|
Prior to the property nodes, one or two ``DILocation`` (debug location)
|
||||||
|
nodes can be present in the list. The first, if present, identifies the
|
||||||
|
source-code location where the loop begins. The second, if present,
|
||||||
|
identifies the source-code location where the loop ends.
|
||||||
|
|
||||||
|
Loop metadata nodes cannot be used as unique identifiers. They are
|
||||||
|
neither persistent for the same loop through transformations nor
|
||||||
|
necessarily unique to just one loop.
|
||||||
|
|
||||||
'``llvm.loop.disable_nonforced``'
|
'``llvm.loop.disable_nonforced``'
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
Loading…
Reference in New Issue