From 6ee3c8e4125518898c36b97105cb5f12d8ef3132 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 30 Dec 2001 13:20:43 +0100 Subject: cfgrtl.c (try_redirect_by_replacing_jump): Allow redirect_jump to fail if target is EXIT_BLOCK_PTR, die otherwise. * cfgrtl.c (try_redirect_by_replacing_jump): Allow redirect_jump to fail if target is EXIT_BLOCK_PTR, die otherwise. (redirect_edge_and_branch): Likewise. * cfgcleanup.c (try_forward_edge): Don't force jump redirecting if target is EXIT_BLOCK_PTR. * gcc.c-torture/compile/20011229-2.c: New test. From-SVN: r48399 --- gcc/cfgrtl.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'gcc/cfgrtl.c') diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 92d230e..e7e6e69 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -687,9 +687,18 @@ try_redirect_by_replacing_jump (e, target) if (rtl_dump_file) fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n", INSN_UID (insn), e->dest->index, target->index); - redirect_jump (insn, block_label (target), 0); + if (!redirect_jump (insn, block_label (target), 0)) + { + if (target == EXIT_BLOCK_PTR) + return false; + abort (); + } } + /* Cannot do anything for target exit block. */ + else if (target == EXIT_BLOCK_PTR) + return false; + /* Or replace possibly complicated jump insn by simple jump insn. */ else { @@ -806,6 +815,8 @@ redirect_edge_and_branch (e, target) int j; rtx new_label = block_label (target); + if (target == EXIT_BLOCK_PTR) + return false; if (GET_CODE (PATTERN (tmp)) == ADDR_VEC) vec = XVEC (PATTERN (tmp), 0); else @@ -843,11 +854,18 @@ redirect_edge_and_branch (e, target) return false; /* If the insn doesn't go where we think, we're confused. */ - if (JUMP_LABEL (insn) != old_label - /* If the substitution doesn't succeed, die. This can happen - if the back end emitted unrecognizable instructions. */ - || !redirect_jump (insn, block_label (target), 0)) + if (JUMP_LABEL (insn) != old_label) abort (); + + /* If the substitution doesn't succeed, die. This can happen + if the back end emitted unrecognizable instructions or if + target is exit block on some arches. */ + if (!redirect_jump (insn, block_label (target), 0)) + { + if (target == EXIT_BLOCK_PTR) + return false; + abort (); + } } if (rtl_dump_file) -- cgit v1.1