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

    <tr>
        <th>Summary</th>
        <td>
            `va_arg()` code is suboptimal for AArch64 and x86-64
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            backend:X86,
            missed-optimization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

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

<pre>
    https://godbolt.org/z/hE6Maszq1

```c
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>

uint32_t get_u32(size_t count, ...) {
    uint32_t ret = 0;
    va_list args;
    va_start(args, count);
    ret = va_arg(args, uint32_t);
 va_end(args);
    
    return ret;
}
```

This simple function to get the first variadic argument to a function compiles to way more instructions for AArch64 and x86-64 under Clang than GCC. Clang generates slightly fewer instructions for RISCV than GCC does though
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8U11v6ygQ_TX4ZRQLg7_y4IfUaVar1b7srlb7FmFDbLYYcmFIb_Prr0jTtOlVr2SB4JyZ4zkziBD0ZJXqSPVAqm0mIs7Od38sSjxpmw1OvnQz4jEQviFsR9hucnJwBnPnJ8J2Z8J282P9pwjnbwWhW0I317Wmr994PTOu7WiiVEB4H1AKP-Uz4Y9fwFIdfgVrix_hyxq1Rc72CJPCfeSMsDbos9ojjC5aJKyHPM8JWwNpHl5DAABuYV4hEL4FSvgH-CT2RgcE4afwGQgoPBLWXjDWv-ms73hvaU9iL5JnN_ab8F3ASeyVlTfWfaq7pNHbtN0IpNl-sv6jOf_MOkDQy9EoOEQ7onYW0CWvAGcFB-0Dwkl4LaQeU7VxURYTRbwHjG45aqNCun4WL7A4r0DbgD5eCAEOzsNm48e5LkFYCd_belWXEK1UHnoj7AQ4Cwu_9X1-PU_KKi9QBQhGTzOaFzioZ-V_TvzX73_3_97iQbr0J7OL05zJjss1X4tMdUVTFGXbFFWVzV01DLwu2vIwimbkTV00tC6ZYLxsyvFQqEx3jLKSclazglZVlQ9UUl42sqCyWdNGkpKqRWiTG3Na0thnOoSourZueJsZMSgTLs-HsUGMT6l7fHO1gDBGWH-H_NfWt9tFh6Dkyh1RL_osUqEJq7aZ75LaaohTICVNAxje9VGjUR2p6W2k0qDUFEYnFaQ-x-GSU5gv-pFFbz6_a41zHPLRLYTtktR1Wx29-1-NSNjuUncgbHcp_UcAAAD___v2Sgc">