[Bug c/63189] New: Incorrect results from trivial loop when optimized with O3 or O2+tree vectorization

2014-09-05 Thread br...@mynah-software.com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63189

Bug ID: 63189
   Summary: Incorrect results from trivial loop when optimized
with O3 or O2+tree vectorization
   Product: gcc
   Version: 4.8.2
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c
  Assignee: unassigned at gcc dot gnu.org
  Reporter: br...@mynah-software.com

The following code runs two identical loops with the exception that one
variable is marked as volatile:

#include 

short int srcdata[16] = { 0, 0, 0, 0, 0, 0, 0, 1,0,0,0,0,0,0,0,0 };

int main(int argc, char **argv)
{
  int hix= 8;
  int j;
  volatile int  s1ref = 0;
  for(j = 0; j < hix; j++){ s1ref += srcdata[j]*j;}
  int s1=0;
  for(j = 0; j < hix; j++) { s1 += srcdata[j]*j;}
  printf("s1ref=%d, s1=%d\n",s1ref,s1);
}

I would expect the results to be identical for s1ref and s1 under all
compilation options, however when compiling with O3 or O2 with
-ftree-vectorization I get incorrect results for S1:

bms20@arthas:/tmp$ gcc -O2 test.c && ./a.out
s1ref=7, s1=7
bms20@arthas:/tmp$ gcc -O3 test.c && ./a.out
s1ref=7, s1=1
bms20@arthas:/tmp$ gcc -O2 -ftree-vectorize test.c && ./a.out
s1ref=7, s1=1
bms20@arthas:/tmp$

Changing the type of srcdata to integers or unsigned shorts appears to fix the
problem; however, this is producing incorrect results with signed shorts.

It appears that the vector code is incorrect from examining the .s files
produced.


SETUP SPECIFICS:

Exact version of GCC:

bms20@arthas:/tmp$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1'
--with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls
--with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap
--enable-plugin --with-system-zlib --disable-browser-plugin
--enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686
--with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 


System type:

Ubuntu Linux 14.04 running on x86_64.


[Bug c/63189] [4.8 Regression] Incorrect results from trivial loop when optimized with O3 or O2+tree vectorization

2014-09-05 Thread br...@mynah-software.com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63189

--- Comment #2 from Breton M. Saunders  ---
I'm actually showing the same symptoms on Ubuntu 12.04 using virtual-box and
gcc v4.6.3.

Here are the details:

bms20@medivh-lbo-vm:~/LboPlatforms/ti37XX$ uname -a
Linux medivh-lbo-vm 3.8.0-44-generic #66~precise1-Ubuntu SMP Tue Jul 15
04:01:04 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bms20@medivh-lbo-vm:~/LboPlatforms/ti37XX$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.6 --enable-shared --enable-linker-build-id
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object
--enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686
--with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 



And a cut-and-paste of the run:

bms20@medivh-lbo-vm:/tmp$ gcc -O2 test.c && ./a.out
s1ref=7, s1=7
bms20@medivh-lbo-vm:/tmp$ gcc -O2 -ftree-vectorize test.c && ./a.out
s1ref=7, s1=1
bms20@medivh-lbo-vm:/tmp$ gcc -O3 test.c && ./a.out
s1ref=7, s1=1
bms20@medivh-lbo-vm:/tmp$