The following code causes an ICE with any -O flag except -O0: #include <mmintrin.h> #include <stdint.h> int main(int argc, char *argv[]) { __m64 a, b, c; a = b = c = (__m64)(uint64_t)argc; /* Load with arbitrary values */ a = _mm_slli_pi16(a, 3); a = _mm_adds_pi16(a, b); c = _mm_srli_pi16(c, 8); c = _mm_slli_pi16(c, 3); b = _mm_adds_pi16(b, c); a = _mm_unpacklo_pi8(a, b); return (int)(uint64_t)a; } Resulting error is: crashmmx.c: In function ‘main’: crashmmx.c:16: internal compiler error: in trunc_int_for_mode, at explow.c:53
By the way, 4.1.0 fixes the bug on i486-linux-gnu, but on AMD64 (x86_64-linux-gnu) the problem is still present. Tested with a 20050904 snapshot.
This works with 4.2.0 on x86_64-*-* though not for 4.1.0.
This appears to be working now on x86_64 with last night's gcc 4.1.x subversion.
This works for me with 4.1.2.
Fixed in GCC-4.1.2 and higher.