https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94031
Bug ID: 94031
Summary: missing floating-point optimization of x + 0 when x is
not zero
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: vincent-gcc at vinc17 dot net
Target Milestone: ---
In floating point, when x is not 0 (and not sNaN when supported), x + 0 can be
optimized to x. GCC misses this optimization:
void bar (double);
void foo1 (double x)
{
x *= 2.0; /* cannot be sNaN */
if (x != 0)
bar (x - 0);
}
void foo2 (double x)
{
x *= 2.0; /* cannot be sNaN */
if (x != 0)
bar (x + 0);
}
In foo1, x - 0 can be optimized to x in rounding to nearest (even when x is
±0), and GCC optimizes as expected:
.L4:
jmp bar@PLT
In foo2, in order to be able to optimize, one needs x != 0, guaranteed by the
"if" condition, but GCC misses the optimization:
.L10:
addsd %xmm1, %xmm0
jmp bar@PLT
Tested under Debian x86_64 with gcc-10 (Debian 10-20200222-1) 10.0.1 20200222
(experimental) [master revision
01af7e0a0c2:487fe13f218:e99b18cf7101f205bfdd9f0f29ed51caaec52779]