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.