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