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