This testcase crashes when compiled with gcc 4.4 -m32 -msse -O2, but not when
compiled with 4.3 or 4.5. It doesn't crash when compiled as -m64.
/* compile me with -O2 -msse -m32 */
#include <string.h>
typedef float v4sf __attribute__ ((vector_size (16)));

int main(void)
{
    float m4[4];
    v4sf m3;
    float m2[4] = {4, 3, 2, 1};
    v4sf one2 = {5, 15, 25, 35};

    memcpy(&m3, &m2, sizeof(m2));
    m3 = m3 * one2;
    memcpy(&m4, &m3, sizeof(m4));
    if (m4[0] != 20)
        return 1;

    return 0;
}


$ gcc-4.4 bug.c -m32 -O2 -msse
$ ./a.out
Segmentation fault

GDB shows it crashes on the SSE instructions, probably wrong alignment:
Dump of assembler code for function main:
   0x080483a0 <+0>:     push   %ebp
   0x080483a1 <+1>:     mov    %esp,%ebp
   0x080483a3 <+3>:     sub    $0x14,%esp
   0x080483a6 <+6>:     movaps 0x80484d0,%xmm0
   0x080483ad <+13>:    movl   $0x40800000,0x4(%esp)
   0x080483b5 <+21>:    movl   $0x40400000,0x8(%esp)
   0x080483bd <+29>:    flds   0x80484e0
   0x080483c3 <+35>:    movl   $0x40000000,0xc(%esp)
   0x080483cb <+43>:    movl   $0x3f800000,0x10(%esp)
=> 0x080483d3 <+51>:    mulps  0x4(%esp),%xmm0
   0x080483d8 <+56>:    movss  %xmm0,(%esp)
   0x080483dd <+61>:    flds   (%esp)
   0x080483e0 <+64>:    fucomip %st(1),%st
   0x080483e2 <+66>:    fstp   %st(0)
   0x080483e4 <+68>:    setne  %al
   0x080483e7 <+71>:    setp   %dl
   0x080483ea <+74>:    or     %edx,%eax
   0x080483ec <+76>:    movzbl %al,%eax
   0x080483ef <+79>:    leave  
   0x080483f0 <+80>:    ret    
End of assembler dump.

gcc -v output:
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.4-14'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.4 --enable-shared --enable-multiarch
--enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--with-arch-32=i586 --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.4.5 20100909 (prerelease) (Debian 4.4.4-14) 

My libc version is this (should it matter):
GNU C Library (Debian EGLIBC 2.11.2-5) stable release version 2.11.2, by Roland
McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5 20100824 (prerelease).
Compiled on a Linux 2.6.32 system on 2010-09-03.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.


-- 
           Summary: gcc-4.4: crash on vector code with -m32 -msse
           Product: gcc
           Version: 4.4.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: edwintorok at gmail dot com
 GCC build triplet: x86_64-linux-gnu
  GCC host triplet: x86_64-linux-gnu
GCC target triplet: x86_64-linux-gnu


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

Reply via email to