<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/84094>84094</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [FMV] Provide some way to explicitly refer to a specific version of a function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            labrinea,
            ilinpv
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          jroelofs
      </td>
    </tr>
</table>

<pre>
    Contrived example: https://clang.godbolt.org/z/WqMYbhrfv

```
#include <stddef.h>

__attribute__((target_version("simd")))
void saxpy(float *&Y, float A, const float *&X, size_t &elts);

__attribute__((target_version("default")))
void saxpy(float *&Y, float A, const float *&X, size_t &elts);

void saxpy_scalar(float *&Y, float A, const float *&X, size_t &elts) asm("_Z5saxpyRPffRPKfRm.default");

__attribute__((target_version("simd")))
void saxpy(float *&Y, float A, const float *&X, size_t &elts) {
    while ((elts -= 4) > 3) {
        *Y++ += A * *X++;
        *Y++ += A * *X++;
        *Y++ += A * *X++;
        *Y++ += A * *X++;  
 }

    // It would be nice to have syntax here to refer to
    // a specific version, without using `asm()` and thus
    // having to know the mangled name.
    saxpy_scalar(Y, A, X, elts);
}

__attribute__((target_version("default")))
void saxpy(float *&Y, float A, const float *&X, size_t &elts) {
    while (elts--) {
        *Y++ += A * *X++;
    }
}

void caller(float *Y, float A, const float *X, size_t elts) { saxpy(Y, A, X, elts); }
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVU2P2zgP_jX0hUjg0B9JDj5kkgZ48aLAYA67nb0EskXb6spS1pKdSX_9Qk46k-xssUBRFA2UKKJImg_50BTOqcYwF5A9AJEWZa8MCyAC2gKR0socx3DMdpEYfGv74nNvWdvaRaWV52Jrje_VyBL5RXRHzZBssPX-6CDZAO2B9pUWppk3VpZW-7ntG6D9F6D97399fC7bvh4h3kG8uf7m8XVdjpQoU-lBMkKydV5KructJB9ubQ4H4X2vysHz4QC0Alp50TfsDyP3TlkzycipTk7I1tc1GY9WSXTi5XgGWtXaCo9AG6D8GWiLF8Em_K2scR5vNT4FsVNf-BAkOWvvgtvk4TuCk1yLQfufH9-b_4OrhBb9D3oMCtddoB3-yCb_T491_fT4__qpm9-j_a6E_aRqIiyv0SEinlqlGS9BBQWcQbLDdNJLPmDyziB8gDbPQA9ADxi2ZIebIAvfTxf5awZ-QRPEqxEsd7dlujgI_Y3_83iyg5ZYMhpVMXqLrRgZ3dl48YIt95Os55p79PadA4HuyJWqVYWvNd7iSfnWDh4Hp0yDkMdfGbWGPEZhJPp2cO-ctWIM-t7in8ae0LeMnTCNZolGdDx_M_gH6yeKTOSYqPCuXe7x_3J9_Q2mhtvZ7EcQ8y0B95mYkFRCa757d_wHjlsQNwheU_LNatzE8XVWRLJI5DpZi4iLxTJe5yuKkyxqC67TRSXzlIhoLfMyqctFmsWyyhZZFstVpAqKKY2TOKMkjZNsHgteLddMXHJV5oslpDF3Qum51mMXhleknBu4WKXxOo20KFm76_Q0fMLp8jov-yLYzMqhcZDGWjnv3rx45fU0dvcff4Nsh4-9HZVkdLZjPIlz4C-_HLWqlNfn19b5l1ZBW6PAejCVV9ZEQ6-L-_nbKN8O5byyHdA-BHDdZsfefubKA-2nsB3QfoL1dwAAAP__OLBMZg">