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 | |
parent | 36f291f7656bfdb4103fa3dfb3e60fbbca5b1169 (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/basic-block.h | 3 | ||||
-rw-r--r-- | gcc/cgraph.c | 4 | ||||
-rw-r--r-- | gcc/dominance.c | 38 | ||||
-rw-r--r-- | gcc/passes.c | 64 |
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. */ |