<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/155584>155584</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            (u)comiss instructions not merged together in comparison chains
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          purplesyringa
      </td>
    </tr>
</table>

<pre>
    https://godbolt.org/z/a1f4hrPzT

```c
enum Ordering {
    LESS = -1,
    EQUAL = 0,
    GREATER = 1,
    UNORDERED = 2
};

enum Ordering compare(float a, float b) {
    if (a < b) {
 return LESS;
    } else if (a == b) {
        return EQUAL;
    } else if (a > b) {
        return GREATER;
    } else {
        return UNORDERED;
 }
}

int another_example(float a, float b) {
    if (a < b) {
 return 1;
    } else if (a <= b) {
        return 2;
    } else {
 return 3;
    }
}
```

```x86asm
compare:
        mov     eax, -1
 ucomiss xmm1, xmm0
        ja      .LBB0_3
        xor     eax, eax
 ucomiss xmm0, xmm1
        jne     .LBB0_2
        jp .LBB0_2
.LBB0_3:
        ret
.LBB0_2:
        setbe   al
        movzx eax, al
        inc     eax
        ret

another_example:
        xor ecx, ecx
        ucomiss xmm1, xmm0
        adc     ecx, 2
 ucomiss xmm1, xmm0
        mov     eax, 1
        cmovbe  eax, ecx
 ret
```

I see no good reason why the partial ordering implementation cannot emit `ucomiss` just once, e.g.

```x86asm
compare:
        ucomiss xmm0, xmm1
        mov eax, 2
        jp .exit
        mov eax, -1
 jb .exit
        seta al
.exit:
        ret
```

`another_example` looks even more straight-forward, with operands not even swapped.

`ucomiss` is not exactly slow, but it's not fast either, so surely this is a missed optimization?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVd1u4zYTfRr6ZhCDoqK_C13Ysf3hA4Jum929XlDSWGJKkQJJ2U6evqAkJ5I3zbZADQE0ODNn5hwde7i1olaIOYm2JNqteO8abfKuN51E-2KEqvmq0NVL3jjXWRJuCDsQdqh1VWjp1trUhB1eCTvw4HjfmN9fvxG68U9Mx6ckdIOqb-GLqdDjAUm2hG4AAB73X78CCXdwFxD2MF3u__i-eRxu6fvl_572m2_7p-F6lvv9ty9Pu_3TfjcEmO-b7Ei4HWdYti1123GDhKVHqbkDTtgDjF8LwrLZWOIIhKUcSPiwCBl0vVHD1GMPn0ySHaC0OKva-WFuMP1nqh8Ifgqw_6R6UuKD-g_T3xSaCrw-o0qDREI54Eq7Bs0PvPC2k_-BQMGn5B4-V4f9PbMpI1xkvLO5Ou7GgJc05rYldHM1QLiZdW31aTiRXzzdu8DH-lK3wlq4tK03mz_prOaZj-f6cbulP8JZ5KLNHM0fSzg6wQVzOIUzODaPdLPLa7fF-AbdW4gtQxZd4YG5XNJ9vVzHW0SEKt9Gv8UndHNrkkUrTxvLkXI5L_-FkLyaeo617B9of_O-5jqWrT55xlfxx0kmBktz_B8sIigNtdYVGORWKzg3L-AahI4bJ7gEff3nEJ5xi8pxJ7SCkiulHWArHJCYTgOTmMJzbx1oVeLQf12v_5UVf2ETz3yidusRvAj3cebo5-fipxyLjo8GGCMfuOrnH9StCWIKUus_LeAJFbTaIFhnuKgbd3fU5sxN5Yc4C9eA7tBwVVkYtPP59sy7Dqt3kWZKiinvwksnX8BKffZIRe9AOMKSMXzk1gEKP5OPWg22Nyj9axTWY3DwgFiB7pxoxevwAkl4WFV5WGVhxleYB0kUszSNs2DV5PERgzjKwihI4mNasPI-jrMsOXIs4oxV8UrkjLKIpiyhWZQGwZrSsCijoAwTeiziJCD3FFsu5FrKU-v340pY22MeRFGU3q8kL1DaYd0ypvAMQ5Qw5revyX3RXdHXltxTKayz7zBOOIk5YWlPWDZZRSjrTF96VqMiLZoaK3C6Rq8KCDXtPeEdXjZcKLvqjbxd58I1fbEudUvYwXecjrvO6GcsHWGHYU5L2GEicsrZXwEAAP__PRZUKw">