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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: Suboptimal div / rem for 128-bits int by constant lowering
        </td>
    </tr>

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

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

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

<pre>
    For most constant divisors, the 128-bit type is generated a libcall instead of using magic constant + inlined mul_high_128 as GCC does.

Let's take `(__uint128_t)x / 19` for instance:

```c++
uint64_t div_by_19(__uint128_t x) {
    return x / 19;
}
```

clang (trunk):

```asm
div_by_19(unsigned __int128):
 push    rax
        mov     edx, 19
        xor     ecx, ecx
 call    __udivti3@PLT
        pop     rcx
        ret
```

Expected / GCC (trunk):

```asm
div_by_19(unsigned __int128):
        movabs  rcx, 18014398509481983
        mov     r8, rdi
        mov     rax, r8
 and     rdi, rcx
        shrd    rax, rsi, 54
        shr     rsi, 44
 and     rax, rcx
        add     rdi, rax
        movabs  rax, -2912643801112034465
        add     rsi, rdi
        mul     rsi
 shr     rdx, 4
        lea     rax, [rdx+rdx*8]
        lea     rax, [rdx+rax*2]
        sub     rsi, rax
        movabs  rax, -8737931403336103397
        sub     r8, rsi
        imul    rax, r8
 ret
```

Link to more examples: https://godbolt.org/z/qhM6975b4
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVE1v4zYQ_TXUZZCAH_qgDjooSb2XBCjQ3gVKpCU2FOmSVNbeX19QcmM7axQ9rCGYNt_Mm_c41IgQ9GiValDxhIqXTCxxcr55E8dvXqhT1jt5anbOw-xChMHZEIWNIPWHDs4HRJ8hTgoI5Q-9jhBPBwU6wKis8iIqCQKM7gdhDGgbohIS3B6WoO0Isxj1cOFE9Am0NdoqCfNiukmPU0coBxHg2_MzSKfCI8Itwu2riohWAaJ4V4BKjCjvukXbSCjvIqL1ERDdAalRiWHv_Fpb2EEh1m4MKWl9BkSf0oPblF_m3Wqu608dqW9p4YhoDahKsQAAXsXFW_gsxRKAqpdr9q3YYIQdAVEe_WLfEa1_liHCjHB7XXmxa2ckdN2m4DMPDkuYVgXieNaSPrP7WFclj6ktpL7Cjs5v2LBiacEtrG0BgK5bpP6ImqEc__7651XewR3W1Q_XlbyKP5v87XhQQ-p4Oo7Ur1_n92JQ9GETkwxyTHJW8wLXOSc1Z3fOwvMU6aW-h4mVxvOECSu3TanXzRu_YfLyOiOsMUV-G7Llb1ie35Ce825Ihbyt-LWXm9Ut84HWhJY545gQQjHL87K4R7UV_2J3MZ8gbi9Ct1ty7cEocS0XFU9r0PbdclS8_J_g9L-lt8Fh6W8E_qdXXrGqZiTHjLGSYMbq6h4V_7cVF0yfvd509u5lfdX2HaKD2XkF6ijmg1EBsRamGA_pB6I7RHejk70z8dH5EdHdD0R3f09vZV0VfZ7Jhsma1SJTDanyoip4UbFsavC-LwQloi7YHve1JHwoa4IlK4tKFnif6YZiWuCcVoQWJWGPeJB84BXFe84qUXGUYzULbR6N-ZhT7UyHsKiGsKogeWZEr0xYBzalVn2HFUU0nXnmm5T00C9jQDk2OsRwoYk6GtW86RCUBHeIetY_RNTOJud_LP26JUwagOtb7NW8Ts_zdA-gbYT-dBnZxn1XXtsxW7xpvhydjtPSPw5uRnSXFJyXh4N3f6khIrpbdQdEd2djHw39JwAA__8McNfV">