------- 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

Reply via email to