aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/bb-reorder.c14
-rw-r--r--gcc/cfglayout.c15
-rw-r--r--gcc/cfgrtl.c16
4 files changed, 35 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 758abed..3bbfef1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2002-06-21 Richard Henderson <rth@redhat.com>
+
+ * 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 <ro@TechFak.Uni-Bielefeld.DE>
* config/sparc/t-linux64 (EXTRA_MULTILIB_PARTS): Add crtfastmath.o.
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 6ae4c76..24c41e5 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 bd58972..70b7b17 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 7ca747a..25a5c9f 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;