Widespread arithmetic optimisation bug
Robert Harley
Robert.Harley@inria.fr
Fri Feb 26 09:14:00 GMT 1999
Here's a little program that reveals a bug with optimisation on.
I've seen it with ints and longs, on Alpha and x86, with gcc and egcs
releases...
------------------------------------------------------------------------------
/* Run with:
gcc -v
gcc -O0 bug.c
./a.out && echo OK || echo Broken
gcc -O1 bug.c
./a.out && echo OK || echo Broken
*/
unsigned bla(unsigned b) {
unsigned q;
q = -1U/b;
b = -q*b;
return b;
} /* end bla */
int main(int argc, char *argv[]) {
unsigned r;
r = bla(-5U);
return r != 5U;
} /* end main */
------------------------------------------------------------------------------
Example on Alpha:
------------------------------------------------------------------------------
> uname -a
Linux corton 2.0.35 #5 Thu Jul 23 18:25:00 CEST 1998 alpha unknown
gcc version 2.7.2.1
OK
Broken
gcc version 2.8.1
OK
OK
gcc version egcs-2.90.29 980515 (egcs-1.0.3 release)
OK
OK
gcc version egcs-2.91.60 19981201 (egcs-1.1.1 release)
OK
Broken
------------------------------------------------------------------------------
On x86:
------------------------------------------------------------------------------
> uname -a
Linux madiran 2.0.34 #12 Tue Jul 14 12:55:10 CEST 1998 i686 unknown
gcc version 2.7.2.3
OK
Broken
gcc version egcs-2.90.27 980315 (egcs-1.0.2 release)
OK
Broken
------------------------------------------------------------------------------
I can't reproduce the problem on ARM though:
------------------------------------------------------------------------------
> uname -a
Linux sauternes 2.0.35 #1 Thu Jan 21 15:41:36 EST 1999 armv4l
gcc version 2.8.1
OK
OK
gcc version egcs-2.91.57 19980901 (egcs-1.1 release)
OK
OK
gcc version egcs-2.91.60 19990113/philb (egcs-1.1.1 release)
OK
OK
------------------------------------------------------------------------------
Rob.
More information about the Gcc-bugs
mailing list