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