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