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

    <tr>
        <th>Summary</th>
        <td>
            `lea` with following `sub` of same register should be optimized into `mov`
        </td>
    </tr>

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

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

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

<pre>
    With the following Rust (1.80.0) code on Godbolt:
```rs
#[no_mangle]
pub fn example(start: usize, test: u8) -> usize {
    let mut new = start;
    no_inline();
    new += 1;
    if test >= 0b11000000 {
        no_inline();
        new += 1;
        if test >= 0b11100000 {
            no_inline();
 new += 1;
            if test >= 0b11110000 {
 no_inline();
                new += 1;
            }
        }
 }
    new - start
}

#[inline(never)]
fn no_inline() {}
```
the following assembly is produced:
```asm
example:
 cmp     sil, -65
        jbe     .LBB1_1
        cmp     sil, -32
        jb      .LBB1_4
        cmp     sil, -16
        mov rax, rdi
        sbb     rax, -1
        add     rax, 3
        sub rax, rdi
        ret
.LBB1_1:
        lea     rax, [rdi + 1]
 sub     rax, rdi
        ret
.LBB1_4:
        lea     rax, [rdi + 2]
        sub     rax, rdi
        ret
```

To me it seems very unnecessary to have those separate `lea` and `sub` instructions which take up 7 bytes in the machine code, they could be replaced with `mov al, 1/2`, which only takes up 2 bytes. Also I'm not 100% sure, but probably the `mov rax, rdi` and `sub rax, rdi` in the first block could be removed and the `sbb` turned into a different instruction.

For context, this happened to me while working on optimizing UTF-8 reading using `String::chars().next()` and reading the length using `chars.as_str()` and pointer arithmetic.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVsGOozgQ_RrnUgoyJiHJgUNnerJaaU-7s9pjy0AleMbYyGWSznz9yoZ0IKvunkURyH5UvXquRymSSJ0MYsHWe7Z-XsjeN9YVpZZ9i4pQ8EVp62vxj_IN-AbhaLW2F2VO8GdPHpjYpsmWJ5yJHVS2RrAGfrN1abVn2RPjz4w_sZwPP0fjhsjYem_sSyvNSSNbPw_7XV_C0QC-yrbTyMSWvHQhD_SkfiITX8AjDRvbwLhk2dcBA7bZD0kAADR6aHsPBi_AsmcY80zeMPZFGa1MYGFiN8dClNiHwHQGqGPkB5Z9DSAv05THa87-Wf4POd7hSd_h-ZDrQ5L3iNIHos-U_JKicLHN83zzvjGDQqLl2LLBLjd06p63mgye0YXCbi46mseao5q3JDc3Dsu5qSURtqW-giLonK37Cuv_-lhSO-zcnHp7A6q2i9JI6eDWZb6eS_5eYnwmf-z36Us6Bx-DM_EYDJPg1cfBaT7HW3sGJ18D5mo1x6gcMo_48qEuWddTOHsI7st3EzscW3jT-3ZQ46VRTlOz9d7VKtgI0rd-RobJS5-xrP4Hi7izTOT8EtmDj4b7NwstgvJAiC3BGd0VemOwQiLpruAtNPKM4BtLCISddNIjsJxrlCznIE0dVtSXYaUMeddXXllDcGlU1YCXPxD6DjZQXj0SKBPnciurRhmMMzjOyQavUNle11AiOOy0rLCGS5jjLOfBDTIaJWXiIIIK8WVksEZfIw0FHjHwJPCkycLvTGxaMNZDyjkTa6DeRb6y9-GDKWX4eEJBI8nkGGfqHoBRxVE58lBqW_2YFt_aM9YxeMxMZTwe3zuDNSjjLUio1fGIDo2fHlsy7c7BOqis8fjqhzNSBI3sOgxZfGzdpVEa4WLdjzAOrAHbedWqn2H197fDcgsOZR1WPYU7y_lf3ilzCqbLnqpGOhqGTmIiTZyZo_RbaFCh0Zx8c88SIxNJL-TdPKqzynh0IJ3yTYteVcmiLrJ6l-3kAot0I9a54CuRL5oir7a73bZKeS7y1aqs1-kqrapjXUm5KmUlFqoQXKz4judh0Is8OSLf1DuxSzOsdqsS2YpjK5VOtD63iXWnhSLqsUj5Zp1nCy1L1BT_LggRJnVEmQgf0sIVIWhZ9idiK64Vebqn8cprLO5Oj1a8T9676e0RSLah7ydFQTg1NyuMzbj1fPAYy_mid7povO8otEEcmDiclG_6Mqlsy8QhFDE-lp2z37HyTBxi6cTEYdR2LsS_AQAA___tfIxX">