jump.c (onlyjump_p): New function.

* jump.c (onlyjump_p): New function.
        * rtl.h: Declare it.
        * flow.c (delete_unreachable_blocks): Use onlyjump_p instead
        of condjump_p in calling tidy_fallthru_edge and merge_blocks.

From-SVN: r28584
This commit is contained in:
Richard Henderson 1999-08-07 11:36:15 -07:00 committed by Richard Henderson
parent 021d167782
commit d0e8071928
4 changed files with 37 additions and 10 deletions

View File

@ -1,3 +1,10 @@
Sat Aug 7 19:32:16 1999 Richard Henderson <rth@cygnus.com>
* jump.c (onlyjump_p): New function.
* rtl.h: Declare it.
* flow.c (delete_unreachable_blocks): Use onlyjump_p instead
of condjump_p in calling tidy_fallthru_edge and merge_blocks.
Sat Aug 7 17:09:36 1999 Richard Henderson <rth@cygnus.com>
* global.c (build_insn_chain): Use EXECUTE_IF_SET_IN_REG_SET

View File

@ -1564,11 +1564,9 @@ delete_unreachable_blocks ()
if ((s = b->succ) != NULL
&& s->succ_next == NULL
&& s->dest == c
/* If the last insn is not a normal conditional jump
(or an unconditional jump), then we can not tidy the
fallthru edge because we can not delete the jump. */
&& GET_CODE (b->end) == JUMP_INSN
&& condjump_p (b->end))
/* If the jump insn has side effects, we can't tidy the edge. */
&& (GET_CODE (b->end) != JUMP_INSN
|| onlyjump_p (b->end)))
tidy_fallthru_edge (s, b, c);
}
@ -1587,11 +1585,9 @@ delete_unreachable_blocks ()
&& (s->flags & EDGE_EH) == 0
&& (c = s->dest) != EXIT_BLOCK_PTR
&& c->pred->pred_next == NULL
/* If the last insn is not a normal conditional jump
(or an unconditional jump), then we can not merge
the blocks because we can not delete the jump. */
&& GET_CODE (b->end) == JUMP_INSN
&& condjump_p (b->end)
/* If the jump insn has side effects, we can't kill the edge. */
&& (GET_CODE (b->end) != JUMP_INSN
|| onlyjump_p (b->end))
&& merge_blocks (s, b, c))
continue;

View File

@ -3528,6 +3528,29 @@ returnjump_p (insn)
return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
}
/* Return true if INSN is a jump that only transfers control and
nothing more. */
int
onlyjump_p (insn)
rtx insn;
{
rtx set;
if (GET_CODE (insn) != JUMP_INSN)
return 0;
set = single_set (insn);
if (set == NULL)
return 0;
if (GET_CODE (SET_DEST (set)) != PC)
return 0;
if (side_effects_p (SET_SRC (set)))
return 0;
return 1;
}
#ifdef HAVE_cc0
/* Return 1 if X is an RTX that does nothing but set the condition codes

View File

@ -1352,6 +1352,7 @@ extern int condjump_p PROTO ((rtx));
extern rtx condjump_label PROTO ((rtx));
extern int simplejump_p PROTO ((rtx));
extern int returnjump_p PROTO ((rtx));
extern int onlyjump_p PROTO ((rtx));
extern int sets_cc0_p PROTO ((rtx));
extern int invert_jump PROTO ((rtx, rtx));
extern int rtx_renumbered_equal_p PROTO ((rtx, rtx));