Commit d0e80719 by Richard Henderson Committed by Richard Henderson

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
parent 021d1677
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> Sat Aug 7 17:09:36 1999 Richard Henderson <rth@cygnus.com>
* global.c (build_insn_chain): Use EXECUTE_IF_SET_IN_REG_SET * global.c (build_insn_chain): Use EXECUTE_IF_SET_IN_REG_SET
......
...@@ -1564,11 +1564,9 @@ delete_unreachable_blocks () ...@@ -1564,11 +1564,9 @@ delete_unreachable_blocks ()
if ((s = b->succ) != NULL if ((s = b->succ) != NULL
&& s->succ_next == NULL && s->succ_next == NULL
&& s->dest == c && s->dest == c
/* If the last insn is not a normal conditional jump /* If the jump insn has side effects, we can't tidy the edge. */
(or an unconditional jump), then we can not tidy the && (GET_CODE (b->end) != JUMP_INSN
fallthru edge because we can not delete the jump. */ || onlyjump_p (b->end)))
&& GET_CODE (b->end) == JUMP_INSN
&& condjump_p (b->end))
tidy_fallthru_edge (s, b, c); tidy_fallthru_edge (s, b, c);
} }
...@@ -1587,11 +1585,9 @@ delete_unreachable_blocks () ...@@ -1587,11 +1585,9 @@ delete_unreachable_blocks ()
&& (s->flags & EDGE_EH) == 0 && (s->flags & EDGE_EH) == 0
&& (c = s->dest) != EXIT_BLOCK_PTR && (c = s->dest) != EXIT_BLOCK_PTR
&& c->pred->pred_next == NULL && c->pred->pred_next == NULL
/* If the last insn is not a normal conditional jump /* If the jump insn has side effects, we can't kill the edge. */
(or an unconditional jump), then we can not merge && (GET_CODE (b->end) != JUMP_INSN
the blocks because we can not delete the jump. */ || onlyjump_p (b->end))
&& GET_CODE (b->end) == JUMP_INSN
&& condjump_p (b->end)
&& merge_blocks (s, b, c)) && merge_blocks (s, b, c))
continue; continue;
......
...@@ -3528,6 +3528,29 @@ returnjump_p (insn) ...@@ -3528,6 +3528,29 @@ returnjump_p (insn)
return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL); 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 #ifdef HAVE_cc0
/* Return 1 if X is an RTX that does nothing but set the condition codes /* Return 1 if X is an RTX that does nothing but set the condition codes
......
...@@ -1352,6 +1352,7 @@ extern int condjump_p PROTO ((rtx)); ...@@ -1352,6 +1352,7 @@ extern int condjump_p PROTO ((rtx));
extern rtx condjump_label PROTO ((rtx)); extern rtx condjump_label PROTO ((rtx));
extern int simplejump_p PROTO ((rtx)); extern int simplejump_p PROTO ((rtx));
extern int returnjump_p PROTO ((rtx)); extern int returnjump_p PROTO ((rtx));
extern int onlyjump_p PROTO ((rtx));
extern int sets_cc0_p PROTO ((rtx)); extern int sets_cc0_p PROTO ((rtx));
extern int invert_jump PROTO ((rtx, rtx)); extern int invert_jump PROTO ((rtx, rtx));
extern int rtx_renumbered_equal_p PROTO ((rtx, rtx)); extern int rtx_renumbered_equal_p PROTO ((rtx, rtx));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment