diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2010-10-14 11:39:07 +0400 |
---|---|---|
committer | Andrey Belevantsev <abel@gcc.gnu.org> | 2010-10-14 11:39:07 +0400 |
commit | 262d82326eb80275d4a93d1fa1be3a01fd7756c7 (patch) | |
tree | 40bdd5a81874bbd13e539fa496ff1cf907f8dc6b | |
parent | 6699b754e1e0464109d8f7dc163ba245ec59c881 (diff) | |
download | gcc-262d82326eb80275d4a93d1fa1be3a01fd7756c7.zip gcc-262d82326eb80275d4a93d1fa1be3a01fd7756c7.tar.gz gcc-262d82326eb80275d4a93d1fa1be3a01fd7756c7.tar.bz2 |
sel-sched-ir.c (maybe_tidy_empty_bb): Simplify comment.
* sel-sched-ir.c (maybe_tidy_empty_bb): Simplify comment.
(tidy_control_flow): Tidy vertical space.
(sel_remove_bb): New variable idx. Use it to remember the basic
block index before deleting the block.
(sel_remove_empty_bb): Remove dead code, simplify and insert to ...
(sel_merge_blocks): ... here.
* sel-sched-ir.h (sel_remove_empty_bb): Remove prototype.
From-SVN: r165453
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 66 | ||||
-rw-r--r-- | gcc/sel-sched-ir.h | 2 |
3 files changed, 23 insertions, 55 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 769074f..3735ff5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-10-14 Andrey Belevantsev <abel@ispras.ru> + + * sel-sched-ir.c (maybe_tidy_empty_bb): Simplify comment. + (tidy_control_flow): Tidy vertical space. + (sel_remove_bb): New variable idx. Use it to remember the basic + block index before deleting the block. + (sel_remove_empty_bb): Remove dead code, simplify and insert to ... + (sel_merge_blocks): ... here. + * sel-sched-ir.h (sel_remove_empty_bb): Remove prototype. + 2010-10-14 Jakub Jelinek <jakub@redhat.com> * cse.c (is_dead_reg): Change into inline function that is not diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index a9d7ccf..34d5f51 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -154,6 +154,7 @@ static void free_history_vect (VEC (expr_history_def, heap) **); static void move_bb_info (basic_block, basic_block); static void remove_empty_bb (basic_block, bool); +static void sel_merge_blocks (basic_block, basic_block); static void sel_remove_loop_preheader (void); static bool insn_is_the_only_one_in_bb_p (insn_t); @@ -3598,13 +3599,11 @@ maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) } } - /* If it is possible - merge BB with its predecessor. */ if (can_merge_blocks_p (bb->prev_bb, bb)) sel_merge_blocks (bb->prev_bb, bb); else - /* Otherwise this is a block without fallthru predecessor. - Just delete it. */ { + /* This is a block without fallthru predecessor. Just delete it. */ gcc_assert (pred_bb != NULL); if (in_current_region_p (pred_bb)) @@ -3700,7 +3699,6 @@ tidy_control_flow (basic_block xbb, bool full_tidying) else if (recompute_toporder_p) sel_recompute_toporder (); } - return changed; } @@ -5020,16 +5018,18 @@ sel_add_bb (basic_block bb) static void sel_remove_bb (basic_block bb, bool remove_from_cfg_p) { + unsigned idx = bb->index; + gcc_assert (bb != NULL && BB_NOTE_LIST (bb) == NULL_RTX); remove_bb_from_region (bb); return_bb_to_pool (bb); - bitmap_clear_bit (blocks_to_reschedule, bb->index); + bitmap_clear_bit (blocks_to_reschedule, idx); if (remove_from_cfg_p) delete_and_free_basic_block (bb); - rgn_setup_region (CONTAINING_RGN (bb->index)); + rgn_setup_region (CONTAINING_RGN (idx)); } /* Concatenate info of EMPTY_BB to info of MERGE_BB. */ @@ -5044,50 +5044,6 @@ move_bb_info (basic_block merge_bb, basic_block empty_bb) } -/* Remove an empty basic block EMPTY_BB. When MERGE_UP_P is true, we put - EMPTY_BB's note lists into its predecessor instead of putting them - into the successor. When REMOVE_FROM_CFG_P is true, also remove - the empty block. */ -void -sel_remove_empty_bb (basic_block empty_bb, bool merge_up_p, - bool remove_from_cfg_p) -{ - basic_block merge_bb; - - gcc_assert (sel_bb_empty_p (empty_bb)); - - if (merge_up_p) - { - merge_bb = empty_bb->prev_bb; - gcc_assert (EDGE_COUNT (empty_bb->preds) == 1 - && EDGE_PRED (empty_bb, 0)->src == merge_bb); - } - else - { - edge e; - edge_iterator ei; - - merge_bb = bb_next_bb (empty_bb); - - /* Redirect incoming edges (except fallthrough one) of EMPTY_BB to its - successor block. */ - for (ei = ei_start (empty_bb->preds); - (e = ei_safe_edge (ei)); ) - { - if (! (e->flags & EDGE_FALLTHRU)) - sel_redirect_edge_and_branch (e, merge_bb); - else - ei_next (&ei); - } - - gcc_assert (EDGE_COUNT (empty_bb->succs) == 1 - && EDGE_SUCC (empty_bb, 0)->dest == merge_bb); - } - - move_bb_info (merge_bb, empty_bb); - remove_empty_bb (empty_bb, remove_from_cfg_p); -} - /* Remove EMPTY_BB. If REMOVE_FROM_CFG_P is false, remove EMPTY_BB from region, but keep it in CFG. */ static void @@ -5387,12 +5343,16 @@ sel_create_recovery_block (insn_t orig_insn) } /* Merge basic block B into basic block A. */ -void +static void sel_merge_blocks (basic_block a, basic_block b) { - sel_remove_empty_bb (b, true, false); - merge_blocks (a, b); + gcc_assert (sel_bb_empty_p (b) + && EDGE_COUNT (b->preds) == 1 + && EDGE_PRED (b, 0)->src == b->prev_bb); + move_bb_info (b->prev_bb, b); + remove_empty_bb (b, false); + merge_blocks (a, b); change_loops_latches (b, a); } diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h index ee9061f..9ab0466 100644 --- a/gcc/sel-sched-ir.h +++ b/gcc/sel-sched-ir.h @@ -1618,11 +1618,9 @@ extern bool in_same_ebb_p (insn_t, insn_t); extern bool tidy_control_flow (basic_block, bool); extern void free_bb_note_pool (void); -extern void sel_remove_empty_bb (basic_block, bool, bool); extern void purge_empty_blocks (void); extern basic_block sel_split_edge (edge); extern basic_block sel_create_recovery_block (insn_t); -extern void sel_merge_blocks (basic_block, basic_block); extern bool sel_redirect_edge_and_branch (edge, basic_block); extern void sel_redirect_edge_and_branch_force (edge, basic_block); extern void sel_init_pipelining (void); |