[Bug c++/60747] New: the tree-vrp compilation flag produce wrong assembly

techsgin at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Apr 3 13:59:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60747

            Bug ID: 60747
           Summary: the tree-vrp compilation flag produce wrong assembly
           Product: gcc
           Version: 4.4.7
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: techsgin at gmail dot com

Hi

At optimization level O2 the results of return value of short if are miss
calculated i.e wrong results. see example 

Solution:
Don't use the tree-vrp compilation flag i.e add -fno-tree-vrp


Example code:
#include <stdio.h>
#include <string.h>

int hash_it(const char* d, const int prime) __attribute__((noinline));
int hash_it(const char* d, const int prime)
{
      int n = strlen(d);
      int h = n; 

      for (int i = 0; i < n; i++, d++)
          h = (777*h) + (*d);

      return ((h >= 0) ? (h % prime) : (-h % prime)); 
}

int main ()
{
    int lret = 0;
    const char* lsdata = "ABCD";
    lret = hash_it(lsdata, 10);
    printf("%d, %s\n", lret, lsdata);

    return 0;
}

Results:
correct result (i.e NO tree vrp) :
$ g++ -O2 -fno-tree-vrp main.cpp -o main_2_no_tree_vrp
$ ./main_2_no_tree_vrp
2, ABCD

incorrect result (i.e tree vrp in use) : 
$ g++ -O2 main.cpp -o main_o2_tree_vrp
$ ./main_o2_tree_vrp
-2, ABCD


Version details:
$ cat /etc/*-release
CentOS release 6.5 (Final)
LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
CentOS release 6.5 (Final)
CentOS release 6.5 (Final)

$ uname -a
Linux mastercos6 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014
x86_64 x86_64 x86_64 GNU/Linux

$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla
--enable-bootstrap --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-gnu-unique-object
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk
--disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
--enable-libgcj-multifile --enable-java-maintainer-mode
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib
--with-ppl --with-cloog --with-tune=generic --with-arch_32=i686
--build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)



More information about the Gcc-bugs mailing list