From 3160014ec370c150713a15c6c60f96ccbf8d84c0 Mon Sep 17 00:00:00 2001 From: thorpej Date: Fri, 21 Jun 2002 19:05:00 +0000 Subject: [PATCH] 2002-06-21 Richard Henderson * bb-reorder.c (make_reorder_chain_1): Search harder for the vax casesi fallthru edge. * cfglayout.c (cleanup_unconditional_jumps): Use redirect_edge_succ_nodup. Do not delete ADDR_VEC insns as dead. * cfgrtl.c (force_nonfallthru_and_redirect): Place redirection block after ADDR_VEC. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54885 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/bb-reorder.c | 14 +++++++++----- gcc/cfglayout.c | 15 +++------------ gcc/cfgrtl.c | 16 ++++++++++++++-- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 758abeddd8e..3bbfef1e9cb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2002-06-21 Richard Henderson + + * bb-reorder.c (make_reorder_chain_1): Search harder for the + vax casesi fallthru edge. + * cfglayout.c (cleanup_unconditional_jumps): Use + redirect_edge_succ_nodup. Do not delete ADDR_VEC insns as dead. + * cfgrtl.c (force_nonfallthru_and_redirect): Place redirection + block after ADDR_VEC. + 2002-06-21 Rainer Orth * config/sparc/t-linux64 (EXTRA_MULTILIB_PARTS): Add crtfastmath.o. diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index 6ae4c76d382..24c41e51ced 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -209,17 +209,21 @@ make_reorder_chain_1 (bb, prev) /* In the absence of a prediction, disturb things as little as possible by selecting the old "next" block from the list of successors. If there had been a fallthru edge, that will be the one. */ + /* Note that the fallthru block may not be next any time we eliminate + forwarder blocks. */ if (! next) { for (e = bb->succ; e ; e = e->succ_next) - if (e->dest == bb->next_bb) + if (e->flags & EDGE_FALLTHRU) { - if ((e->flags & EDGE_FALLTHRU) - || (e->dest->succ - && ! (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH)))) - next = e->dest; + next = e->dest; break; } + else if (e->dest == bb->next_bb) + { + if (! (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))) + next = e->dest; + } } /* Make sure we didn't select a silly next block. */ diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c index bd589728bdf..70b7b17a7a1 100644 --- a/gcc/cfglayout.c +++ b/gcc/cfglayout.c @@ -608,10 +608,9 @@ verify_insn_chain () } /* Remove any unconditional jumps and forwarder block creating fallthru - edges instead. During BB reordering fallthru edges are not required + edges instead. During BB reordering, fallthru edges are not required to target next basic block in the linear CFG layout, so the unconditional - jumps are not needed. If LOOPS is not null, also update loop structure & - dominators. */ + jumps are not needed. */ static void cleanup_unconditional_jumps () @@ -636,7 +635,7 @@ cleanup_unconditional_jumps () fprintf (rtl_dump_file, "Removing forwarder BB %i\n", bb->index); - redirect_edge_succ (bb->pred, bb->succ->dest); + redirect_edge_succ_nodup (bb->pred, bb->succ->dest); flow_delete_block (bb); bb = prev; } @@ -653,8 +652,6 @@ cleanup_unconditional_jumps () else continue; - /* Cleanup barriers and delete ADDR_VECs in a way as they are belonging - to removed tablejump anyway. */ insn = NEXT_INSN (bb->end); while (insn && (GET_CODE (insn) != NOTE @@ -664,12 +661,6 @@ cleanup_unconditional_jumps () if (GET_CODE (insn) == BARRIER) delete_barrier (insn); - else if (GET_CODE (insn) == JUMP_INSN) - delete_insn_chain (PREV_INSN (insn), insn); - else if (GET_CODE (insn) == CODE_LABEL) - ; - else if (GET_CODE (insn) != NOTE) - abort (); insn = next; } diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 7ca747ad7b7..25a5c9f78b5 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -963,9 +963,21 @@ force_nonfallthru_and_redirect (e, target) if (e->src->succ->succ_next) { /* Create the new structures. */ + + /* Position the new block correctly relative to loop notes. */ note = last_loop_beg_note (e->src->end); - jump_block - = create_basic_block (NEXT_INSN (note), NULL, e->src); + note = NEXT_INSN (note); + + /* ... and ADDR_VECs. */ + if (note != NULL + && GET_CODE (note) == CODE_LABEL + && NEXT_INSN (note) + && GET_CODE (NEXT_INSN (note)) == JUMP_INSN + && (GET_CODE (PATTERN (NEXT_INSN (note))) == ADDR_DIFF_VEC + || GET_CODE (PATTERN (NEXT_INSN (note))) == ADDR_VEC)) + note = NEXT_INSN (NEXT_INSN (note)); + + jump_block = create_basic_block (note, NULL, e->src); jump_block->count = e->count; jump_block->frequency = EDGE_FREQUENCY (e); jump_block->loop_depth = target->loop_depth; -- 2.11.4.GIT