http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49064
--- Comment #1 from Piotr Wyderski <piotr.wyderski at gmail dot com> 2011-05-19 14:27:28 UTC --- This is caused by the following definition in emmintrin.h: /* The Intel API is flexible enough that we must allow aliasing with other vector types, and their scalar components. */ typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); Without __may_alias__ the generated assembly code is OK. It's wrong to blindly assume a type aliases everything; proper analysis should be performed. Because the headers are indended to provide seamless integration with MSVC and ICC vectorized code, it's a good practice to use SSE that way. Most bona fide users will step into that trap assuming GCC produces comparably good code, which in this case it obviously doesn't, as can be seen above.