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