diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -1865,6 +1865,77 @@ 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 ` to list + the vector functions associated to the function. Notice that the + attribute cannot be attached to a :ref:`invoke ` or a + :ref:`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_[()] + + When present, the attribute informs the compiler that the function + ```` has a corresponding vector variant that can be + used to perform the concurrent invocation of ```` on + vectors. The shape of the vector function is described by the + tokens between the prefix ``_ZGV`` and the ```` + token. The standard name of the vector function is + ``_ZGV_``. When present, + the optional token ``()`` 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 + ```` 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 ```` token are: + + := 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: + + := M | N -> mask | no mask + + := number -> number of lanes + | x -> VLA (Vector Length Agnostic) + + := v -> vector + | l | l -> linear + | R | R -> linear with ref modifier + | L | L -> linear with val modifier + | U | U -> linear with uval modifier + | ls -> runtime linear + | Rs -> runtime linear with ref modifier + | Ls -> runtime linear with val modifier + | Us -> runtime linear with uval modifier + | u -> uniform + + := name of the scalar function + + := optional, custom name of the vector function + .. _glattrs: Global Attributes