<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJy9VduSmzAM_Rp48ZABE0jywMOm2f2B9j1jbAFuwU59yeXvKy65bnannc4s4wFbR5KPJCOXWpyKjbTcWwuCSEUE7FzTT4Js3Ti3s0H6EtA3HNYx_kvvwVStPsy47lD224N1UiuL80USJ6t4scQpVJXkEpSLzvqR7DqvIGJGuqYDJ3nUAVORVBGPeJBtArr8uu3oKog3Qfwyvn80QPTOyY61hGsBpNKGABqCuVUL8ngaw9JL5VK6dYTtayR_XQb0G7msStyLBIv1aEMIMeC8wezSJcNXPinQdS8ZhdnrJExfcZCkZ5uub5mQ6en0fvgCO_abgpX3OFPiDhcP-BHjHHA0fIbb5orfOxb3jh9xDPKW722q6N_nakoVKr3RIUXlZdZnKqDZRZzRPkuIXjO12HyerA-DRfy5IX8e7MWQHz_P0jv8XB4xpD_5ALVPUXGHfknptuVpe5AClFT_cuLJ7aGf7PL51qEeO9fv5rS_K-DDfze-ufatIN4CMdoxB8Q1Rvu6IZwZc8L-ZZ3xvO8VBMcxn5MS2wkoMQa9Ay5Z256I9dKxsgXCLLpAb7BrGYcOmwnRFcFdnwc-BjCGPQXTM0TJoZG8IYeBnwJsqijvtRK6RLU8Pu-EIjAdFq5nv8dGNdBwpx3MPuk65xKasXymvDlThpuzPHkwJuM6FEUqVumKhcy7RpvCK94Cs13oTVvc998aG6Avp8bbtvvzJ9oZ_RM4RvwmrcWGjJMszefLsCkordI8K3MByzzJFgxoSvOqBEox-vkqC1tWQmsLvFsCShUcyOAC53gDhP_PQBY0pjjiZZzROElmlUjTrKRZlTPGSxDBPIaOyXbW-5lpU4emGFyWvrYIttI6ewWZtbLGIg6EkaGTroXiuy_vrosaFBg2nLX-5vBqMMLqa3W5kPDk4C-EajWEA-liYPwHpfMppg>53648</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Suboptimal code generation for unsigned non-overflowing average
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
uncleasm
</td>
</tr>
</table>
<pre>
Discussed in depth in [https://stackoverflow.com/questions/71019078/efficient-overflow-immune-arithmetic-mean-in-c-c](https://stackoverflow.com/questions/71019078/efficient-overflow-immune-arithmetic-mean-in-c-c)
The optimal code for either
```
uint32_t avg(uint32_t a, uint32_t b) {
return (a & b) + ((a ^ b) >> 1);
mov eax, esi
and eax, edi
xor esi, edi
shr esi
add eax, esi
ret
uint32_t avg2(uint32_t a, uint32_t b) {
return a/2 + b/2 + (a%2 + b%2)/2;
}
mov eax, edi
shr eax
mov ecx, esi
shr ecx
add eax, ecx
and edi, 1
and esi, 1
add esi, edi
shr esi
add eax, esi
ret
uint32_t avg_by_widening(uint32_t a, uint32_t b) {
return ((uint64_t)a + b) >> 1;
}
```
could use rotate through carry instruction on x64 backend, especially suitable as the replacement of `avg_by_widening(uint64_t, uint64_t)`, which would need `uint128_t` as the intermediate variable type.
```
add rax, rbx
rcr rax, 1
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VcmSmzAQ_Rq4qHCBMBgfOIzjmR9I7i4hNaAEJEeLl79Ps3ibeKaSy7hUIPXrlrpfy49Ki3O5lZZ7a0EQqYiAvWuHSZBtWuf2NkhfAvqGwzrGf-kDmLrTxwXXPdp-e7BOamVxvkriZB2vCpxCXUsuQbno4h_JvvcKImaka3twkkc9MBVJFfGIB9k2oMXXHUfXQbwN4pfp-aMFovdO9qwjXAsgtTYEMBDMvVuQx_MYl14ql9KdI-zQYPK3ZUC_keuqwrNIsNpMMYQQA84bZJcWDB_57EA3g2UyZq-zMX3FQZIh23RznwmZf70-jG9gp-FQsPIRZ0o84OIdfsI6RxwDn-G2veGPG4vHjd_jWOR9vvdU0X_naqYKnd7oSFF1nQ1MBTS7mjM6sITojanV9nOyPiwW8eeB_Hmx10B--pylv_BLe8RIf_IBap-i4gH9ktbtqvPuKAUoqf7nxpP7Sz_H5cudQz926d_dbf-rge_-d9OTa98J4i0Qox1zQFxrtG9awpkxZ9Qv64zng1YQHKd8SSqUE1BiKnoPXLKuOxPrpWNVB4RZ3AJ3g33HOPQoJkTXBE99XvhUwFT2XMyQIVqOreQtOY75KUBRRfvgldAC3fL4chKawPTYuCH7AwrVmIY772HxiepcWmim9pnq7k4Zbi725F0wmdahKFOxTtcsdNJ1UH731YPwNaDAsJG1QQO9srJRWILS6iqtyAFeBnRrIPSmKx9Vu0HZ9NUs1113uLyivdE_gSNPb9JalHGcZGm-LMK2pKLmyzhhaQFiGWdFXEEaJ7lY8zTN11kWdqyCzpb4RQooVXAk4xY4x-9GKEsaUxxxEWc0TpJFLdI0q2hW54zxCkSwjKFnslsMeSy0aUJTjilVvrEIdtI6ewOZHYuG8Tjcn3nXalN6xTtgtg_Hs8sx9z8jpRRS">