https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61925
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- On trunk I get vector.c:6:1: error: unrecognizable insn: (insn 3 2 4 2 (set (reg/v:TI 101 [ a ]) (mem/c:TI (plus:SI (reg/f:SI 81 virtual-incoming-args) (const_int 16 [0x10])) [1 a+0 S16 A128])) vector.c:4 -1 (expr_list:REG_EQUIV (mem/c:TI (plus:SI (reg/f:SI 81 virtual-incoming-args) (const_int 16 [0x10])) [1 a+0 S16 A128]) (nil))) instead. Reduced testcase for the convert_move ICE on the branches, ICEs at -m32 -march=i386: #pragma GCC push_options #pragma GCC target("sse") typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); __m128i _mm_castps_si128(__m128 __A) { } #pragma GCC pop_options __attribute__((vector_size(16))) int f(__attribute__((vector_size(16))) int a, __attribute__((vector_size(16))) int b) { return a + b; } this seems to be fixed on trunk. Reduced testcase for the ICE on trunk, ICEs at -m32 -march=i386: #pragma GCC push_options #pragma GCC target("sse") typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_undefined_ps (void) { } #pragma GCC target("sse2") #pragma GCC pop_options __attribute__((vector_size(16))) int f(__attribute__((vector_size(16))) int a, __attribute__((vector_size(16))) int b) { return a + b; } thus it requires a sse2 target attribute. Would be interesting to know what fixed the convert_move ICE on trunk.