| Index: gcc/gcc/tree-optimize.c
|
| diff --git a/gcc/gcc/tree-optimize.c b/gcc/gcc/tree-optimize.c
|
| index 2640167face06836b9f7a4452e3e4f46bd1f5a0f..42e7d10b128229a47aca55c00beb8ae420a94c27 100644
|
| --- a/gcc/gcc/tree-optimize.c
|
| +++ b/gcc/gcc/tree-optimize.c
|
| @@ -1,5 +1,5 @@
|
| /* Top-level control of tree optimizations.
|
| - Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008
|
| + Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
|
| Free Software Foundation, Inc.
|
| Contributed by Diego Novillo <dnovillo@redhat.com>
|
|
|
| @@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
|
| #include "graph.h"
|
| #include "cfgloop.h"
|
| #include "except.h"
|
| +#include "plugin.h"
|
|
|
|
|
| /* Gate: execute, or not, all of the non-trivial optimizations. */
|
| @@ -57,7 +58,7 @@ static bool
|
| gate_all_optimizations (void)
|
| {
|
| return (optimize >= 1
|
| - /* Don't bother doing anything if the program has errors.
|
| + /* Don't bother doing anything if the program has errors.
|
| We have to pass down the queue if we already went into SSA */
|
| && (!(errorcount || sorrycount) || gimple_in_ssa_p (cfun)));
|
| }
|
| @@ -66,13 +67,13 @@ struct gimple_opt_pass pass_all_optimizations =
|
| {
|
| {
|
| GIMPLE_PASS,
|
| - NULL, /* name */
|
| + "*all_optimizations", /* name */
|
| gate_all_optimizations, /* gate */
|
| NULL, /* execute */
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| 0, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| @@ -87,7 +88,7 @@ static bool
|
| gate_all_early_local_passes (void)
|
| {
|
| /* Don't bother doing anything if the program has errors. */
|
| - return (!errorcount && !sorrycount);
|
| + return (!errorcount && !sorrycount && !in_lto_p);
|
| }
|
|
|
| struct simple_ipa_opt_pass pass_early_local_passes =
|
| @@ -100,7 +101,7 @@ struct simple_ipa_opt_pass pass_early_local_passes =
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| 0, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| @@ -141,7 +142,7 @@ struct gimple_opt_pass pass_all_early_optimizations =
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| 0, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| @@ -172,7 +173,7 @@ struct gimple_opt_pass pass_cleanup_cfg =
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| PROP_cfg, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| @@ -201,84 +202,37 @@ struct gimple_opt_pass pass_cleanup_cfg_post_optimizing =
|
| {
|
| {
|
| GIMPLE_PASS,
|
| - "final_cleanup", /* name */
|
| + "optimized", /* name */
|
| NULL, /* gate */
|
| execute_cleanup_cfg_post_optimizing, /* execute */
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| PROP_cfg, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| 0, /* todo_flags_start */
|
| TODO_dump_func /* todo_flags_finish */
|
| + | TODO_remove_unused_locals
|
| }
|
| };
|
|
|
| /* Pass: do the actions required to finish with tree-ssa optimization
|
| passes. */
|
|
|
| -static unsigned int
|
| +unsigned int
|
| execute_free_datastructures (void)
|
| {
|
| free_dominance_info (CDI_DOMINATORS);
|
| free_dominance_info (CDI_POST_DOMINATORS);
|
|
|
| - /* Remove the ssa structures. */
|
| - if (cfun->gimple_df)
|
| - delete_tree_ssa ();
|
| - return 0;
|
| -}
|
| -
|
| -struct gimple_opt_pass pass_free_datastructures =
|
| -{
|
| - {
|
| - GIMPLE_PASS,
|
| - NULL, /* name */
|
| - NULL, /* gate */
|
| - execute_free_datastructures, /* execute */
|
| - NULL, /* sub */
|
| - NULL, /* next */
|
| - 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| - PROP_cfg, /* properties_required */
|
| - 0, /* properties_provided */
|
| - 0, /* properties_destroyed */
|
| - 0, /* todo_flags_start */
|
| - 0 /* todo_flags_finish */
|
| - }
|
| -};
|
| -/* Pass: free cfg annotations. */
|
| -
|
| -static unsigned int
|
| -execute_free_cfg_annotations (void)
|
| -{
|
| /* And get rid of annotations we no longer need. */
|
| delete_tree_cfg_annotations ();
|
|
|
| return 0;
|
| }
|
|
|
| -struct gimple_opt_pass pass_free_cfg_annotations =
|
| -{
|
| - {
|
| - GIMPLE_PASS,
|
| - NULL, /* name */
|
| - NULL, /* gate */
|
| - execute_free_cfg_annotations, /* execute */
|
| - NULL, /* sub */
|
| - NULL, /* next */
|
| - 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| - PROP_cfg, /* properties_required */
|
| - 0, /* properties_provided */
|
| - 0, /* properties_destroyed */
|
| - 0, /* todo_flags_start */
|
| - 0 /* todo_flags_finish */
|
| - }
|
| -};
|
| -
|
| /* Pass: fixup_cfg. IPA passes, compilation of earlier functions or inlining
|
| might have changed some properties, such as marked functions nothrow.
|
| Remove redundant edges and basic blocks, and create new ones if necessary.
|
| @@ -292,39 +246,55 @@ execute_fixup_cfg (void)
|
| basic_block bb;
|
| gimple_stmt_iterator gsi;
|
| int todo = gimple_in_ssa_p (cfun) ? TODO_verify_ssa : 0;
|
| + gcov_type count_scale;
|
| + edge e;
|
| + edge_iterator ei;
|
|
|
| - cfun->after_inlining = true;
|
| - cfun->always_inline_functions_inlined = true;
|
| -
|
| - if (cfun->eh)
|
| - FOR_EACH_BB (bb)
|
| - {
|
| - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
|
| - {
|
| - gimple stmt = gsi_stmt (gsi);
|
| - tree decl = is_gimple_call (stmt)
|
| - ? gimple_call_fndecl (stmt)
|
| - : NULL;
|
| -
|
| - if (decl
|
| - && gimple_call_flags (stmt) & (ECF_CONST
|
| - | ECF_PURE
|
| - | ECF_LOOPING_CONST_OR_PURE))
|
| - {
|
| - if (gimple_in_ssa_p (cfun))
|
| - {
|
| - todo |= TODO_update_ssa | TODO_cleanup_cfg;
|
| - update_stmt (stmt);
|
| - }
|
| - }
|
| -
|
| - if (!stmt_could_throw_p (stmt) && lookup_stmt_eh_region (stmt))
|
| - remove_stmt_from_eh_region (stmt);
|
| - }
|
| -
|
| - if (gimple_purge_dead_eh_edges (bb))
|
| - todo |= TODO_cleanup_cfg;
|
| - }
|
| + if (ENTRY_BLOCK_PTR->count)
|
| + count_scale = (cgraph_node (current_function_decl)->count * REG_BR_PROB_BASE
|
| + + ENTRY_BLOCK_PTR->count / 2) / ENTRY_BLOCK_PTR->count;
|
| + else
|
| + count_scale = REG_BR_PROB_BASE;
|
| +
|
| + ENTRY_BLOCK_PTR->count = cgraph_node (current_function_decl)->count;
|
| + EXIT_BLOCK_PTR->count = (EXIT_BLOCK_PTR->count * count_scale
|
| + + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
|
| +
|
| + FOR_EACH_BB (bb)
|
| + {
|
| + bb->count = (bb->count * count_scale
|
| + + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
|
| + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
|
| + {
|
| + gimple stmt = gsi_stmt (gsi);
|
| + tree decl = is_gimple_call (stmt)
|
| + ? gimple_call_fndecl (stmt)
|
| + : NULL;
|
| +
|
| + if (decl
|
| + && gimple_call_flags (stmt) & (ECF_CONST
|
| + | ECF_PURE
|
| + | ECF_LOOPING_CONST_OR_PURE))
|
| + {
|
| + if (gimple_in_ssa_p (cfun))
|
| + {
|
| + todo |= TODO_update_ssa | TODO_cleanup_cfg;
|
| + mark_symbols_for_renaming (stmt);
|
| + update_stmt (stmt);
|
| + }
|
| + }
|
| +
|
| + maybe_clean_eh_stmt (stmt);
|
| + }
|
| +
|
| + if (gimple_purge_dead_eh_edges (bb))
|
| + todo |= TODO_cleanup_cfg;
|
| + FOR_EACH_EDGE (e, ei, bb->succs)
|
| + e->count = (e->count * count_scale
|
| + + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
|
| + }
|
| + if (count_scale != REG_BR_PROB_BASE)
|
| + compute_function_frequency ();
|
|
|
| /* Dump a textual representation of the flowgraph. */
|
| if (dump_file)
|
| @@ -333,6 +303,25 @@ execute_fixup_cfg (void)
|
| return todo;
|
| }
|
|
|
| +struct gimple_opt_pass pass_fixup_cfg =
|
| +{
|
| + {
|
| + GIMPLE_PASS,
|
| + "*free_cfg_annotations", /* name */
|
| + NULL, /* gate */
|
| + execute_fixup_cfg, /* execute */
|
| + NULL, /* sub */
|
| + NULL, /* next */
|
| + 0, /* static_pass_number */
|
| + TV_NONE, /* tv_id */
|
| + PROP_cfg, /* properties_required */
|
| + 0, /* properties_provided */
|
| + 0, /* properties_destroyed */
|
| + 0, /* todo_flags_start */
|
| + 0 /* todo_flags_finish */
|
| + }
|
| +};
|
| +
|
| /* Do the actions required to initialize internal data structures used
|
| in tree-ssa optimization passes. */
|
|
|
| @@ -348,13 +337,13 @@ struct gimple_opt_pass pass_init_datastructures =
|
| {
|
| {
|
| GIMPLE_PASS,
|
| - NULL, /* name */
|
| + "*init_datastructures", /* name */
|
| NULL, /* gate */
|
| execute_init_datastructures, /* execute */
|
| NULL, /* sub */
|
| NULL, /* next */
|
| 0, /* static_pass_number */
|
| - 0, /* tv_id */
|
| + TV_NONE, /* tv_id */
|
| PROP_cfg, /* properties_required */
|
| 0, /* properties_provided */
|
| 0, /* properties_destroyed */
|
| @@ -390,14 +379,11 @@ void
|
| tree_rest_of_compilation (tree fndecl)
|
| {
|
| location_t saved_loc;
|
| - struct cgraph_node *node;
|
|
|
| timevar_push (TV_EXPAND);
|
|
|
| gcc_assert (cgraph_global_info_ready);
|
|
|
| - node = cgraph_node (fndecl);
|
| -
|
| /* Initialize the default bitmap obstack. */
|
| bitmap_obstack_initialize (NULL);
|
|
|
| @@ -412,18 +398,28 @@ tree_rest_of_compilation (tree fndecl)
|
| We haven't necessarily assigned RTL to all variables yet, so it's
|
| not safe to try to expand expressions involving them. */
|
| cfun->dont_save_pending_sizes_p = 1;
|
| -
|
| +
|
| gimple_register_cfg_hooks ();
|
|
|
| bitmap_obstack_initialize (®_obstack); /* FIXME, only at RTL generation*/
|
| +
|
| + execute_all_ipa_transforms ();
|
| +
|
| /* Perform all tree transforms and optimizations. */
|
| +
|
| + /* Signal the start of passes. */
|
| + invoke_plugin_callbacks (PLUGIN_ALL_PASSES_START, NULL);
|
| +
|
| execute_pass_list (all_passes);
|
| -
|
| +
|
| + /* Signal the end of passes. */
|
| + invoke_plugin_callbacks (PLUGIN_ALL_PASSES_END, NULL);
|
| +
|
| bitmap_obstack_release (®_obstack);
|
|
|
| /* Release the default bitmap obstack. */
|
| bitmap_obstack_release (NULL);
|
| -
|
| +
|
| set_cfun (NULL);
|
|
|
| /* If requested, warn about function definitions where the function will
|
|
|