<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99390>99390</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] Redundant `cmp` not eliminated
</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/av7vTE7as
```c++
#include <cstdint>
#include <numeric>
typedef uint32_t u32;
u32 midpoint_u32(u32 a, u32 b) { return std::midpoint(a, b); }
```
Generated code:
```asm
_Z12midpoint_u32jj: // @_Z12midpoint_u32jj
cmp w0, w1
csel w8, w0, w1, lo
csel w9, w0, w1, hi
cmp w0, w1
sub w8, w9, w8
lsr w8, w8, #1
cneg w8, w8, hi
add w0, w8, w0
ret
```
The 2nd `cmp` is unnecessary: the flags register still contains the result of the first `cmp` instruction
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUlEtv6ywQhn_NeIMakcGXZOFFLs23-HZHXZ1NhWES02IccUnV_voj7EZNo-pIx0Ig8T68M4MBGYI5OaIWqi1U-0Km2I--_X8g-Wpc0Y36ve1jPAcQG8AD4OE06m60cTH6E-DhA_AgL83l6bGRAfge-AZqPjcFuM1tnkVhnLJJEwOxUyFq4yKIx59UlwbyRn2pUx_fz6TpyJJxUeBzZEkgiO0tkgSywejzaFx8zjKu8pQE3GWadYBrBs2WeYrJOxaiznWJzXUR4GqCMwhiy6DZ3xV1G-4_cuRlJM3UqCk7fWdlGOaZ599LvM3r5QXEhs37yaDkP-jTOvb5qeE8jW88J_e2vFMDWfa2mqQrgDtmxx-wbLK-J3vzL-FC6mZ1jji7rb4zNvhbZuoBxdVJOTrdy_dJSK1vk7iWNzOe4l_-y1NPDJ1m-QwOZ6g5M4El50hRCNK_582PPbGjlafAPJ1MiORZiMZapkYXpXFhIjyFZCMbjzNvfIi3ri5En1Q0oyt0K_RarGVB7bLBJVbLuuRF35aNqhpZE6_rqkElJNUCV1wvV3jsOuwK0yLHkjfTqgb5gnfVqim17MquEmrZQMlpkMYurL0M-doVJoRE7Xot1rywsiMbpuuL2En1Si6f6c3Gq74uARFwB4iDCYH0w3iOZjAfMqectWpf-Db7PnTpFKDk1oQYviJFE-30Nlz9qj37RTo5Ld3tTrgxMrJmMG66DkXy9v7ZMLFP3UKNA-Ah-38OD2c_vpCKgIeprAB4mCu7tPgnAAD__3RHTqM">