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

    <tr>
        <th>Summary</th>
        <td>
            Inefficient codegen for checking top bits of a 64-bit integer
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The code
```c
#include<stdint.h>
#include<stdbool.h>
void ext1(void);
void ext2(void);
static bool check(uint64_t x) {
 return (x>>48) == 0xfff7;
}
void f(uint64_t a, uint64_t b) {
    if (check(a)) ext1();
    ext2();
    if (check(b)) ext1();
}
```
compiles (x86-64, `-O3`; [compiler explorer](https://godbolt.org/z/dre88hevc)) to
```asm
f: # @f
        push    r15
        push    r14
 push    rbx
        mov     rbx, rsi
        movabs  r14, -281474976710656
        movabs  r15, -2533274790395904
        shr rdi, 48
        cmp     edi, 65527
        jne     .LBB0_2
 call    ext1@PLT
.LBB0_2:
        call    ext2@PLT
        and rbx, r14
        cmp     rbx, r15
        jne     .LBB0_3
 pop     rbx
        pop     r14
        pop     r15
        jmp ext1@PLT                        # TAILCALL
.LBB0_3:
        pop rbx
        pop     r14
        pop     r15
 ret
```

which uses `(x>>48)==0xfff7` for one `check` call, and `(x&0xffff000000000000) == 0xfff7000000000000` for the other. This ends up loading those large constants within the function prologue (which increases the prologue/epilogue even more due to pushing out non-volatile registers), but only uses them for one of the cases (meaning that those constants don't even need to be loaded during the prologue).

Simpler example, but without the prologue issue: [compiler explorer](https://godbolt.org/z/K7nb6KrGn)
```c
void f(uint64_t a, uint64_t b) {
    if (check(a) || check(b)) ext1();
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk2PozgT_jXOpZQIbD4PHPIxeTWalt6Vtu8jA0XwLNjINunM_PqVDUlIunsPs4uiGHgeVz1VZRfmxoiTRCxIvCPxYcVH2ypd1L-46PmqVPXP4rVFqFSNJDiQYEuSYPpV8zNlQlbdWCNhe2NrIe2mJezLx2ipVLeAz0rUgBcbEpq5e0JzwnaPGP0AM5ZbUYGzBlWL1V-EZqOQNom-W7gQmgNJZypotKOWQGh2cX7ZlyjzBHYg7ADBpWma9GaYpIeF92ZplhO6h9tT-egEAETjfFzVcCeX5tfgluIdeY7r-fWjjfJzGzedt3JMj5XqB9Gh8eFmyTqJnGqSBOv_M0diOyDxbmZpwMvQKY2axAdCs9bawRC2JfRI6PGk6lJ1dqP0idDjL0KPtcYsa_FczbqsetLATT-9aQjbAqEMSBQ09_DcNYymdaMO48-AaAZub8rLI7VXZ7gCdA_aiHc4L81kiu5hTbMwSqM8TdIwSOLkM3I8kWPGaBqlecDyOA-iR7ZpNehaOGaUPUJVP_gRJziJY5o-Mn5I9OPmZbcLvtMZrHjXzWsiJFHwx8vrBFxZbPvk586nS_4V57K-ZSaMPtZ4w-N_UsiuhVD3WY81uwLPfu7As4N-WAQKn1xu6bxuv77sty8vy2Swd8lwjv6NLI32w400_b-1omphNG5DJcFTC5k6yNxAkgAapUFJdMxpByeBr5VLtKvJ1QJN_JwmWFzvOtIDOBu3LYKyLeoNvLbCAMrawDhAp3gt5AlsqwxCx_XJNWxpLJfWwJuwrZB-cjPKygolYdCqU6cRXZuYYhSy0shdoI54xQk94iAmKp5RQq80Qj0iWOW3p3OrRgtSyfVZddyKDkHjSRiL2vg-sYdytKBk93NKpG2xv-VKNd5f5T0TmvXI5RQKt3M890hqJQlN7aREItZORYk-fqyhHvU0dak_3yzr-afoh6nvcXdzFedS5KJYTgVhzIi-j_12w_yWyjL5pv8nXSI-_Hr-F58ZIOmepHv4rc_Gqi5YnbOcr7AIkyyMsjyP41VbsIyVtM7jLMtjXmHSNBlLsKo5Y2mZlrgSBQ0oC6IwChNGWbxBVqZBlpSMB2WeNQ2JAuy56DZdd-5dVlY-pUVCwyhedbzEzvhjB6US3-Z8U-pOIbpwc9bleDIkCjphrLlbscJ2WHyV2DSiEiitP52cUPpV5bPg14EaoBTWuDXGIYnWpbAgpMUT6tWou-KpesK2Y7mpVE_o0fmah_Wg1Q-sLKFHr9AQevQR_B0AAP__APGTog">