https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126298
Drea Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|Missed SPACESHIP |Missed SPACESHIP
|optimization for PR59429 |optimization for PR59429
|when b is INTEGER_CST |when b is positive
| |INTEGER_CST
--- Comment #2 from Drea Pinski <pinskia at gcc dot gnu.org> ---
CST being 0 works because we get:
```
<bb 2> [local count: 1073741824]:
if (a_2(D) >= 0)
goto <bb 3>; [59.00%]
else
goto <bb 4>; [41.00%]
<bb 3> [local count: 633507680]:
_4 = a_2(D) != 0;
_5 = (int) _4;
<bb 4> [local count: 1073741824]:
# _1 = PHI <-1(2), _5(3)>
```
But for 1 we get:
```
if (a_2(D) > 0)
goto <bb 3>; [59.00%]
else
goto <bb 4>; [41.00%]
<bb 3> [local count: 633507679]:
_4 = a_2(D) != 1;
_5 = (int) _4;
<bb 4> [local count: 1073741824]:
# _1 = PHI <-1(2), _5(3)>
```
So maybe:
(for op (gt ne)
(match (spaceship @0 @1)
(cond^ (gt @0 INTEGER_CST@2) (convert? (op @0 INTEGER_CST@1))
integer_minus_onep)
(if (wi::to_wide (@2) + 1 == wi::to_wide (@1))))