[Bug c++/54899] New: -fpredictive-commoning and -ftree-vectorize optimizations generate a nonsensical binary which segfaults

phiren at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu Oct 11 10:29:00 GMT 2012


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

             Bug #: 54899
           Summary: -fpredictive-commoning and -ftree-vectorize
                    optimizations generate a nonsensical binary which
                    segfaults
    Classification: Unclassified
           Product: gcc
           Version: 4.7.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: phiren@gmail.com


Created attachment 28423
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28423
minimal(ish) testcase which reproduces the bug.

When this code is compiled with -O3 (or even just -O1 with
-fpredictive-commoning and -ftree-vectorize) gcc generates code which segfaults
when run.

The original code was deep inside a template metaprogramming math library. I
don't have much experience with templates so I only managed to trim the minimal
testcase down to 60 lines. Templates may or may not be needed to trigger the
bug, it may be possible to completely factor them out.

Version info:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/src/gcc-4.7.2/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch
--enable-libstdcxx-time --enable-gnu-unique-object --enable-linker-build-id
--with-ppl --enable-cloog-backend=isl --disable-ppl-version-check
--disable-cloog-version-check --enable-lto --enable-gold --enable-ld=default
--enable-plugin --with-plugin-ld=ld.gold --with-linker-hash-style=gnu
--disable-multilib --disable-libssp --disable-build-with-cxx
--disable-build-poststage1-with-cxx --enable-checking=release
Thread model: posix
gcc version 4.7.2 (GCC) 

Command line which triggers the bug:

    gcc bug2.ii -o bug -O3 && ./bug

(no compiler output, ./bug will segfault when run)



Looking at the assembly output when disabling predictive commoning there are
only 3 changes and if it wasn't for an off-by-0x800000000 error they would be
functionally identical.

-O3 -fno-predictive-commoning:

    movsd    (%rdi), %xmm1
    movsd    24(%rdi), %xmm2
    movhpd    8(%rdi), %xmm1
    movhpd    32(%rdi), %xmm2
    movapd    %xmm1, %xmm0
    movsd    16(%rdi), %xmm1
    <snip>

-O3:

    movsd    (%rdi), %xmm1
    movabsq    $34359738384, %rax <-- Inserted
    movsd    24(%rdi), %xmm2
    movhpd    8(%rdi), %xmm1
    movhpd    32(%rdi), %xmm2
    movapd    %xmm1, %xmm0
    movsd    (%rdi,%rax), %xmm1 <-- Changed
        <snip>



More information about the Gcc-bugs mailing list