<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59668>59668</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86] x `>`/`>=`/`<`/`<=` 0 produce very different assembly
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
scottmcm
</td>
</tr>
</table>
<pre>
Compiling a bunch of `icmp`s against zero
```llvm
define noundef zeroext i1 @check_slt(i8 %0) unnamed_addr #0 {
start:
%r = icmp slt i8 %0, 0
ret i1 %r
}
define noundef zeroext i1 @check_sle(i8 %0) unnamed_addr #0 {
start:
%r = icmp sle i8 %0, 0
ret i1 %r
}
define noundef zeroext i1 @check_sgt(i8 %0) unnamed_addr #0 {
start:
%r = icmp sgt i8 %0, 0
ret i1 %r
}
define noundef zeroext i1 @check_sge(i8 %0) unnamed_addr #0 {
start:
%r = icmp sge i8 %0, 0
ret i1 %r
}
```
Gives two rather different kinds of checks <https://llvm.godbolt.org/z/4sh47s1bn>
```asm
check_slt: # @check_slt
mov eax, edi
shr al, 7
ret
check_sle: # @check_sle
test dil, dil
setle al
ret
check_sgt: # @check_sgt
test dil, dil
setg al
ret
check_sge: # @check_sge
mov eax, edi
not al
shr al, 7
ret
```
My instinct is that `check_sge` should just be `test`+`setge`, more like how `check_sgt` is, rather than needing a shift-by-immediate.
But I'm also really not familiar with the nuances of codegen. I suppose it's also possible that flags are so bad that not using them is better. If that's the case, though, should the others be changed too? Maybe `check_sgt` could be done with `neg` and shifting, for example.
(Or perhaps how it is currently is is already best, and I should just go read more architecture manuals to learn what matters.)
---
Inspired by a conversation about the Rust's [`Ordering::is_lt`](https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_lt) & friends, and the different ways those could be written <https://rust.godbolt.org/z/fq96Yezq7>.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VkFv2zgT_TX0ZWBBoSzZPviQxPWHHIoC321PBSWOJLYU6XJGcdxfvxjJbeJstthgu4Jhihpy5r03oxENkesC4k6Vd6rcL8zIfUw7aiLz0AyLOtrz7j4OR-dd6MBAPYamh9iCqnLXDEdV5QSmMy4Qw3dMUeV7ld-qKp9_3j8O8yOLrQsIIY7BYjutxScGdwNqlTc9Nl8_k2elN24DSpe50lsYQzAD2s_G2gRKFzmo9d3sjtgkVsXtPAPZkkAVexBUQJ7hp597yH-sSjhH1GW6AF3v3wEPfxs8_A_gdb9Nve5N9f4lut8mXvde8X5W4zz9n3tEAj5FSIZ7TGBd22LCwPDVBUtS3hNoAlXc98xHEjD6oPRB6jnroq2j5yymTunDd6UPK-pXa7qpgyo-vIpp6PICPNd4cSuEr-v-QmK-hvg4jWiehCJad22nPk2j8WJeXxsT8nVAlIC_vF6hwYtDRmIxWzfFkeEaBrLHGcYvEXRvUO5eUf7bWITcwT8J8l6aHb5P9BAZ3gIiyfh1Il7V3_z_8QzSNF1oGBwB94alqT6Dq3KgPo7ewpeRGGoUs8gkjvSddF7kaZ3EHmJC8O4rQh9PLx3JcnAkay7lzr0JEBDt3NKpdy0v6_PSDQNaZxizlzjvRoYHpdcDGE8REhrvz5MYrRmcdybByXEP3COE0YQG5xcoWuwwZAAPQOPxGAnBsdJrmv0cI5GrPc7EW286ApMQKEJt7PxUgowkKLnHQVSqkRmTOG2nJZM_idwYQqHIfRy7Xu4u2okxCm3ZDE1vQocWOEZVHAA-mvOs65VazbSzRrAx4MxOVXnATowm2FkyFzqJ08YE-GSGo7_WTenNpwRHTL050pQUNyW6GZO0Gn-WiRM1Ehp7hloyq-8n_w9Xme8m1e2cYpOa3jE2PCaEwYTReAKO4NGkACeRbTAiEmVKb18CWi6XL6cPgY4uoYX6DAaaGB4xkWEXA5g6jjwp9_-RZo3lfFDln5LFJLyLW1XcOvrsp2Is90pvrvukjU2WRuKlN6G7NEpiq_RBDg36gGEcsh_usp4Hr3QxIPfRZrNfvQWlK2iTw2DphzIC6rldn8xZ0i-19TNnp-SYMfy1dQucN1p3-21b_YHfv61V8SFb2F1ht8XWLHB3U61v1tVquy0X_a7dtLjBsjAG13mZm6rAcqUr1LVtmtzUC7fTudY3Whd5kW_LMmt0WWlT2m1Rrdc3N7Va5TgY57PpExJTt3BEI-7KbVVtFt7U6Gk6hmkd8ASTUWktp7K0kz3LeuxIrXLviOnZCzv20_ntaVOpcg9PUqvyGZK-cLjcF_sX0_ur-8kEORxTtGOD8Ijp_EJiQ4RD7c-LMfndtaCd436ssyYOlw_jZVgeU_yCDSt9mFiQ0oeJ5Z8BAAD__5d7F0c">