t.c:24:1: error: could not split insn (insn:TI 20 47 43 (set (mem/c:V4SI (reg/f:DI 7 sp) [3 %sfp+-64 S16 A128]) (vec_merge:V4SI (vec_duplicate:V4SI (reg:SI 0 ax)) (mem/c:V4SI (reg/f:DI 7 sp) [3 %sfp+-64 S16 A128]) (const_int 1 [0x1]))) t.c:16 1424 {*vec_setv4si_0_sse2} (expr_list:REG_DEAD (reg:SI 0 ax) (expr_list:REG_EQUAL (vec_merge:V4SI (vec_duplicate:V4SI (mem/j/i:SI (plus:DI (plus:DI (mult:DI (reg:DI 5 di [orig:68 argc ] [68]) (const_int 4 [0x4])) (reg/f:DI 7 sp)) (const_int 16 [0x10])) [2 vectmp.4 S4 A32])) (const_vector:V4SI [ (const_int 0 [0]) (const_int 3 [0x3]) (const_int 2 [0x2]) (const_int 1 [0x1]) ]) (const_int 1 [0x1])) (nil)))) t.c:24:1: internal compiler error: in final_scan_insn, at final.c:2645
Which is because while the insn matches (define_insn "*vec_set<mode>_0_sse2" [(set (match_operand:SSEMODE4S 0 "nonimmediate_operand" "=x, x,x,m") (vec_merge:SSEMODE4S (vec_duplicate:SSEMODE4S (match_operand:<ssescalarmode> 2 "general_operand" " m,*r,x,x*rfF")) (match_operand:SSEMODE4S 1 "vector_move_operand" " C, C,0,0") (const_int 1)))] "TARGET_SSE2" "@ mov<ssescalarmodesuffix>\t{%2, %0|%0, %2} movd\t{%2, %0|%0, %2} movss\t{%2, %0|%0, %2} #" [(set_attr "type" "ssemov") (set_attr "mode" "<ssescalarmode>,SI,SF,*")]) the only matching split is (define_split [(set (match_operand:V4SF 0 "memory_operand" "") (vec_merge:V4SF (vec_duplicate:V4SF (match_operand:SF 1 "nonmemory_operand" "")) (match_dup 0) (const_int 1)))] "TARGET_SSE && reload_completed" [(const_int 0)] { emit_move_insn (adjust_address (operands[0], SFmode, 0), operands[1]); DONE; }) which only allows V4SF mode. It probably should be macroized to use SSEMODE4S. -- Summary: split for *vec_set<mode>_0_sse2 incomplete Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: ice-on-valid-code Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rguenth at gcc dot gnu dot org GCC target triplet: x86-64-*-*, i?86-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45142