aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2011-10-15 21:02:33 +1030
committerAlan Modra <amodra@gcc.gnu.org>2011-10-15 21:02:33 +1030
commit387748de2fd017a990aaf617f24b8dad53856888 (patch)
treecb30b59e8583f834cc2b7bda3848e3270cd9bcf1 /gcc/function.c
parentc225ba500b4c34dde743798bf9ccb5dcef7af832 (diff)
downloadgcc-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.c26
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