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
This commit is contained in:
Jakub Jelinek 2001-12-30 13:20:43 +01:00 committed by Jakub Jelinek
parent 285f491adf
commit 6ee3c8e412
5 changed files with 54 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2001-12-30 Jakub Jelinek <jakub@redhat.com>
* 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.
2001-12-29 David Edelsohn <edelsohn@gnu.org>
* gcc.c (init_gcc_spec): Do not link with static libgcc.a if

View File

@ -440,7 +440,8 @@ try_forward_edges (mode, b)
int edge_probability = e->probability;
int edge_frequency;
if (threaded)
/* Don't force if target is exit block. */
if (threaded && target != EXIT_BLOCK_PTR)
{
notice_new_block (redirect_edge_and_branch_force (e, target));
if (rtl_dump_file)

View File

@ -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)

View File

@ -1,3 +1,7 @@
2001-12-30 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20011229-2.c: New test.
2001-12-29 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/debug-3.c: New test.

View File

@ -0,0 +1,17 @@
/* Test whether jump threading doesn't ICE if redirecting the jump to exit
block. */
extern int bar ();
extern void baz ();
void foo ()
{
int x;
do
{
if ((x = bar ()) == 1)
baz ();
}
while (x == 1);
}