Commit 4bc07c33 authored by Francesco Petrogalli's avatar Francesco Petrogalli
Browse files

[llvm][docs] LangRef for IR attribute `vector-function-abi-variant`.

Reviewers: jdoerfert, andwar, simoll, rengolin, hfinkel, xtian

Reviewed By: jdoerfert

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D72798
parent d07a7895
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
@@ -1865,6 +1865,77 @@ example:
    function has not changed between the function prolog and eiplog. It is
    currently x86_64-specific.
Call Site Attributes
----------------------
In addition to function attributes the following call site only
attributes are supported:
``vector-function-abi-variant``
    This attribute can be attached to a :ref:`call <i_call>` to list
    the vector functions associated to the function. Notice that the
    attribute cannot be attached to a :ref:`invoke <i_invoke>` or a
    :ref:`callbr <i_callbr>` instruction. The attribute consists of a
    comma separated list of mangled names. The order of the list does
    not imply preference (it is logically a set). The compiler is free
    to pick any listed vector function of its choosing.
    The syntax for the mangled names is as follows:
        _ZGV<isa><mask><vlen><parameters>_<scalar_name>[(<vector_redirection>)]
    When present, the attribute informs the compiler that the function
    ``<scalar_name>`` has a corresponding vector variant that can be
    used to perform the concurrent invocation of ``<scalar_name>`` on
    vectors. The shape of the vector function is described by the
    tokens between the prefix ``_ZGV`` and the ``<scalar_name>``
    token. The standard name of the vector function is
    ``_ZGV<isa><mask><vlen><parameters>_<scalar_name>``. When present,
    the optional token ``(<vector_redirection>)`` informs the compiler
    that a custom name is provided in addition to the standard one
    (custom names can be provided for example via the use of ``declare
    variant`` in OpenMP 5.0). The declaration of the variant must be
    present in the IR Module. The signature of the vector variant is
    determined by the rules of the Vector Function ABI (VFABI)
    specifications of the target. For Arm and X86, the VFABI can be
    found at https://github.com/ARM-software/software-standards and
    https://software.intel.com/en-us/articles/vector-simd-function-abi,
    respectively.
    For X86 and Arm targets, the values of the tokens in the standard
    name are those that are defined in the VFABI. LLVM has an internal
    ``<isa>`` token that can be used to create scalar-to-vector
    mappings for functions that are not directly associated to any of
    the target ISAs (for example, some of the mappings stored in the
    TargetLibraryInfo). Valid values for the ``<isa>`` token are:
    <isa>:= b | c | d | e  -> X86 SSE, AVX, AVX2, AVX512
          | n | s          -> Armv8 Advanced SIMD, SVE
          | __LLVM__       -> Internal LLVM Vector ISA
    For all targets currently supported (x86, Arm and Internal LLVM),
    the remaining tokens can have the following values:
    <mask>:= M | N         -> mask | no mask
    <vlen>:= number        -> number of lanes
           | x             -> VLA (Vector Length Agnostic)
    <parameters>:= v              -> vector
                 | l | l <number> -> linear
                 | R | R <number> -> linear with ref modifier
                 | L | L <number> -> linear with val modifier
                 | U | U <number> -> linear with uval modifier
                 | ls <pos>       -> runtime linear
                 | Rs <pos>       -> runtime linear with ref modifier
                 | Ls <pos>       -> runtime linear with val modifier
                 | Us <pos>       -> runtime linear with uval modifier
                 | u              -> uniform
    <scalar_name>:= name of the scalar function
    <vector_redirection>:= optional, custom name of the vector function
.. _glattrs:
Global Attributes