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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Failure to CSE `add` with commuted `adds`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/zxfEn17d8

The code for `u32::checked_add()` produces two `add`s on AArch64:
```rust

pub fn checked_add(x: u32, y: u32) -> Option<u32> {
 x.checked_add(y)
}
```
```asm
example::checked_add::h2758207837cc4075:
 cmn     w0, w1
        add     w1, w1, w0
        cset    w8, lo
 mov     w0, w8
        ret
```

`cmn` is an alias for `adds wzr, w0, w1`. And since `add` is commutative, it should be CSE'd with the next instruction, to give:
```asm
example::checked_add::h2758207837cc4075:
 adds    w1, w1, w0
        cset    w8, lo
        mov     w0, w8
 ret
```

The same issue does not occur on x86_64 or RISC-V
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVE9vwjYU_zTO5QnkvCQOHHJIKUjTDpPWadfKsR_Ea2Ij2wHaTz85wEq7XqZZkDh-_9_v9yxDMAdL1LDqiVXPmZxi73zz60jyzdisc_q96WM8Bla0DHcMdwenOzfEpfMHhruP9L_stzav9YrxlvH2j55AOU2wdx6Y4FOBybhoVU_qjfSr1JrhiuGaCQ5H7_SkKEA8u6SdhIIHcBba1qtelMmYt0zw689PIV4DHacO9ha-ur2wooUUEjfw_s9-DQtWbOG3YzTOsmIz57QFVj8x3sJl-dXHe8qNt6x-fgz8uJdhZLylixyPA_27uvmgx7paIa9XRa1UyevqWgio0UJaZ55yPOfp7Lak1ldRfhOlJ39QUIHirLBKosEl0ehOj_5WD-qe4vcK5k812tR7E0BakIOR4Q6W1DrA-cPfIl-zEHwJrdUQjFX0CVKyV24cpyijOVFSNhFC76ZBQ0ewedkyrDWcTewh9gSWLhGMDdFPagYCNxAdHJLxV5D_T3_nEv5rE2_rp17-2MRE8iBHAhPCRKAdBbAuglNq8om8l5V4FSU4D7__8rJZ_JnpptDrYi0zavK6EKKsqzLP-mYt94oqvq_UvqpkUaJWlaB8v-7KAtdImWmQY8XzHDnyqsyXuiDMJYmqrLWohGAlp1GaYTkMpzHNZTYn1eSIAstskB0NYR5wxE6qN7Kpg_fpwjQqDHE0IZBeuGM0o_mQV3ww3Qm-SY4X3XQIrOSDCTF8hoomDvPtcfdXPcNOmmHylLDdvGwfCDMz4UoZ0ne6McGzyQ_frxkT-6lbKjcy3KVot9fi6N1fpCLD3VxlYLi7FXpq8O8AAAD__0T7YTI">