diff options
author | Jan Hubicka <jh@suse.cz> | 2005-06-17 13:53:59 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-06-17 11:53:59 +0000 |
commit | 79748d710383e205e3c045b55ceda1b3e15ba945 (patch) | |
tree | f7c47b1da51f34a89b481ca4759e39742ca0cb7e /gcc/tree-optimize.c | |
parent | bb2b2a247232830b94d9dc3daa914913756ac847 (diff) | |
download | gcc-79748d710383e205e3c045b55ceda1b3e15ba945.tar.gz |
tree-optimize.c (execute_ipa_pass_list): New.
* tree-optimize.c (execute_ipa_pass_list): New.
(ipa_passes): Use it.
From-SVN: r101126
Diffstat (limited to 'gcc/tree-optimize.c')
-rw-r--r-- | gcc/tree-optimize.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index 0812b6422c5..a33a7104d78 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -50,7 +50,6 @@ Boston, MA 02111-1307, USA. */ #include "cfgloop.h" #include "except.h" - /* Global variables used to communicate with passes. */ int dump_flags; bool in_gimple_form; @@ -665,7 +664,35 @@ execute_pass_list (struct tree_opt_pass *pass) do { if (execute_one_pass (pass) && pass->sub) - execute_pass_list (pass->sub); + execute_pass_list (pass->sub); + pass = pass->next; + } + while (pass); +} + +/* Same as execute_pass_list but assume that subpasses of IPA passes + are local passes. */ +static void +execute_ipa_pass_list (struct tree_opt_pass *pass) +{ + do + { + if (execute_one_pass (pass) && pass->sub) + { + struct cgraph_node *node; + for (node = cgraph_nodes; node; node = node->next) + if (node->analyzed) + { + push_cfun (DECL_STRUCT_FUNCTION (node->decl)); + current_function_decl = node->decl; + execute_pass_list (pass); + free_dominance_info (CDI_DOMINATORS); + free_dominance_info (CDI_POST_DOMINATORS); + current_function_decl = NULL; + pop_cfun (); + ggc_collect (); + } + } pass = pass->next; } while (pass); @@ -692,8 +719,10 @@ tree_lowering_passes (tree fn) void ipa_passes (void) { + cfun = NULL; + tree_register_cfg_hooks (); bitmap_obstack_initialize (NULL); - execute_pass_list (all_ipa_passes); + execute_ipa_pass_list (all_ipa_passes); bitmap_obstack_release (NULL); } |