summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-29 11:37:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-29 11:37:55 +0000
commite3f613cbbc91e2101e8ef6a89caf70aa28057e69 (patch)
tree223dccd8832873ad291ed8fecbf1eae8a75f55c0 /gcc
parent36f291f7656bfdb4103fa3dfb3e60fbbca5b1169 (diff)
downloadgcc-e3f613cbbc91e2101e8ef6a89caf70aa28057e69.tar.gz
dominance.c (free_dominance_info): Add overload with function parameter.
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/basic-block.h3
-rw-r--r--gcc/cgraph.c4
-rw-r--r--gcc/dominance.c38
-rw-r--r--gcc/passes.c64
5 files changed, 85 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ea10551f183..3ff2ff2bb82 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 82729b4c810..0bf6e877145 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -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);
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 51915424de1..5b773e30036 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -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;
}
diff --git a/gcc/dominance.c b/gcc/dominance.c
index ff0dfe6714f..7adec4f7376 100644
--- a/gcc/dominance.c
+++ b/gcc/dominance.c
@@ -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
diff --git a/gcc/passes.c b/gcc/passes.c
index 45f31d79521..7559a3ba3a1 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -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. */