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