<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">