http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60438

--- Comment #13 from linzj <manjian2006 at gmail dot com> ---
Thank Jakub for the short test case and the revision.
Before revision 205498,the prologue is:
(insn/f:TI 77 78 79 2 (parallel [
            (set (reg/f:SI 7 sp)
                (plus:SI (reg/f:SI 7 sp)
                    (const_int -36 [0xffffffffffffffdc])))
            (clobber (reg:CC 17 flags))
            (clobber (mem:BLK (scratch) [0  A8]))
        ]) 1.cpp:11 798 {pro_epilogue_adjust_stack_si_add}
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))
Then r205498:
(insn/f:TI 75 76 77 2 (parallel [
            (set (reg/f:SI 7 sp)
                (plus:SI (reg/f:SI 7 sp)
                    (const_int -40 [0xffffffffffffffd8])))
            (clobber (reg:CC 17 flags))
            (clobber (mem:BLK (scratch) [0  A8]))
        ]) 1.cpp:11 798 {pro_epilogue_adjust_stack_si_add}
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (expr_list:REG_CFA_ADJUST_CFA (set (reg/f:SI 7 sp)
                (plus:SI (reg/f:SI 7 sp)
                    (const_int -40 [0xffffffffffffffd8])))

See the added REG_CFA_ADJUST_CFA?,that make the cur_cfa->reg ==
dw_stack_pointer_regnum.Before r205498,without this expr,cur_cfa->reg ==
dw_frame_pointer_regnum.

And we can see r205498 actually makes the data looks right.Because we have
omitted the frame pointer, so cur_cfa->reg == dw_frame_pointer_regnum makes no
sense.So the real problem is still the jump2 pass.It should never cross jump
between two blocks without the same REG_ARGS_SIZE.

Reply via email to