diff options
author | Alan Modra <amodra@gmail.com> | 2011-10-15 21:02:33 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2011-10-15 21:02:33 +1030 |
commit | 387748de2fd017a990aaf617f24b8dad53856888 (patch) | |
tree | cb30b59e8583f834cc2b7bda3848e3270cd9bcf1 /gcc/function.c | |
parent | c225ba500b4c34dde743798bf9ccb5dcef7af832 (diff) | |
download | gcc-387748de2fd017a990aaf617f24b8dad53856888.zip gcc-387748de2fd017a990aaf617f24b8dad53856888.tar.gz gcc-387748de2fd017a990aaf617f24b8dad53856888.tar.bz2 |
re PR rtl-optimization/49941 (segmentation fault in redirect_jump_2)
PR rtl-optimization/49941
* jump.c (mark_jump_label_1): Set JUMP_LABEL for simple_return jumps.
* rtl.h (set_return_jump_label): Declare.
* function.c (set_return_jump_label): New function, extracted..
(thread_prologue_and_epilogue_insns): ..from here. Use it in
another instance to set return jump_label.
* cfgrtl.c (force_nonfallthru_and_redirect): Use set_return_jump_label.
* reorg.c (find_end_label): Likewise.
From-SVN: r180027
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/gcc/function.c b/gcc/function.c index c469ab9..c3702fb 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -5527,6 +5527,20 @@ emit_return_into_block (bool simple_p, basic_block bb) } #endif +/* Set JUMP_LABEL for a return insn. */ + +void +set_return_jump_label (rtx returnjump) +{ + rtx pat = PATTERN (returnjump); + if (GET_CODE (pat) == PARALLEL) + pat = XVECEXP (pat, 0, 0); + if (ANY_RETURN_P (pat)) + JUMP_LABEL (returnjump) = pat; + else + JUMP_LABEL (returnjump) = ret_rtx; +} + /* Return true if BB has any active insns. */ static bool bb_active_p (basic_block bb) @@ -6062,7 +6076,7 @@ thread_prologue_and_epilogue_insns (void) emit_return_into_block (false, last_bb); epilogue_end = BB_END (last_bb); if (JUMP_P (epilogue_end)) - JUMP_LABEL (epilogue_end) = ret_rtx; + set_return_jump_label (epilogue_end); single_succ_edge (last_bb)->flags &= ~EDGE_FALLTHRU; goto epilogue_done; } @@ -6127,15 +6141,7 @@ thread_prologue_and_epilogue_insns (void) inserted = true; if (JUMP_P (returnjump)) - { - rtx pat = PATTERN (returnjump); - if (GET_CODE (pat) == PARALLEL) - pat = XVECEXP (pat, 0, 0); - if (ANY_RETURN_P (pat)) - JUMP_LABEL (returnjump) = pat; - else - JUMP_LABEL (returnjump) = ret_rtx; - } + set_return_jump_label (returnjump); } else #endif |