<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/71306>71306</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: add+add instead of lea
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dvyukov
</td>
</tr>
</table>
<pre>
The code is:
```
void* alloc(long* base, long cl) {
long header = base[cl];
const long ptr_mask = ((1l << 56) - 1);
if ((header & ptr_mask) == 0)
return slowmalloc();
void* ptr = (void*)(header & ptr_mask);
void* next = *(void**)ptr;
base[cl] = (long)next | (header & ~ptr_mask) + (1l << 56);
return ptr;
}
```
clang 17.0.1 produces the following x86 code:
```
movabs $0xffffffffffffff,%rcx
...
add %rdx,%rcx
inc %rcx
```
The add+inc sequence could be `lea 1(%rdx, %rcx), %rcx`, which is 1 instruction and 1 byte less.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0VM1yszgQfJrhMhVKSOZHBw7-Kd_2toe9bQlpbLSRkRcJx9nDPvtXwjix8yUuFzCip3t6NEiFYI8DUQvlBspdpqbY-7E1l_fp1V-yzpv39s-eUHtDaAOINbAdsDVUbPnP4cVbA3yNyjmvgTfOD8cUdyoQ8C2mGLUDLhHqzULB5LzckzI0IojdDV5utINyB-ITp_0Q4o3kHMe_Tyq8znjgDfCmcAhiC2KLZZUUXrAALh_z7WGB3rV49UE01yR2iY6ltHsOMDlSnMYBg_Nvp7uzL8x34-c43italhLwJ8HvGAa6xoVi_ciSiM5xfEx5bNNd9dZxeWOpt_is_f-TW77B39v2KLAYf5Ktd9_u_O2qnRqOWNQ5yws8j95MmgLGnvDgnfNvdjjitanmMfpphvDkL6oLCHzFroenH_At8HLU1wWZ5_nypIxBRExvzfUrzA4aHxe-LT1NtzIG-CbBA_070aDTwE_OYEcIFXOk0kg1Hyp31rTFH0HFUvDWW92jDVigHUIcJx2tH1ANBgvs3iOhoxDyzLTCSCFVRm1RSVlUsmlY1rdKCyXLmgpeSlZQyUnUnTRSCl2uSkmZbTnjoihYyWrRMJYzzrva1KtCqoaRFLBidFLW5c5dTrkfj5kNYaK2LgSrMqc6cmH-3DnvlH6lwYBY_9VUwHk6AcY25b100zHAijkbYvhkijY6av-wIZBBf472ZP9TySCI9dLFtCPJOSmD_oCOVDaNru1jPM_HB98D3x9t7Kcu1_4EfJ_Yl9vLefT_kI7A93PRAfh-rvtXAAAA__-zh1Lo">