aboutsummaryrefslogtreecommitdiff
path: root/gcc/passes.c
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/passes.c
parent36f291f7656bfdb4103fa3dfb3e60fbbca5b1169 (diff)
downloadgcc-e3f613cbbc91e2101e8ef6a89caf70aa28057e69.zip
gcc-e3f613cbbc91e2101e8ef6a89caf70aa28057e69.tar.gz
gcc-e3f613cbbc91e2101e8ef6a89caf70aa28057e69.tar.bz2
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/passes.c')
-rw-r--r--gcc/passes.c64
1 files changed, 38 insertions, 26 deletions
diff --git a/gcc/passes.c b/gcc/passes.c
index 45f31d7..7559a3b 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. */