diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-28 10:11:01 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-28 10:11:01 +0000 |
commit | 308f9b7994783bcf7867e5c06fe3a88bd01d847f (patch) | |
tree | 8d5067250a1945f16e7442da0ebfa33bcd46322d /gcc/cfgcleanup.c | |
parent | ea5356cdbd7b2cbdb81a2f971be4ca11ce8fdda2 (diff) | |
download | gcc-308f9b7994783bcf7867e5c06fe3a88bd01d847f.tar.gz |
* basic-block.h (BB_REACHABLE): Renumber.
(BB_DIRTY, BB_NEW): New flags.
(clear_bb_flags): Declare.
(update_life_info_in_dirty_blocks): Declare.
* cfg.c (clear_bb_flags): New function.
* cfgrtl.c (create_basic_block_structure): Set flags to BB_NEW.
* emit-rtl.c (add_insn_after, add_insn_before, remove_insn,
reorder_insns, emit_insn_after): Mark block as dirty.
* flow.c (update_life_info): Fix clearing of PROP_LOG_LINKS.
(update_life_info_in_dirty_blocks): New function.
* recog.c (apply_change_group): Dirtify block.
* cse.c (cse_insn): Reorder emitting of jump insn to keep
cfg consistent.
* gcse.c (delete_null_pointer_checks): Likewise.
* toplev.c (dump_file_index): Move cse2 after bp,
add DFI_null
(dump_file_info): Similary.
(rest_of_compilation): Avoid most of CFG rebuilds;
do first if converision after null pointer checks, do cse2
after branch prediction; avoid full liveness rebuild after
initializing subregs.
* invoke.texi (-d options): Document -du, renumber.
* cfgcleanup.c (bb_flags): Remove BB_UPDATE_LIFE.
(notice_new_block): Do not set BB_UPDATE_LIFE.
(try_forward_edges, merge_blocks_move_predecessor_nojumps,
merge_blocks_move_successor_nojumps, merge_blocks,
try_crossjump_to_edge): Likewise.
(try_optimize_cfg): Likewise; use update_life_info_in_dirty_blocks.
* cfgrtl.c (merge_blocks_nomove): Copy b's flags to a.
* ifcvt.c (SET_UPDATE_LIFE, UPDATE_LIFE): Kill.
(merge_of_block): Do not use life_data_ok.
(find_if_case_1): Do not use SET_UPDATE_LIFE.
(if_convert): Use BB_DIRTY mechanizm to update life.
* lcm.c (optimize_mode_switching): Update
update_life_info_in_dirty_blocks
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50127 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r-- | gcc/cfgcleanup.c | 48 |
1 files changed, 9 insertions, 39 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index d9f9cf261e5..017a4aa5390 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -52,11 +52,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA enum bb_flags { - /* Set if life info needs to be recomputed for given BB. */ - BB_UPDATE_LIFE = 1, /* Set if BB is the forwarder block to avoid too many forwarder_block_p calls. */ - BB_FORWARDER_BLOCK = 2 + BB_FORWARDER_BLOCK = 1 }; #define BB_FLAGS(BB) (enum bb_flags) (BB)->aux @@ -101,7 +99,6 @@ notice_new_block (bb) if (!bb) return; - BB_SET_FLAG (bb, BB_UPDATE_LIFE); if (forwarder_block_p (bb)) BB_SET_FLAG (bb, BB_FORWARDER_BLOCK); } @@ -519,7 +516,6 @@ try_forward_edges (mode, b) if (!FORWARDER_BLOCK_P (b) && forwarder_block_p (b)) BB_SET_FLAG (b, BB_FORWARDER_BLOCK); - BB_SET_FLAG (b, BB_UPDATE_LIFE); do { @@ -663,7 +659,7 @@ merge_blocks_move_predecessor_nojumps (a, b) /* Scramble the insn chain. */ if (a->end != PREV_INSN (b->head)) reorder_insns_nobb (a->head, a->end, PREV_INSN (b->head)); - BB_SET_FLAG (a, BB_UPDATE_LIFE); + a->flags |= BB_DIRTY; if (rtl_dump_file) fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n", @@ -731,7 +727,6 @@ merge_blocks_move_successor_nojumps (a, b) /* Now blocks A and B are contiguous. Merge them. */ merge_blocks_nomove (a, b); - BB_SET_FLAG (a, BB_UPDATE_LIFE); if (rtl_dump_file) fprintf (rtl_dump_file, "Moved block %d after %d and merged.\n", @@ -760,12 +755,6 @@ merge_blocks (e, b, c, mode) if (e->flags & EDGE_FALLTHRU) { int b_index = b->index, c_index = c->index; - /* We need to update liveness in case C already has broken liveness - or B ends by conditional jump to next instructions that will be - removed. */ - if ((BB_FLAGS (c) & BB_UPDATE_LIFE) - || GET_CODE (b->end) == JUMP_INSN) - BB_SET_FLAG (b, BB_UPDATE_LIFE); merge_blocks_nomove (b, c); update_forwarder_flag (b); @@ -831,8 +820,6 @@ merge_blocks (e, b, c, mode) bb = force_nonfallthru (b_fallthru_edge); if (bb) notice_new_block (bb); - else - BB_SET_FLAG (b_fallthru_edge->src, BB_UPDATE_LIFE); } merge_blocks_move_predecessor_nojumps (b, c); @@ -1418,7 +1405,6 @@ try_crossjump_to_edge (mode, e1, e2) remove_edge (src1->succ); make_single_succ_edge (src1, redirect_to, 0); - BB_SET_FLAG (src1, BB_UPDATE_LIFE); update_forwarder_flag (src1); return true; @@ -1532,6 +1518,9 @@ try_optimize_cfg (mode) for (i = 0; i < n_basic_blocks; i++) update_forwarder_flag (BASIC_BLOCK (i)); + if (mode & CLEANUP_UPDATE_LIFE) + clear_bb_flags (); + if (! (* targetm.cannot_modify_jumps_p) ()) { /* Attempt to merge blocks as made possible by edge removal. If @@ -1633,10 +1622,7 @@ try_optimize_cfg (mode) /* Simplify branch over branch. */ if ((mode & CLEANUP_EXPENSIVE) && try_simplify_condjump (b)) - { - BB_SET_FLAG (b, BB_UPDATE_LIFE); - changed_here = true; - } + changed_here = true; /* If B has a single outgoing edge, but uses a non-trivial jump instruction without side-effects, we @@ -1649,7 +1635,6 @@ try_optimize_cfg (mode) && onlyjump_p (b->end) && redirect_edge_and_branch (b->succ, b->succ->dest)) { - BB_SET_FLAG (b, BB_UPDATE_LIFE); update_forwarder_flag (b); changed_here = true; } @@ -1689,24 +1674,9 @@ try_optimize_cfg (mode) remove_fake_edges (); if ((mode & CLEANUP_UPDATE_LIFE) && changed_overall) - { - bool found = 0; - - blocks = sbitmap_alloc (n_basic_blocks); - sbitmap_zero (blocks); - for (i = 0; i < n_basic_blocks; i++) - if (BB_FLAGS (BASIC_BLOCK (i)) & BB_UPDATE_LIFE) - { - found = 1; - SET_BIT (blocks, i); - } - - if (found) - update_life_info (blocks, UPDATE_LIFE_GLOBAL, - PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE - | PROP_KILL_DEAD_CODE); - sbitmap_free (blocks); - } + update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL, + PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE + | PROP_KILL_DEAD_CODE | PROP_LOG_LINKS); for (i = 0; i < n_basic_blocks; i++) BASIC_BLOCK (i)->aux = NULL; |