From d0e8071928aaf219e9cd98aa0daaacab77d1059f Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 7 Aug 1999 11:36:15 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/flow.c | 16 ++++++---------- gcc/jump.c | 23 +++++++++++++++++++++++ gcc/rtl.h | 1 + 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3715d620a3..2a6b9b6d3a2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Sat Aug 7 19:32:16 1999 Richard Henderson + + * 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 * global.c (build_insn_chain): Use EXECUTE_IF_SET_IN_REG_SET diff --git a/gcc/flow.c b/gcc/flow.c index 9ca8f5c88fb..0fbe5517a59 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -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; diff --git a/gcc/jump.c b/gcc/jump.c index 37298f038b3..71811bb9f8b 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -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 diff --git a/gcc/rtl.h b/gcc/rtl.h index 9b86a84e75b..a0bd720e2fb 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -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)); -- 2.30.2