aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-25 20:34:33 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-25 20:34:33 -0700
commitf008a564f936b295dd747d9cd1f6ef43f780ac90 (patch)
tree6f09bc3a30550e07ac1b44c5aa7edd9d40f1e562 /gcc/flow.c
parent49080ead6d708777280760aeab58b8c626b589c1 (diff)
downloadgcc-f008a564f936b295dd747d9cd1f6ef43f780ac90.zip
gcc-f008a564f936b295dd747d9cd1f6ef43f780ac90.tar.gz
gcc-f008a564f936b295dd747d9cd1f6ef43f780ac90.tar.bz2
bb-reorder.c (reorder_block_def): Reorder elements for size.
* bb-reorder.c (reorder_block_def): Reorder elements for size. Remove add_jump; add next; replace flags with visited. (rbd_init): Remove. (REORDER_BLOCK_HEAD, REORDER_BLOCK_VISITED): Remove. (REORDER_BLOCK_FLAGS, REORDER_BLOCK_INDEX): Remove. (REORDER_BLOCK_ADD_JUMP, REORDER_BLOCK_EFF_HEAD): Remove. (REORDER_BLOCK_EFF_END, REORDER_BLOCK_SCOPE): Remove. (RBI): New. (reorder_index, reorder_last_visited): Remove. (skip_insns_after_block): Rewrite to use a switch. (get_common_dest): Remove. (chain_reorder_blocks): Remove. (record_effective_endpoints): Split out from reorder_basic_blocks. (make_reorder_chain): Likewise. Loop until all blocks are placed. (make_reorder_chain_1): Renamed from old make_reorder_chain. Only construct the reorder chain, do not move insns. Try harder to tail recurse. (label_for_bb, emit_jump_to_block_after): New. (fixup_reorder_chain): Use them. Do bulk block movement. Examine and adjust the jump insns appropriately. Fixup basic_block_info. (verify_insn_chain): Always define. (relate_bbs_with_scopes): Call xmalloc, not xcalloc. Fix thinko in allocation size. (make_new_scope): Don't write zeros to calloc'd space. (build_scope_forest): Rely on xrealloc to DTRT. (reorder_basic_blocks): Don't build loop nest. Don't fail if profile_arc_flag. Streamline EH test. * flow.c (redirect_edge_succ, redirect_edge_pred): New. * basic-block.h: Declare them. From-SVN: r34186
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index b4ae779..9a90493 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -6789,6 +6789,46 @@ add_noreturn_fake_exit_edges ()
if (BASIC_BLOCK (x)->succ == NULL)
make_edge (NULL, BASIC_BLOCK (x), EXIT_BLOCK_PTR, EDGE_FAKE);
}
+
+/* Redirect an edge's successor from one block to another. */
+
+void
+redirect_edge_succ (e, new_succ)
+ edge e;
+ basic_block new_succ;
+{
+ edge *pe;
+
+ /* Disconnect the edge from the old successor block. */
+ for (pe = &e->dest->pred; *pe != e ; pe = &(*pe)->pred_next)
+ continue;
+ *pe = (*pe)->pred_next;
+
+ /* Reconnect the edge to the new successor block. */
+ e->pred_next = new_succ->pred;
+ new_succ->pred = e;
+ e->dest = new_succ;
+}
+
+/* Redirect an edge's predecessor from one block to another. */
+
+void
+redirect_edge_pred (e, new_pred)
+ edge e;
+ basic_block new_pred;
+{
+ edge *pe;
+
+ /* Disconnect the edge from the old predecessor block. */
+ for (pe = &e->src->succ; *pe != e ; pe = &(*pe)->succ_next)
+ continue;
+ *pe = (*pe)->succ_next;
+
+ /* Reconnect the edge to the new predecessor block. */
+ e->succ_next = new_pred->succ;
+ new_pred->succ = e;
+ e->src = new_pred;
+}
/* Dump the list of basic blocks in the bitmap NODES. */
static void