------- Comment #2 from ubizjak at gmail dot com 2010-04-11 20:35 ------- Works with -fno-omit-frame-pointer. We expand to:
(insn 8 7 0 pr43653.c:4 (set (reg:V2DI 61 [ vect_cst_.2 ]) (vec_duplicate:V2DI (reg/f:DI 54 virtual-stack-vars))) 1700 {*vec_dupv2d i} (nil)) (insn 9 8 0 pr43653.c:4 (parallel [ (set (reg:DI 64 [ ivtmp.9 ]) (plus:DI (reg/f:DI 54 virtual-stack-vars) (const_int -512 [0xfffffffffffffe00]))) (clobber (reg:CC 17 flags)) ]) -1 (nil)) In -fomit-frame-pointer case, RA is trying to eliminate frame reg and at the same time trying to satisfy "x" register constraint, RA chokes on either of: (insn 8 5 9 2 pr43653.c:4 (set (reg:V2DI 61 [ vect_cst_.2 ]) (vec_duplicate:V2DI (reg/f:DI 20 frame))) 1700 {*vec_dupv2di} (nil)) (insn 9 8 10 2 pr43653.c:4 (parallel [ (set (reg:DI 64 [ ivtmp.9 ]) (plus:DI (reg/f:DI 20 frame) (const_int -512 [0xfffffffffffffe00]))) (clobber (reg:CC 17 flags)) ]) 252 {*adddi_1} (expr_list:REG_UNUSED (reg:CC 17 flags) (nil))) The failure in (insn 8) can be triggered on non-TARGET_INTER_UNIT_MOVES targets (i.e. -march=k8) when temp stack slot is generated to move from (eliminated?) integer %rbp to SSE %xmm reg via stack slot. The failure in (insn 9) can be triggered with -march=core2 also when frame pointer is to be eliminated. Using -mno-omit-frame-pointer, we get: (insn 32 5 33 2 pr43653.c:4 (set (mem/c:DI (plus:DI (reg/f:DI 6 bp) (const_int -520 [0xfffffffffffffdf8])) [0 S8 A64]) (reg/f:DI 6 bp)) 89 {*movdi_1_rex64} (nil)) (insn 33 32 8 2 pr43653.c:4 (set (reg:DI 22 xmm1) (mem/c:DI (plus:DI (reg/f:DI 6 bp) (const_int -520 [0xfffffffffffffdf8])) [0 S8 A64])) 89 {*movdi_1 _rex64} (nil)) (insn 8 33 34 2 pr43653.c:4 (set (reg:V2DI 22 xmm1) (vec_duplicate:V2DI (reg:DI 22 xmm1))) 1700 {*vec_dupv2di} (expr_list:RE G_EQUIV (vec_duplicate:V2DI (reg/f:DI 6 bp)) (nil))) (insn 34 8 9 2 pr43653.c:4 (set (reg:V2DI 21 xmm0 [orig:61 vect_cst_.2 ] [61]) (reg:V2DI 22 xmm1)) 1049 {*movv2di_internal} (nil)) (insn 9 34 10 2 pr43653.c:4 (parallel [ (set (reg:DI 0 ax [orig:64 ivtmp.9 ] [64]) (plus:DI (reg/f:DI 6 bp) (const_int -512 [0xfffffffffffffe00]))) (clobber (reg:CC 17 flags)) ]) 252 {*adddi_1} (expr_list:REG_EQUAL (plus:DI (reg/f:DI 6 bp) (const_int -512 [0xfffffffffffffe00])) (nil))) Adding CC. -- ubizjak at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |vmakarov at gcc dot gnu dot | |org Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2010-04-11 20:35:55 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43653