Index: docs/LangRef.rst =================================================================== --- docs/LangRef.rst +++ docs/LangRef.rst @@ -2889,17 +2889,97 @@ !0 = metadata !{ metadata !0 } !1 = metadata !{ metadata !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.vectorize.unroll`` metadata is understood -by the loop vectorizer to indicate how many times to unroll the loop: +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 br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !0 ... !0 = metadata !{ metadata !0, metadata !1 } - !1 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 2 } + !1 = metadata !{ metadata !"llvm.loop.vectorize.width", i32 4 } + +'``llvm.loop.vectorize``' +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Metadata prefixed with ``llvm.loop.vectorize`` is used to control +per-loop vectorization parameters such as vectorization width and +interleave count. ``llvm.loop.vectorize`` metadata should be used in +conjunction with ``llvm.loop`` loop identification metadata. The +``llvm.loop.vectorize`` metadata are only optimization hints and the +vectorizer will only vectorize loops if it believes it is valid to do +so. + +'``llvm.loop.vectorize.unroll``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This metadata suggests an interleave count to the loop vectorizer. +The first operand is the string ``llvm.loop.vectorize.unroll`` and the +second operand is an integer specifying the interleave count. For +example: + +.. code-block:: llvm + + !0 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 4 } + +Note that setting ``llvm.loop.vectorize.unroll`` to 1 disables +interleaving multiple iterations of the loop. If +``llvm.loop.vectorize.unroll`` is set to 0 then the interleave count +will be determined automatically. + +'``llvm.loop.vectorize.width``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This metadata sets the target width of the vectorizer. The first +operand is the string ``llvm.loop.vectorize.width`` and the second +operand is an integer specifying the width. For example: + +.. code-block:: llvm + + !0 = metadata !{ metadata !"llvm.loop.vectorize.width", i32 4 } + +Note that setting ``llvm.loop.vectorize.width`` to 1 disables +vectorization of the loop. If ``llvm.loop.vectorize.width`` is set to +0 or if the loop does not have this metadata the width will be +determined automatically. + +'``llvm.loop.unroll``' +^^^^^^^^^^^^^^^^^^^^^^ + +Metadata prefixed with ``llvm.loop.unroll`` are loop unrolling +optimization hints such as the unroll factor. ``llvm.loop.unroll`` +metadata should be used in conjunction with ``llvm.loop`` loop +identification metadata. The ``llvm.loop.unroll`` metadata are only +optimization hints and the unrolling will only be performed if the +optimizer believes it is valid to do so. + +'``llvm.loop.unroll.enable``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This metadata either disables loop unrolling or suggests that the loop +be unrolled fully. The first operand is the string +``llvm.loop.unroll.enable`` and the second operand is a bit. If the +bit operand value is 0 loop unrolling is disabled. A value of 1 +indicates that the loop should be fully unrolled. For example: + +.. code-block:: llvm + + !0 = metadata !{ metadata !"llvm.loop.unroll.enable", i1 0 } + !1 = metadata !{ metadata !"llvm.loop.unroll.enable", i1 1 } + +'``llvm.loop.unroll.count``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This metadata suggests an unroll factor to the loop unroller. The +first operand is the string ``llvm.loop.unroll.count`` and the second +operand is a positive integer specifying the unroll factor. For +example: + +.. code-block:: llvm + + !0 = metadata !{ metadata !"llvm.loop.unroll.count", i32 4 } '``llvm.mem``' ^^^^^^^^^^^^^^^ @@ -2984,55 +3064,6 @@ !1 = metadata !{ metadata !1 } ; an identifier for the inner loop !2 = metadata !{ metadata !2 } ; an identifier for the outer loop -'``llvm.loop.vectorize``' -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Metadata prefixed with ``llvm.loop.vectorize`` is used to control per-loop -vectorization parameters such as vectorization factor and unroll factor. - -``llvm.loop.vectorize`` metadata should be used in conjunction with -``llvm.loop`` loop identification metadata. - -'``llvm.loop.vectorize.unroll``' Metadata -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This metadata instructs the loop vectorizer to unroll the specified -loop exactly ``N`` times. - -The first operand is the string ``llvm.loop.vectorize.unroll`` and the second -operand is an integer specifying the unroll factor. For example: - -.. code-block:: llvm - - !0 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 4 } - -Note that setting ``llvm.loop.vectorize.unroll`` to 1 disables -unrolling of the loop. - -If ``llvm.loop.vectorize.unroll`` is set to 0 then the amount of -unrolling will be determined automatically. - -'``llvm.loop.vectorize.width``' Metadata -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This metadata sets the target width of the vectorizer to ``N``. Without -this metadata, the vectorizer will choose a width automatically. -Regardless of this metadata, the vectorizer will only vectorize loops if -it believes it is valid to do so. - -The first operand is the string ``llvm.loop.vectorize.width`` and the -second operand is an integer specifying the width. For example: - -.. code-block:: llvm - - !0 = metadata !{ metadata !"llvm.loop.vectorize.width", i32 4 } - -Note that setting ``llvm.loop.vectorize.width`` to 1 disables -vectorization of the loop. - -If ``llvm.loop.vectorize.width`` is set to 0 then the width will be -determined automatically. - Module Flags Metadata =====================