summaryrefslogtreecommitdiff
path: root/gcc/passes.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2008-04-05 05:50:19 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2008-04-05 05:50:19 +0000
commit5d48fdb4dbceb72adc19d5cbd8d4a5d9036bdfc3 (patch)
tree05ef0b50d598e815a4b64cd826007fccbcd7a118 /gcc/passes.c
parenteb5bb63e87541850ca26e29f0364fbcaaae1306d (diff)
downloadgcc-5d48fdb4dbceb72adc19d5cbd8d4a5d9036bdfc3.tar.gz
* tree-dump.c (dump_enable_all): Remove prototype; do not accept
letter argument. (dump_files): Update. (enable_rtl_dump_file): Do not accept letter argument. * tree-pass.h (dump_file_info): Remove letter argument. * toplev.c (decode_d_option): Update -da handling. * toplev.h (enable_rtl_dump_file): Update prototype. * passes.c (register_one_dump_file): Do not accept IPA argument; work it out based on pass type. (register_dump_files_1): Likewise. (init_optimization_passes): Update register_one_dump_file calls. (execute_one_pass): Sanity check that IPA passes are called at IPA level and RTL passes at RTL level. (execute_pass_list): IPA pass can not be after or subpass of GIMPLE/RTL pass. (execute_ipa_pass_list): Handle IPA subpasses of IPA subpasses and disallov RTL subpasses of IPA subpasses. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133930 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/passes.c')
-rw-r--r--gcc/passes.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/gcc/passes.c b/gcc/passes.c
index 833bdbd0134..b8ed3e6f76a 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -338,7 +338,7 @@ struct opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes;
enabled or not. */
static void
-register_one_dump_file (struct opt_pass *pass, bool ipa, int properties)
+register_one_dump_file (struct opt_pass *pass)
{
char *dot_name, *flag_name, *glob_name;
const char *prefix;
@@ -352,9 +352,9 @@ register_one_dump_file (struct opt_pass *pass, bool ipa, int properties)
? 1 : pass->static_pass_number));
dot_name = concat (".", pass->name, num, NULL);
- if (ipa)
+ if (pass->type == SIMPLE_IPA_PASS)
prefix = "ipa-", flags = TDF_IPA;
- else if (properties & PROP_trees)
+ else if (pass->type == GIMPLE_PASS)
prefix = "tree-", flags = TDF_TREE;
else
prefix = "rtl-", flags = TDF_RTL;
@@ -368,7 +368,7 @@ register_one_dump_file (struct opt_pass *pass, bool ipa, int properties)
/* Recursive worker function for register_dump_files. */
static int
-register_dump_files_1 (struct opt_pass *pass, bool ipa, int properties)
+register_dump_files_1 (struct opt_pass *pass, int properties)
{
do
{
@@ -376,11 +376,10 @@ register_dump_files_1 (struct opt_pass *pass, bool ipa, int properties)
& ~pass->properties_destroyed;
if (pass->name)
- register_one_dump_file (pass, ipa, new_properties);
+ register_one_dump_file (pass);
if (pass->sub)
- new_properties = register_dump_files_1 (pass->sub, false,
- new_properties);
+ new_properties = register_dump_files_1 (pass->sub, new_properties);
/* If we have a gate, combine the properties that we could have with
and without the pass being examined. */
@@ -396,16 +395,15 @@ register_dump_files_1 (struct opt_pass *pass, bool ipa, int properties)
return properties;
}
-/* Register the dump files for the pipeline starting at PASS. IPA is
- true if the pass is inter-procedural, and PROPERTIES reflects the
- properties that are guaranteed to be available at the beginning of
- the pipeline. */
+/* Register the dump files for the pipeline starting at PASS.
+ PROPERTIES reflects the properties that are guaranteed to be available at
+ the beginning of the pipeline. */
static void
-register_dump_files (struct opt_pass *pass, bool ipa, int properties)
+register_dump_files (struct opt_pass *pass,int properties)
{
pass->properties_required |= properties;
- register_dump_files_1 (pass, ipa, properties);
+ register_dump_files_1 (pass, properties);
}
/* Add a pass to the pass list. Duplicate the pass if it's already
@@ -793,12 +791,12 @@ init_optimization_passes (void)
#undef NEXT_PASS
/* Register the passes with the tree dump code. */
- register_dump_files (all_lowering_passes, false, PROP_gimple_any);
+ register_dump_files (all_lowering_passes, PROP_gimple_any);
all_lowering_passes->todo_flags_start |= TODO_set_props;
- register_dump_files (all_ipa_passes, true,
+ register_dump_files (all_ipa_passes,
PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
| PROP_cfg);
- register_dump_files (all_passes, false,
+ register_dump_files (all_passes,
PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
| PROP_cfg);
}
@@ -1071,6 +1069,17 @@ execute_one_pass (struct opt_pass *pass)
bool initializing_dump;
unsigned int todo_after = 0;
+ /* IPA passes are executed on whole program, so cfun should be NULL.
+ Ohter passes needs function context set. */
+ if (pass->type == SIMPLE_IPA_PASS)
+ gcc_assert (!cfun && !current_function_decl);
+ else
+ {
+ gcc_assert (cfun && current_function_decl);
+ gcc_assert (!(cfun->curr_properties & PROP_trees)
+ || pass->type != RTL_PASS);
+ }
+
current_pass = pass;
/* See if we're supposed to run this pass. */
if (pass->gate && !pass->gate ())
@@ -1177,6 +1186,8 @@ execute_pass_list (struct opt_pass *pass)
{
do
{
+ gcc_assert (pass->type == GIMPLE_PASS
+ || pass->type == RTL_PASS);
if (execute_one_pass (pass) && pass->sub)
execute_pass_list (pass->sub);
pass = pass->next;
@@ -1193,9 +1204,17 @@ execute_ipa_pass_list (struct opt_pass *pass)
{
gcc_assert (!current_function_decl);
gcc_assert (!cfun);
+ gcc_assert (pass->type == SIMPLE_IPA_PASS);
if (execute_one_pass (pass) && pass->sub)
- do_per_function_toporder ((void (*)(void *))execute_pass_list,
- pass->sub);
+ {
+ if (pass->sub->type == GIMPLE_PASS)
+ do_per_function_toporder ((void (*)(void *))execute_pass_list,
+ pass->sub);
+ else if (pass->sub->type == SIMPLE_IPA_PASS)
+ execute_ipa_pass_list (pass->sub);
+ else
+ gcc_unreachable ();
+ }
if (!current_function_decl)
cgraph_process_new_functions ();
pass = pass->next;