Bug 51955 - _mm_setzero_si128 intrinsic causes segfault without -O
Summary: _mm_setzero_si128 intrinsic causes segfault without -O
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 4.6.2
: P3 major
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: ssemmx
Depends on:
Blocks:
 
Reported: 2012-01-23 01:43 UTC by Dale Weiler
Modified: 2012-01-23 10:50 UTC (History)
0 users

See Also:
Host:
Target: x86_64-unknown-linux-gnu
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
gcc -v -save-temps output (3.43 KB, text/plain)
2012-01-23 01:43 UTC, Dale Weiler
Details
Test case (290 bytes, text/plain)
2012-01-23 01:53 UTC, Dale Weiler
Details
objdump -d (dissasembly) (359 bytes, application/octet-stream)
2012-01-23 01:57 UTC, Dale Weiler
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Dale Weiler 2012-01-23 01:43:32 UTC
Created attachment 26419 [details]
gcc -v -save-temps output

There seems to be an issue in respect to the _mm_setzero_si128() intrinsic in <emmintrin.h>
using the following __m128i xmm0 = _mm_setzero_si128(); causes a segmentation fault. GDB reports the following
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400631 in _mm_setzero_si128 () at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/include/emmintrin.h:734
734	  return __extension__ (__m128i)(__v4si){ 0, 0, 0, 0 };

The bug seems to dissapear when optimization levels 1,2,3 are used.
The compiler flags I'm using:
-Wall -nostdlib -std=c99 -fno-builtin -ffreestanding -pedantic-errors

GCC version and specs are below:

gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/src/gcc-4.6-20111223/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 --enable-gnu-unique-object --enable-linker-build-id --with-ppl --enable-cloog-backend=isl --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --enable-multilib --disable-libssp --disable-libstdcxx-pch --enable-checking=release --with-fpmath=sse
Thread model: posix
gcc version 4.6.2 20111223 (prerelease) (GCC) 


uname -a:
Linux (graphitemaster) 3.1.9-2-ARCH #1 SMP PREEMPT Sat Jan 14 09:11:37 CET 2012 x86_64 AMD Phenom(tm) AuthenticAMD GNU/Linux


attached is the gcc -v -save-temps output
Comment 1 Dale Weiler 2012-01-23 01:53:51 UTC
Created attachment 26420 [details]
Test case

This is a working test case which will cause the segmentation fault.
Comment 2 Dale Weiler 2012-01-23 01:57:00 UTC
Created attachment 26421 [details]
objdump -d (dissasembly)

This is a dissasembly of the generated assembly from the following testcase.  There seems to be nothing out of the ordinary that could be causing the segmentation fault.
Comment 3 Andrew Pinski 2012-01-23 02:38:46 UTC
This is a bug in how your _start does not realign the stack to 16 byte aligned.
	movdqa	%xmm0, -32(%rbp)
	movdqa	-32(%rbp), %xmm0
	movdqa	%xmm0, -16(%rbp)

rbp            0x7fffffffe388	0x7fffffffe388
rsp            0x7fffffffe388	0x7fffffffe388
Comment 4 Dale Weiler 2012-01-23 03:59:58 UTC
(In reply to comment #3)
> This is a bug in how your _start does not realign the stack to 16 byte aligned.
>     movdqa    %xmm0, -32(%rbp)
>     movdqa    -32(%rbp), %xmm0
>     movdqa    %xmm0, -16(%rbp)
> 
> rbp            0x7fffffffe388    0x7fffffffe388
> rsp            0x7fffffffe388    0x7fffffffe388

Interesting, even with alignment it crashes however:
while ((((intptr_t)data)&15))
  data++;

What exactly should be aligned the const char * for kill()?
I'm unsure to what you mean in regards to realigning the stack
for _just _start.
Comment 5 Richard Biener 2012-01-23 10:50:52 UTC
void _start() {
	main();
}

isn't properly aligning the stack for the ABI GCC assumes.  Simply drop it.