optimization/9052: in C code, "if" statement fails to execute if optimized
Steven Bosscher
s.bosscher@student.tudelft.nl
Wed Feb 12 15:25:00 GMT 2003
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=9052
A small test case for this PR is the following:
#define N 256
int
main (void)
{
float r[N];
int n;
r[0] = 0;
for (n = 1; n < N; n++)
{
r[n] = r[n - 1] * r[n - 1] - .125;
// printf("%f\n",r[n]-r[n/2]);
if (r[n / 2] == r[n])
break;
}
printf ("%d\n", n);
return 0;
}
I have tested this with two different GCC versions:
Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.3/specs
gcc version 2.95.3 20010315 (SuSE
Reading specs from
/opt/experimental/lib/gcc-lib/i586-pc-linux-gnu/3.4/specs
Configured with: ../gcc-trunk/configure --disable-nls --with-gnu-as
--with-gnu-ld --prefix=/opt/experimental --program-suffix=-3.4
--enable-languages=c
Thread model: posix
gcc version 3.4 20030211 (experimental)
Output from this testcase:
gcc version: at -O0 at -O1 at -O2
2.95.3 22 22 22
3.4 exp. 22 256 256
After uncommenting the printf, gcc 3.4 also prints 22 at -O1 and -O2.
I have looked for documentation about this change in behavior but it
doesn't seem to exist. I'm not a floating point specialist, but
generally, comparing floats for equality doesn't seem like the best
thing to do. However, since it apparently worked with older gcc
versions, I suppose one could qualify this as a regression...
Eric, I CC'ed you as the Great C Bug Squasher. Do you think this is a
regression, and if so, change the status in GNATS?
Greetz
Steven
More information about the Gcc-bugs
mailing list