summaryrefslogtreecommitdiff
path: root/gcc/tree-optimize.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2005-06-17 13:53:59 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2005-06-17 11:53:59 +0000
commit79748d710383e205e3c045b55ceda1b3e15ba945 (patch)
treef7c47b1da51f34a89b481ca4759e39742ca0cb7e /gcc/tree-optimize.c
parentbb2b2a247232830b94d9dc3daa914913756ac847 (diff)
downloadgcc-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.c35
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);
}