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