https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61781

            Bug ID: 61781
           Summary: Overflow of signed integer causing incorrect execution
                    of a program
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: geir at cray dot com

User identified a test case that may indicate an over aggressive optimizer. In
the following test case, compiler with '-O1' will result in correct execution,
while compiling with '-O2' and above results in incorrect behavior.

Here is the short version of the test case.  Duplicated bug with 4.8.[012] and
4.9.0 compilers:

$ cat simple.c
#include <stdio.h>          
#include <stdlib.h>         

long myrand( long x )
{
   long c = 6824061905351802757L;  // prime
   long d = 5001297291839117257L;  // prime, p - 1 divisible by 4

   x = d*x + c;
   return( x );
}

int main( int argc, char *argv[] ) {
   long x, len;
   long count = 0;

   x = 1;
   len = 1e2;

   if( argc > 1 ) {
     len = atof( argv[1] ) + 0.5;
   }
   if( argc > 2 ) {
     x = strtol( argv[2], 0, 0 );
   }

   printf("len = %ld, seed = 0x%016lx\n", len, x);

   for( long i=0; i<len; i++ ) {
     x = myrand( i );           // this version breaks gcc
     printf("%4ld:  0x%016lx\n", i, x);
     count++;
   }
   printf("Count is %ld\n", count);

   return( 0 );
}
$ gcc --version
gcc (GCC) 4.9.0 20140422 (Cray Inc.)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

   --  Compiling with -O1 works --

$ gcc -O1 -std=c99 simple.c
$ ./a.out | tail
  91:  0x0abc128a0365f3f8
  92:  0x50243fed93978bc1
  93:  0x958c6d5123c9238a
  94:  0xdaf49ab4b3fabb53
  95:  0x205cc818442c531c
  96:  0x65c4f57bd45deae5
  97:  0xab2d22df648f82ae
  98:  0xf0955042f4c11a77
  99:  0x35fd7da684f2b240
Count is 100
$


   -- Compiling with -O2 fails --

$ gcc -O2 -std=c99 simple.c
$ ./a.out
len = 100, seed = 0x0000000000000001
   0:  0x5eb3f025c1c4ff85
Count is 0
$

Reply via email to