This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] manage dom-walk_data initialization and finalization with constructors and destructors


From: Trevor Saunders <tsaunders@mozilla.com>

bootstrapped on x86_64-unknown-linux-gnu with same test results as unpatched r202185 ok?


* compare-elim.c (find_comparisons_in_bb): adjust
* domwalk.c (init_walk_dominator_tree): Convert to dom_walk_data constructor.
  (fini_walk_dominator_tree): Convert to dom_walk_data destructor.
* domwalk.h (dom_walk_data::dom_walk_data): declare
  (dom_walk_data::~dom_walk_data): declare
  (init_walk_dominator_tree): remove
  (fini_walk_dominator_tree): remove
* fwprop.c (build_single_def_use_links): adjust
* gimple-ssa-strength-reduction.c (execute_strength_reduction): adjust
* graphite-sese-to-poly.c (build_sese_conditions_after): adjust
* tree-into-ssa.c (rewrite_blocks): adjust
  (mark_def_site_blocks): adjust
* tree-ssa-dom.c (tree_ssa_dominator_optimize): adjust
* tree-ssa-dse.c (tree_ssa_dse): adjust
* tree-ssa-loop-im.c (determine_invariantness): adjust
  (move_computations): adjust
* tree-ssa-phiopt.c (get_non_trapping): adjust
* tree-ssa-pre.c (eliminate): adjust
* tree-ssa-strlen.c (tree_ssa_strlen): adjust
* tree-ssa-uncprop.c (tree_ssa_uncprop): adjust

diff --git a/gcc/compare-elim.c b/gcc/compare-elim.c
index e907376..8a1e68f 100644
--- a/gcc/compare-elim.c
+++ b/gcc/compare-elim.c
@@ -403,17 +403,13 @@ find_comparisons_in_bb (struct dom_walk_data *data ATTRIBUTE_UNUSED,
 static void
 find_comparisons (void)
 {
-  struct dom_walk_data data;
+  struct dom_walk_data data (CDI_DOMINATORS);
 
-  memset (&data, 0, sizeof(data));
-  data.dom_direction = CDI_DOMINATORS;
   data.before_dom_children = find_comparisons_in_bb;
 
   calculate_dominance_info (CDI_DOMINATORS);
 
-  init_walk_dominator_tree (&data);
   walk_dominator_tree (&data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&data);
 
   clear_aux_for_blocks ();
   free_dominance_info (CDI_DOMINATORS);
diff --git a/gcc/domwalk.c b/gcc/domwalk.c
index 8c1ddc6..bc7a93f 100644
--- a/gcc/domwalk.c
+++ b/gcc/domwalk.c
@@ -261,22 +261,26 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
   free (worklist);
 }
 
-void
-init_walk_dominator_tree (struct dom_walk_data *walk_data)
+dom_walk_data::dom_walk_data (cdi_direction direction)
+  : dom_direction(direction),
+  initialize_block_local_data (NULL),
+    before_dom_children (NULL),
+  after_dom_children (NULL),
+  global_data (NULL),
+    block_local_data_size (0)
 {
-  walk_data->free_block_data.create (0);
-  walk_data->block_data_stack.create (0);
+  free_block_data.create (0);
+  block_data_stack.create (0);
 }
 
-void
-fini_walk_dominator_tree (struct dom_walk_data *walk_data)
+dom_walk_data::~dom_walk_data ()
 {
-  if (walk_data->initialize_block_local_data)
+  if (initialize_block_local_data)
     {
-      while (walk_data->free_block_data.length () > 0)
-	free (walk_data->free_block_data.pop ());
+      while (free_block_data.length () > 0)
+	free (free_block_data.pop ());
     }
 
-  walk_data->free_block_data.release ();
-  walk_data->block_data_stack.release ();
+  free_block_data.release ();
+  block_data_stack.release ();
 }
diff --git a/gcc/domwalk.h b/gcc/domwalk.h
index 54b7f3c..94986c7 100644
--- a/gcc/domwalk.h
+++ b/gcc/domwalk.h
@@ -26,6 +26,10 @@ typedef void *void_p;
 
 struct dom_walk_data
 {
+public:
+  dom_walk_data (cdi_direction);
+  ~dom_walk_data ();
+
   /* This is the direction of the dominator tree we want to walk.  i.e.,
      if it is set to CDI_DOMINATORS, then we walk the dominator tree,
      if it is set to CDI_POST_DOMINATORS, then we walk the post
@@ -70,5 +74,3 @@ struct dom_walk_data
 };
 
 void walk_dominator_tree (struct dom_walk_data *, basic_block);
-void init_walk_dominator_tree (struct dom_walk_data *);
-void fini_walk_dominator_tree (struct dom_walk_data *);
diff --git a/gcc/fwprop.c b/gcc/fwprop.c
index 8fe02ac..e10754b 100644
--- a/gcc/fwprop.c
+++ b/gcc/fwprop.c
@@ -269,8 +269,6 @@ single_def_use_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
 static void
 build_single_def_use_links (void)
 {
-  struct dom_walk_data walk_data;
-
   /* We use the multiple definitions problem to compute our restricted
      use-def chains.  */
   df_set_flags (DF_EQ_NOTES);
@@ -291,14 +289,12 @@ build_single_def_use_links (void)
 
   /* Walk the dominator tree looking for single reaching definitions
      dominating the uses.  This is similar to how SSA form is built.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = single_def_use_enter_block;
   walk_data.after_dom_children = single_def_use_leave_block;
 
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&walk_data);
 
   BITMAP_FREE (local_lr);
   BITMAP_FREE (local_md);
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index e85e629..240b190 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -3429,8 +3429,6 @@ analyze_candidates_and_replace (void)
 static unsigned
 execute_strength_reduction (void)
 {
-  struct dom_walk_data walk_data;
-
   /* Create the obstack where candidates will reside.  */
   gcc_obstack_init (&cand_obstack);
 
@@ -3451,13 +3449,12 @@ execute_strength_reduction (void)
   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
 
   /* Set up callbacks for the generic dominator tree walker.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = find_candidates_in_block;
   walk_data.after_dom_children = NULL;
   walk_data.global_data = NULL;
   walk_data.block_local_data_size = 0;
-  init_walk_dominator_tree (&walk_data);
 
   /* Walk the CFG in predominator order looking for strength reduction
      candidates.  */
@@ -3472,8 +3469,6 @@ execute_strength_reduction (void)
   /* Analyze costs and make appropriate replacements.  */
   analyze_candidates_and_replace ();
 
-  /* Free resources.  */
-  fini_walk_dominator_tree (&walk_data);
   loop_optimizer_finalize ();
   base_cand_map.dispose ();
   obstack_free (&chain_obstack, NULL);
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index c4c3eb4..431431c 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -1289,7 +1289,6 @@ build_sese_conditions_after (struct dom_walk_data *dw_data,
 static void
 build_sese_conditions (sese region)
 {
-  struct dom_walk_data walk_data;
   vec<gimple> conditions;
   conditions.create (3);
   vec<gimple> cases;
@@ -1300,16 +1299,14 @@ build_sese_conditions (sese region)
   data.cases = &cases;
   data.region = region;
 
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = build_sese_conditions_before;
   walk_data.after_dom_children = build_sese_conditions_after;
   walk_data.global_data = &data;
   walk_data.block_local_data_size = 0;
 
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, SESE_ENTRY_BB (region));
-  fini_walk_dominator_tree (&walk_data);
 
   conditions.release ();
   cases.release ();
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 33d4ba8..30015e5 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -2183,15 +2183,11 @@ rewrite_update_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
 static void
 rewrite_blocks (basic_block entry, enum rewrite_mode what)
 {
-  struct dom_walk_data walk_data;
-
   /* Rewrite all the basic blocks in the program.  */
   timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
 
   /* Setup callbacks for the generic dominator tree walker.  */
-  memset (&walk_data, 0, sizeof (walk_data));
-
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
 
   if (what == REWRITE_ALL)
     {
@@ -2208,16 +2204,10 @@ rewrite_blocks (basic_block entry, enum rewrite_mode what)
 
   block_defs_stack.create (10);
 
-  /* Initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   /* Recursively walk the dominator tree rewriting each statement in
      each basic block.  */
   walk_dominator_tree (&walk_data, entry);
 
-  /* Finalize the dominator walker.  */
-  fini_walk_dominator_tree (&walk_data);
-
   /* Debugging dumps.  */
   if (dump_file && (dump_flags & TDF_STATS))
     {
@@ -2261,12 +2251,11 @@ mark_def_sites_block (struct dom_walk_data *walk_data, basic_block bb)
 static void
 mark_def_site_blocks (void)
 {
-  struct dom_walk_data walk_data;
   struct mark_def_sites_global_data mark_def_sites_global_data;
 
   /* Setup callbacks for the generic dominator tree walker to find and
      mark definition sites.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = mark_def_sites_block;
   walk_data.after_dom_children = NULL;
@@ -2280,15 +2269,9 @@ mark_def_site_blocks (void)
   /* We do not have any local data.  */
   walk_data.block_local_data_size = 0;
 
-  /* Initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   /* Recursively walk the dominator tree.  */
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
 
-  /* Finalize the dominator walker.  */
-  fini_walk_dominator_tree (&walk_data);
-
   /* We no longer need this bitmap, clear and free it.  */
   BITMAP_FREE (mark_def_sites_global_data.kills);
 }
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 691e6f9..7800aae 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -782,10 +782,6 @@ free_all_edge_infos (void)
 static unsigned int
 tree_ssa_dominator_optimize (void)
 {
-  struct dom_walk_data walk_data;
-
-  memset (&opt_stats, 0, sizeof (opt_stats));
-
   /* Create our hash tables.  */
   avail_exprs.create (1024);
   avail_exprs_stack.create (20);
@@ -793,7 +789,7 @@ tree_ssa_dominator_optimize (void)
   need_eh_cleanup = BITMAP_ALLOC (NULL);
 
   /* Setup callbacks for the generic dominator tree walker.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = dom_opt_enter_block;
   walk_data.after_dom_children = dom_opt_leave_block;
@@ -803,9 +799,6 @@ tree_ssa_dominator_optimize (void)
   walk_data.global_data = NULL;
   walk_data.block_local_data_size = 0;
 
-  /* Now initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   calculate_dominance_info (CDI_DOMINATORS);
   cfg_altered = false;
 
@@ -897,9 +890,6 @@ tree_ssa_dominator_optimize (void)
   /* Delete our main hashtable.  */
   avail_exprs.dispose ();
 
-  /* And finalize the dominator walker.  */
-  fini_walk_dominator_tree (&walk_data);
-
   /* Free asserted bitmaps and stacks.  */
   BITMAP_FREE (need_eh_cleanup);
 
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index 6578758..819e26f 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -313,8 +313,6 @@ dse_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
 static unsigned int
 tree_ssa_dse (void)
 {
-  struct dom_walk_data walk_data;
-
   need_eh_cleanup = BITMAP_ALLOC (NULL);
 
   renumber_gimple_stmt_uids ();
@@ -328,7 +326,7 @@ tree_ssa_dse (void)
 
   /* Dead store elimination is fundamentally a walk of the post-dominator
      tree and a backwards walk of statements within each block.  */
-  walk_data.dom_direction = CDI_POST_DOMINATORS;
+  dom_walk_data walk_data (CDI_POST_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = dse_enter_block;
   walk_data.after_dom_children = NULL;
@@ -336,15 +334,9 @@ tree_ssa_dse (void)
   walk_data.block_local_data_size = 0;
   walk_data.global_data = NULL;
 
-  /* Initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   /* Recursively walk the dominator tree.  */
   walk_dominator_tree (&walk_data, EXIT_BLOCK_PTR);
 
-  /* Finalize the dominator walker.  */
-  fini_walk_dominator_tree (&walk_data);
-
   /* Removal of stores may make some EH edges dead.  Purge such edges from
      the CFG as needed.  */
   if (!bitmap_empty_p (need_eh_cleanup))
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index e5e502b..e5aba3b 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -1185,15 +1185,10 @@ determine_invariantness_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
 static void
 determine_invariantness (void)
 {
-  struct dom_walk_data walk_data;
-
-  memset (&walk_data, 0, sizeof (struct dom_walk_data));
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.before_dom_children = determine_invariantness_stmt;
 
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&walk_data);
 }
 
 /* Hoist the statements in basic block BB out of the loops prescribed by
@@ -1337,17 +1332,13 @@ move_computations_stmt (struct dom_walk_data *dw_data,
 static unsigned int
 move_computations (void)
 {
-  struct dom_walk_data walk_data;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   unsigned int todo = 0;
 
-  memset (&walk_data, 0, sizeof (struct dom_walk_data));
   walk_data.global_data = &todo;
-  walk_data.dom_direction = CDI_DOMINATORS;
   walk_data.before_dom_children = move_computations_stmt;
 
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&walk_data);
 
   gsi_commit_edge_inserts ();
   if (need_ssa_update_p (cfun))
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index ddcd040..83102ec 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -1428,7 +1428,6 @@ static struct pointer_set_t *
 get_non_trapping (void)
 {
   struct pointer_set_t *nontrap;
-  struct dom_walk_data walk_data;
 
   nt_call_phase = 0;
   nontrap = pointer_set_create ();
@@ -1439,6 +1438,7 @@ get_non_trapping (void)
 
   /* Setup callbacks for the generic dominator tree walker.  */
   nontrap_set = nontrap;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.dom_direction = CDI_DOMINATORS;
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = nt_init_block;
@@ -1446,9 +1446,7 @@ get_non_trapping (void)
   walk_data.global_data = NULL;
   walk_data.block_local_data_size = 0;
 
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&walk_data);
   seen_ssa_names.dispose ();
 
   clear_aux_for_blocks ();
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 56b0573..04768d3 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -4416,7 +4416,6 @@ eliminate_leave_block (dom_walk_data *, basic_block)
 static unsigned int
 eliminate (void)
 {
-  struct dom_walk_data walk_data;
   gimple_stmt_iterator gsi;
   gimple stmt;
   unsigned i;
@@ -4430,15 +4429,13 @@ eliminate (void)
   el_avail.create (0);
   el_avail_stack.create (0);
 
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = eliminate_bb;
   walk_data.after_dom_children = eliminate_leave_block;
   walk_data.global_data = NULL;
   walk_data.block_local_data_size = 0;
-  init_walk_dominator_tree (&walk_data);
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
-  fini_walk_dominator_tree (&walk_data);
 
   el_avail.release ();
   el_avail_stack.release ();
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 5c21b92..6d97467 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -2040,8 +2040,6 @@ strlen_leave_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
 static unsigned int
 tree_ssa_strlen (void)
 {
-  struct dom_walk_data walk_data;
-
   ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names);
   max_stridx = 1;
   strinfo_pool = create_alloc_pool ("strinfo_struct pool",
@@ -2051,22 +2049,16 @@ tree_ssa_strlen (void)
 
   /* String length optimization is implemented as a walk of the dominator
      tree and a forward walk of statements within each block.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
+  dom_walk_data walk_data (CDI_DOMINATORS);
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = strlen_enter_block;
   walk_data.after_dom_children = strlen_leave_block;
   walk_data.block_local_data_size = 0;
   walk_data.global_data = NULL;
 
-  /* Initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   /* Recursively walk the dominator tree.  */
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
 
-  /* Finalize the dominator walker.  */
-  fini_walk_dominator_tree (&walk_data);
-
   ssa_ver_to_stridx.release ();
   free_alloc_pool (strinfo_pool);
   if (decl_to_stridxlist_htab.is_created ())
diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
index 837c4ea..780a27f 100644
--- a/gcc/tree-ssa-uncprop.c
+++ b/gcc/tree-ssa-uncprop.c
@@ -366,7 +366,6 @@ record_equiv (tree value, tree equivalence)
 static unsigned int
 tree_ssa_uncprop (void)
 {
-  struct dom_walk_data walk_data;
   basic_block bb;
 
   associate_equivalences_with_edges ();
@@ -379,24 +378,18 @@ tree_ssa_uncprop (void)
      dominance information.  */
   calculate_dominance_info (CDI_DOMINATORS);
 
+  dom_walk_data walk_data (CDI_DOMINATORS);
   /* Setup callbacks for the generic dominator tree walker.  */
-  walk_data.dom_direction = CDI_DOMINATORS;
   walk_data.initialize_block_local_data = NULL;
   walk_data.before_dom_children = uncprop_enter_block;
   walk_data.after_dom_children = uncprop_leave_block;
   walk_data.global_data = NULL;
   walk_data.block_local_data_size = 0;
 
-  /* Now initialize the dominator walker.  */
-  init_walk_dominator_tree (&walk_data);
-
   /* Recursively walk the dominator tree undoing unprofitable
      constant/copy propagations.  */
   walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
 
-  /* Finalize and clean up.  */
-  fini_walk_dominator_tree (&walk_data);
-
   /* EQUIV_STACK should already be empty at this point, so we just
      need to empty elements out of the hash table, free EQUIV_STACK,
      and cleanup the AUX field on the edges.  */
-- 
1.8.4.rc3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]