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