]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
dominance.c (free_dominance_info): Add overload with function parameter.
authorRichard Biener <rguenther@suse.de>
Tue, 29 Apr 2014 11:37:55 +0000 (11:37 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 29 Apr 2014 11:37:55 +0000 (11:37 +0000)
2014-04-29  Richard Biener  <rguenther@suse.de>

* dominance.c (free_dominance_info): Add overload with
function parameter.
(dom_info_state): Likewise.
(dom_info_available_p): Likewise.
* basic-block.h (free_dominance_info, dom_info_state,
dom_info_available_p): Declare overloads.
* passes.c (execute_function_todo): Verify that verifiers
don't change dominator info state.  Drop dominator info
for IPA pass invocations.
* cgraph.c (release_function_body): Restore asserts that
dominator information is released.

From-SVN: r209892

gcc/ChangeLog
gcc/basic-block.h
gcc/cgraph.c
gcc/dominance.c
gcc/passes.c

index ea10551f183b8e9b152d1437c688592efbb97cae..3ff2ff2bb829d48291a03558acc814ac1c2174a3 100644 (file)
@@ -1,3 +1,17 @@
+2014-04-29  Richard Biener  <rguenther@suse.de>
+
+       * dominance.c (free_dominance_info): Add overload with
+       function parameter.
+       (dom_info_state): Likewise.
+       (dom_info_available_p): Likewise.
+       * basic-block.h (free_dominance_info, dom_info_state,
+       dom_info_available_p): Declare overloads.
+       * passes.c (execute_function_todo): Verify that verifiers
+       don't change dominator info state.  Drop dominator info
+       for IPA pass invocations.
+       * cgraph.c (release_function_body): Restore asserts that
+       dominator information is released.
+
 2014-04-29  Patrick Palka  <patrick@parcs.ath.cx>
 
        * doc/invoke.texi: Fix typo.
index 82729b4c810ebf7b0077d2b469591d9a458ddf8b..0bf6e8771456eaa14493a5b81ef6e982a10de624 100644 (file)
@@ -826,10 +826,13 @@ enum cdi_direction
   CDI_POST_DOMINATORS = 2
 };
 
+extern enum dom_state dom_info_state (function *, enum cdi_direction);
 extern enum dom_state dom_info_state (enum cdi_direction);
 extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
+extern bool dom_info_available_p (function *, enum cdi_direction);
 extern bool dom_info_available_p (enum cdi_direction);
 extern void calculate_dominance_info (enum cdi_direction);
+extern void free_dominance_info (function *, enum cdi_direction);
 extern void free_dominance_info (enum cdi_direction);
 extern basic_block nearest_common_dominator (enum cdi_direction,
                                             basic_block, basic_block);
index 51915424de156d37dd66a3911c5a9a56c842040a..5b773e30036084c6c1be8e4ba5572a40050c6b6f 100644 (file)
@@ -1696,8 +1696,8 @@ release_function_body (tree decl)
        }
       if (cfun->cfg)
        {
-         free_dominance_info (CDI_DOMINATORS);
-         free_dominance_info (CDI_POST_DOMINATORS);
+         gcc_assert (!dom_info_available_p (CDI_DOMINATORS));
+         gcc_assert (!dom_info_available_p (CDI_POST_DOMINATORS));
          clear_edges ();
          cfun->cfg = NULL;
        }
index ff0dfe6714f91b7198e9d2f802acca833d64802c..7adec4f7376dda2514683fcff5da7056dd7247a5 100644 (file)
@@ -681,24 +681,30 @@ calculate_dominance_info (enum cdi_direction dir)
 
 /* Free dominance information for direction DIR.  */
 void
-free_dominance_info (enum cdi_direction dir)
+free_dominance_info (function *fn, enum cdi_direction dir)
 {
   basic_block bb;
   unsigned int dir_index = dom_convert_dir_to_idx (dir);
 
-  if (!dom_info_available_p (dir))
+  if (!dom_info_available_p (fn, dir))
     return;
 
-  FOR_ALL_BB_FN (bb, cfun)
+  FOR_ALL_BB_FN (bb, fn)
     {
       et_free_tree_force (bb->dom[dir_index]);
       bb->dom[dir_index] = NULL;
     }
   et_free_pools ();
 
-  n_bbs_in_dom_tree[dir_index] = 0;
+  fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
+
+  fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
+}
 
-  dom_computed[dir_index] = DOM_NONE;
+void
+free_dominance_info (enum cdi_direction dir)
+{
+  free_dominance_info (cfun, dir);
 }
 
 /* Return the immediate dominator of basic block BB.  */
@@ -1461,11 +1467,19 @@ next_dom_son (enum cdi_direction dir, basic_block bb)
 /* Return dominance availability for dominance info DIR.  */
 
 enum dom_state
-dom_info_state (enum cdi_direction dir)
+dom_info_state (function *fn, enum cdi_direction dir)
 {
+  if (!fn->cfg)
+    return DOM_NONE;
+
   unsigned int dir_index = dom_convert_dir_to_idx (dir);
+  return fn->cfg->x_dom_computed[dir_index];
+}
 
-  return dom_computed[dir_index];
+enum dom_state
+dom_info_state (enum cdi_direction dir)
+{
+  return dom_info_state (cfun, dir);
 }
 
 /* Set the dominance availability for dominance info DIR to NEW_STATE.  */
@@ -1481,11 +1495,15 @@ set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
 /* Returns true if dominance information for direction DIR is available.  */
 
 bool
-dom_info_available_p (enum cdi_direction dir)
+dom_info_available_p (function *fn, enum cdi_direction dir)
 {
-  unsigned int dir_index = dom_convert_dir_to_idx (dir);
+  return dom_info_state (fn, dir) != DOM_NONE;
+}
 
-  return dom_computed[dir_index] != DOM_NONE;
+bool
+dom_info_available_p (enum cdi_direction dir)
+{
+  return dom_info_available_p (cfun, dir);
 }
 
 DEBUG_FUNCTION void
index 45f31d79521f89f3b0c8144757e3a0235acd5231..7559a3ba3a157cded1d1db1531c809fc91026e21 100644 (file)
@@ -1761,41 +1761,53 @@ execute_function_todo (function *fn, void *data)
     rebuild_cgraph_edges ();
 
   /* If we've seen errors do not bother running any verifiers.  */
-  if (seen_error ())
+  if (!seen_error ())
     {
-      pop_cfun ();
-      return;
-    }
-
 #if defined ENABLE_CHECKING
-  if (flags & TODO_verify_ssa)
-    {
-      verify_gimple_in_cfg (cfun);
-      verify_ssa (true);
-    }
-  else if (flags & TODO_verify_stmts)
-    verify_gimple_in_cfg (cfun);
-  if (flags & TODO_verify_flow)
-    verify_flow_info ();
-  if (flags & TODO_verify_il)
-    {
-      if (current_loops
-         && loops_state_satisfies_p (LOOP_CLOSED_SSA))
+      dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
+      dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
+
+      if (flags & TODO_verify_ssa)
        {
-         if (!(flags & (TODO_verify_stmts|TODO_verify_ssa)))
-           verify_gimple_in_cfg (cfun);
-         if (!(flags & TODO_verify_ssa))
-           verify_ssa (true);
-         verify_loop_closed_ssa (false);
+         verify_gimple_in_cfg (cfun);
+         verify_ssa (true);
        }
-    }
-  if (flags & TODO_verify_rtl_sharing)
-    verify_rtl_sharing ();
+      else if (flags & TODO_verify_stmts)
+       verify_gimple_in_cfg (cfun);
+      if (flags & TODO_verify_flow)
+       verify_flow_info ();
+      if (flags & TODO_verify_il)
+       {
+         if (current_loops
+             && loops_state_satisfies_p (LOOP_CLOSED_SSA))
+           {
+             if (!(flags & (TODO_verify_stmts|TODO_verify_ssa)))
+               verify_gimple_in_cfg (cfun);
+             if (!(flags & TODO_verify_ssa))
+               verify_ssa (true);
+             verify_loop_closed_ssa (false);
+           }
+       }
+      if (flags & TODO_verify_rtl_sharing)
+       verify_rtl_sharing ();
+
+      /* Make sure verifiers don't change dominator state.  */
+      gcc_assert (dom_info_state (fn, CDI_DOMINATORS) == pre_verify_state);
+      gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == pre_verify_pstate);
 #endif
+    }
 
   fn->last_verified = flags & TODO_verify_all;
 
   pop_cfun ();
+
+  /* For IPA passes make sure to release dominator info, it can be
+     computed by non-verifying TODOs.  */
+  if (!cfun)
+    {
+      free_dominance_info (fn, CDI_DOMINATORS);
+      free_dominance_info (fn, CDI_POST_DOMINATORS);
+    }
 }
 
 /* Perform all TODO actions.  */