diff options
author | Richard Biener <rguenther@suse.de> | 2014-04-29 11:37:55 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-04-29 11:37:55 +0000 |
commit | e3f613cbbc91e2101e8ef6a89caf70aa28057e69 (patch) | |
tree | 223dccd8832873ad291ed8fecbf1eae8a75f55c0 /gcc/passes.c | |
parent | 36f291f7656bfdb4103fa3dfb3e60fbbca5b1169 (diff) | |
download | gcc-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.c | 64 |
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. */ |