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

            Bug ID: 78558
           Summary: Incorrect loop optimization leads to crash
           Product: gcc
           Version: 5.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Anton.Grichina at harmonicinc dot com
  Target Milestone: ---

Created attachment 40172
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40172&action=edit
main.cpp

GCC optimizes loop using SSE instructions (in this case "movdqa"), but for some
reason memory alignment is wrong and application crashes in run-time.

I attached the code. It crashes in "copy_stats" and "copy_stats1".
Compiled with: g++ -o main -O3 -std=c++11 main.cpp
(compiling with -fno-strict-aliasing -fwrapv and -Wall -Wextra does not change
behavior or show anything useful)
Target: x86_64-linux-gnu

I`ve ran it in gdb to see what happens:
(gdb) run
Starting program: /home/agrichin/test/align_bug/main 

Program received signal SIGSEGV, Segmentation fault.
0x00000000004004e8 in main ()

In asm layout I see:
0x4004e8 <main+40>      movdqa (%rax),%xmm0

And this is content of rax:
(gdb) info registers
rax            0x6010d8 6295768

Memory aligned to 8, not to 16.

This bug reproducible with O3 on GCC 5.4 . On GCC 4.8.4 it is not reproducible.

Workarounds to overcome this bug:
1. Remove/reorder fields in Session structure
2. Remove "copy_stats" function from source
3. Compile with O2
4. Use older compiler, it is not reproducible with 4.8.4

Reply via email to