mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Vectorization documentation for loop hint pragmas and Rpass diagnostics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211924 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f983ac349b
commit
9487d2ad4c
@ -51,6 +51,89 @@ Users can control the unroll factor using the command line flag "-force-vector-u
|
||||
$ clang -mllvm -force-vector-unroll=2 ...
|
||||
$ opt -loop-vectorize -force-vector-unroll=2 ...
|
||||
|
||||
Pragma loop hint directives
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The ``#pragma clang loop`` directive allows loop vectorization hints to be
|
||||
specified for the subsequent for, while, do-while, or c++11 range-based for
|
||||
loop. The directive allows vectorization and interleaving to be enabled or
|
||||
disabled. Vector width as well as interleave count can also be manually
|
||||
specified. The following example explicitly enables vectorization and
|
||||
interleaving:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#pragma clang loop vectorize(enable) interleave(enable)
|
||||
while(...) {
|
||||
...
|
||||
}
|
||||
|
||||
The following example implicitly enables vectorization and interleaving by
|
||||
specifying a vector width and interleaving count:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#pragma clang loop vectorize_width(2) interleave_count(2)
|
||||
for(...) {
|
||||
...
|
||||
}
|
||||
|
||||
See the Clang
|
||||
`language extensions
|
||||
<http://clang.llvm.org/docs/LanguageExtensions.html#extensions-for-loop-hint-optimizations>`_
|
||||
for details.
|
||||
|
||||
Diagnostics
|
||||
-----------
|
||||
|
||||
Many loops cannot be vectorized including loops with complicated control flow,
|
||||
unvectorizable types, and unvectorizable calls. The loop vectorizer generates
|
||||
optimization remarks which can be queried using command line options to identify
|
||||
and diagnose loops that are skipped by the loop-vectorizer.
|
||||
|
||||
Optimization remarks are enabled using:
|
||||
|
||||
``-Rpass=loop-vectorize`` identifies loops that were successfully vectorized.
|
||||
|
||||
``-Rpass-missed=loop-vectorize`` identifies loops that failed vectorization and
|
||||
indicates if vectorization was specified.
|
||||
|
||||
``-Rpass-analysis=loop-vectorize`` identifies the statements that caused
|
||||
vectorization to fail.
|
||||
|
||||
Consider the following loop:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#pragma clang loop vectorize(enable)
|
||||
for (int i = 0; i < Length; i++) {
|
||||
switch(A[i]) {
|
||||
case 0: A[i] = i*2; break;
|
||||
case 1: A[i] = i; break;
|
||||
default: A[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
The command line ``-Rpass-missed=loop-vectorized`` prints the remark:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
no_switch.cpp:4:5: remark: loop not vectorized: vectorization is explicitly enabled [-Rpass-missed=loop-vectorize]
|
||||
|
||||
And the command line ``-Rpass-analysis=loop-vectorize`` indicates that the
|
||||
switch statement cannot be vectorized.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
no_switch.cpp:4:5: remark: loop not vectorized: loop contains a switch statement [-Rpass-analysis=loop-vectorize]
|
||||
switch(A[i]) {
|
||||
^
|
||||
|
||||
To ensure line and column numbers are produced include the command line options
|
||||
``-gline-tables-only`` and ``-gcolumn-info``. See the Clang `user manual
|
||||
<http://clang.llvm.org/docs/UsersManual.html#options-to-emit-optimization-reports>`_
|
||||
for details
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user