This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: g++ optimization bug version 4.2.3 and version 4.1.3


hi,
 -O0 gives me correct output
but -O1 or -O2 gives me wrong output. i've attached .s files.
Can it be a distro (ubuntu ) problem ?

i tried with gcc-3.4 on ubuntu , 4.1,4.2 on ubuntu.

Can some body tell me which file in gcc handles the overflow ?
Files to look at in gcc or distro gcc-source ?


On Sat, Aug 23, 2008 at 3:55 AM, Niklaus <niklaus@gmail.com> wrote:
> hi andrew,
> this is C code. I don't use the functions ispow2 etc.
>
> see the code  below .
>
>
> root@edubuntu:/home/junk/prog/tju# gcc bug_short.c -lm -O2
> root@edubuntu:/home/junk/prog/tju# ./a.out
> 2383,1
> 31727,1
> 132265613,1
> 3145439247023686464
> root@edubuntu:/home/junk/prog/tju# gcc bug_short.c -lm
> root@edubuntu:/home/junk/prog/tju# ./a.out
> 2383,1
> 31727,1
> 132265613,1
> 10004511787964928
> root@edubuntu:/home/junk/prog/tju# cat bug_short.c
> #include<stdio.h>
> #include<math.h>
> typedef unsigned long long ull;
> ull
> gcd (ull a, ull b)
> {
>  if (b == 0)
>    return a;
>  return gcd (b, a % b);
> }
> int
> main ()
> {
>  ull numprod, denprod, gg;
>  ull arr[] = { 2383, 31727, 132265613 };
>  ull acnt[] = {1,1,1};
>  int cntm = sizeof (arr) / sizeof (arr[0]), i;
>  numprod = denprod = 1;
>  for (i = 0; i <cntm; i++)
>    {
>      ull a = arr[i], b = acnt[i];
>      printf ("%llu,%llu\n", a, b);
>      ull num = (ull) (pow ((double) a, (double) b + 1) - 1);
>      ull den = a - 1;
>      gg = gcd (num, den);
>      num /= gg;
>      den /= gg;
>      numprod *= num;
>      denprod *= den;
>      gg = gcd (numprod, denprod);
>      numprod /= gg;
>      denprod /= gg;
>    }
>  gg = gcd (numprod, denprod);
>  numprod /= gg;
>  denprod /= gg;
>  printf ("%llu\n", numprod);
> return 0;
> }
> root@edubuntu:/home/junk/prog/tju#
>
>
> junk@edubuntu:~/prog/tju$ gcc bug_short.c -Wall -Wstrict-overflow=2 -lm
> junk@edubuntu:~/prog/tju$ gcc bug_short.c -Wall -Wstrict-overflow=2 -lm -O2
> junk@edubuntu:~/prog/tju$ gcc -v
> Using built-in specs.
> Target: i486-linux-gnu
> Configured with: ../src/configure -v
> --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
> --enable-shared --with-system-zlib --libexecdir=/usr/lib
> --without-included-gettext --enable-threads=posix --enable-nls
> --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
> --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
> --enable-mpfr --enable-targets=all --enable-checking=release
> --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
> Thread model: posix
> gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
> junk@edubuntu:~/prog/tju$
>
>
>  Do you want the asm files or other files ? tell me how to give to
> you. you want me to do gcc -S and send you the output ?
>
> On Sat, Aug 23, 2008 at 3:48 AM, Andrew Pinski <pinskia@gmail.com> wrote:
>> On Fri, Aug 22, 2008 at 3:14 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>> On Fri, Aug 22, 2008 at 2:47 PM, Niklaus <niklaus@gmail.com> wrote:
>>>> Hi,
>>>>
>>>>
>>>> When i run with the options g++ prog.c -o prog and run the exectuable
>>>> it gives me the correct output
>>>> but when i do g++ prog.c -o prog -O2 i get the wrong output
>>>>
>>
>> Note by the way I think your ispow2 is incorrect.  It is doing a "a ==
>> 1 & a != 0" and not ((a-1)&a) == 0.  We do warn about this too:
>> t.c:189: warning: suggest parentheses around comparison in operand of &
>>
>>
>> -- Pinski
>>
>

Attachment: bug_short_O0.s
Description: Binary data

Attachment: bug_short_O1.s
Description: Binary data

Attachment: bug_short_O2.s
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]