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

            Bug ID: 80198
           Summary: does not vectorize generic inplace integer operation
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jtaylor.debian at googlemail dot com
  Target Milestone: ---

In the following code the generic function does not vectorize when provided
with arguments that do an inplace operation. GCC does emit vector code but the
code is only executed in out of place operations where |a - b| > 16.
This is despite the explicit hint to the compiler that the two pointers are the
same.

As the explicit inplace variant does execute the same vectorized code there
should be no issue with the method chosen and GCC should allow the inplace
operations to choose the vector path.

void __attribute__((noinline)) fun(int * a, int * b, int c)
{
    int i;
    if (a == b) {
        for (i=0; i < 256; i++) {
            a[i] = b[i] | c;
        }
    }
    else {
        for (i=0; i < 256; i++) {
            a[i] = b[i] | c;
        }
    }
}


void __attribute__((noinline)) inplace(int * a, int c)
{
    int i;
    for (i=0; i < 256; i++) {
        a[i] = a[i] | c;
    }
}

int main()
{
    int a[256];
    generic(a, a, 0);
    inplace(a, 0);
}


$ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 6.2.0-5ubuntu12'
--with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs
--enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared
--enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre
--enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-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 --enable-multilib
--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 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) 

$ gcc test.c  -ftree-vectorize -g -O2

Reply via email to