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