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.