<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/143259>143259</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Failure to spot `scmp(x, 0)` idiom
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations,
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Kmeakin
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/1xqx65vds
For
```c
int signum(int x) {
if (x < 0) return -1;
if (x > 0) return +1;
return 0;
}
```
clang produces
```asm
signum:
cmp w0, #0
cset w8, ne
cmn w0, #1
csinv w0, w8, wzr, gt
ret
```
but GCC produces
```asm
signum:
cmp w0, 0
cset w0, ne
csinv w0, w0, wzr, ge
ret
```
It seems that LLVM is not recognising that `signum` is equivalent to `scmp(x, 0)`:
https://alive2.llvm.org/ce/z/EYQZwV
```llvm
define dso_local range(i32 -1, 2) i32 @src(i32 noundef %0) local_unnamed_addr #0 {
%2 = icmp ne i32 %0, 0
%3 = zext i1 %2 to i32
%4 = icmp sgt i32 %0, -1
%5 = select i1 %4, i32 %3, i32 -1
ret i32 %5
}
define dso_local range(i32 -1, 2) i32 @tgt(i32 noundef %0) local_unnamed_addr #0 {
%2 = tail call i32 @llvm.scmp(i32 %0, i32 0)
ret i32 %2
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVE2T4yYQ_TWtCzVTqPVh66CDxrNOpbI55LJVyWUKSW2ZBIEXkMfxr0-B5LG9Tg4Zl6sAvdfN6-aBcE4OmqiG4gWK10RMfm9s_ctI4i-pk9b0f9d77w8OsgZwC7gdTN8a5Z-NHQC3Z8Btevp-Kotj74A3wJutsWFS8vnfAW-k9izsM42A67A4AVYMVi_AG8YYkzsGuD4xyDaMB8iSn6xmTylkj5wvdxzAlwtr-cLnJaxeb3XM4jol9MAO1vRTR-4WF24E3iwqs2bZNfy68RDHdw64YYAZvwUd-QiuA6jpLk7fx6V3cVIfP8A5-v1swzD4G54l_1hFO3n202bziTrm7f61AP5YwL1GfquRloY_ivvZM0c0Oub3wrOvX7_9yqRj2nhmqTODlk7qYQah5IvQkgcSfZ_kUSjSnnkT0W48hFOfRWMVNok13XtSKHkkfFbqOC6-7Ggx55fff_vj_dutysAC3vS0k5pY78ybMp1QzAo9UPBnhsF4uGEYbBaWkHNnuwXTZtI9BTcW0Ycx-m3SWozUv4m-t9EjF3sDFsgge2Uy9F_TnDDGXg4CsMgi5Uwnz2Q6x3gTqBdCfs3hBn-X5Cm9kIpIcqSou-TJA2NhZ5f5EmHpI1FxvTD_uzV-8J9rzbU3XkjFOqHUJWc8yuX0b2sN82iEH_Tj44VP-jrrq6wSCdXpKq-wqsp8lezrkvdinaataKksd-tuR7TL12W_Xomqy1aYyBo5FrzkqxSznJfPgnKkqmp7scN0vROQcxqFVB-OS6RzE9VpnmFRJUq0pFx8UhGj3bLGHLwc5Vl4abQDRMDNFZTa-c6MrdQUoOI1sXWAntppcKEb0nl33cxLr6jeCqkmS8En7mD8f1wXJntpxmSy6sd3XPr91D53ZgTcRh3z8HSw5k_qPOA2FuXCCz_XdazxnwAAAP__RLu3UQ">