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

    <tr>
        <th>Summary</th>
        <td>
            [clang] odd code generation for `bool` promotion
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    This C ([godbolt](https://godbolt.org/z/azaWPaxzz)):
```c
#include <stdbool.h>
int upcast(bool b) { return (b) ? 1 : 0; }
```
generates this x86_64 assembly:
```
upcast:
        mov     eax, edi
 ret
```
If `b` has any of bits 1-31 set, then `upcast` would yield incorrect results. Is this appropriate? Does/should `clang` guarantee that `b` doesn't have arbitrary high-order bits set? FWIW, `gcc` generates ([godbolt](https://godbolt.org/z/xh1nqozfj)) a more restrictive `movzx` into `dil`:
```
upcast:
        movzx   eax, dil
        ret
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycU02P6zYM_DX0hUggS5Y_Dj4kmxrYWw8F9ljIFmPrQbZSSc5L8usLOelusb0ULxAgRPRwhhxShWDGhagFeQR5ytQaJ-fboObB_RzJZ73T9_aPyQR8Q-A1yOPodO9sBHkCXk8xXgKIA_AOePcK7Z0fgXcP4J16qI_f1e3xAN6kIw7ADlCy5xnSHy7MMthVE4J4C1H3ztn9BOI3YAezRFwvgwoReJ0C2ANvEKojeoqrX5Km55PoMEcQB2QgjgjV6d9EwA4jLeRVpIAxVXOryz_LAlUINPf2_k0YsMOLdnvH12921-0mdQP-hqRNCnqK37DvZ4SS9VAynFRAtdzRnbE3MWC-EzkGigkfJ1rShy-qkuFPt1qNd0NWo1kG5z0NET2F1cawx_eXeHW5eHfxRkVKdZ8cBeBdmDZ06qtVy5jyjavyaolEGCcVP0VpR2EBXkWc1JVQ-d5Er_wdJzNOO-c1-afaJFR02H28fyTBULJxGLbEn938haG4Tfnyl3ucfzyHAhXOzlMqM3ozRHOlxDS76-OWuMwSXXrQxqb2_l-nHrcvpxL0K_hfwzLdCt2IRmXU5lVRs1xWgmVTKxXvz6Q4kw3Py6bJ66ZueN1XsmCVqvrMtJxxySQXuZRSsL2SvRzOpSoq2ZzFMEDBaFbG7q29zqkJmQlhpTYvcl6UmVU92bCtH-dP3zhPm-jbBNj16xigYNaEGL5SRBPttrNPhDyh0xoHp-kfZ4xb8Oz8ZrlzqXF48W52KZCt3rbfTDJxWvv94GbgXaJ5XbuLdz9oiMC7TXaas5fya8v_DgAA__-2P0ak">