[Bug tree-optimization/91384] [7/8/9/10 Regression] Compare with negation is not eliminated
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Aug 7 08:13:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91384
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Hmpf. So the following was not optimized ever:
void foo (void);
void bar (void);
int
test (int a)
{
int r = -a;
if (a == 0)
foo ();
else
bar ();
return r;
}
Note this is also about canonicalization if you consider both jump forms
appearing in the source and the ability to thread them.
But yes, the CC re-using form is better (in case r is not dead otherwise).
On GIMPLE this shows we lack modeling of CCs. I'm not sure doing
_1 = __IFN_NEGATE_WITH_CCZ (a_2);
r_3 = __real _1;
_4 = __imag _1;
if (_4 != 0)
foo ();
else
bar ();
is the way to go though (that would be possible with current infrastructure).
A "nicer"/leaner way would be to generalize SSA projections so we do not
have to abuse COMPLEX and could allow
_1 = __IFN_NEGATE_WITH_CC (a_2);
r_3 = __value _1;
if (__CCZ _1 != 0);
foo ();
else
bar ();
but then doing this on GIMPLE is of course prone to CC spilling.
Note "fixing" the above testcase on GIMPLE is as hard as fixing it on RTL.
More information about the Gcc-bugs
mailing list