Patchwork 02/03: Clean up sel_merge_blocks

login
register
mail settings
Submitter Andrey Belevantsev
Date Oct. 4, 2010, 3:42 p.m.
Message ID <4CA9F5CD.20100@ispras.ru>
Download mbox | patch
Permalink /patch/66704/
State New
Headers show

Comments

Andrey Belevantsev - Oct. 4, 2010, 3:42 p.m.
Hello,

sel_merge_blocks calls sel_remove_empty_bb which behavior is customized via 
merge_up_p parameter.  However, it is always true now, which allows 
simplifying the latter function to a single assert.  The former function is 
also made static.  Finally, sel_remove_bb uses basic block index after the 
block itself has been removed, it is better to avoid this.  Bootstrapped 
with the other patches for 43603, ok for trunk?

	2010-10-04  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.
Richard Henderson - Oct. 4, 2010, 4:35 p.m.
On 10/04/2010 08:42 AM, Andrey Belevantsev wrote:
> Hello,
> 
> sel_merge_blocks calls sel_remove_empty_bb which behavior is customized via merge_up_p parameter.  However, it is always true now, which allows simplifying the latter function to a single assert.  The former function is also made static.  Finally, sel_remove_bb uses basic block index after the block itself has been removed, it is better to avoid this.  Bootstrapped with the other patches for 43603, ok for trunk?
> 
>     2010-10-04  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.
> 

Ok.

>    else
> -    /* Otherwise this is a block without fallthru predecessor.
> -       Just delete it.  */
> +    /* This is a block without fallthru predecessor.  Just delete it.  */
>      {

Coding style puts the comment inside the {, indented appropriately.


r~

Patch

diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index 3c18a7b..3146a26 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -153,6 +153,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);
@@ -3597,12 +3598,10 @@  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);
 
@@ -3699,7 +3698,6 @@  tidy_control_flow (basic_block xbb, bool full_tidying)
       else if (recompute_toporder_p)
 	sel_recompute_toporder ();
     }
-
   return changed;
 }
 
@@ -5019,16 +5017,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.  */
@@ -5043,50 +5043,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
@@ -5386,12 +5342,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);