#include "coretypes.h"
#include "tm.h"
#include "tree.h"
-#include "rtl.h"
#include "tm_p.h"
-#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "expr.h"
#include "diagnostic.h"
#include "basic-block.h"
#include "flags.h"
#include "graph.h"
#include "cfgloop.h"
#include "except.h"
-
+#include "plugin.h"
+#include "regset.h" /* FIXME: For reg_obstack. */
/* Gate: execute, or not, all of the non-trivial optimizations. */
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)));
}
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 =
{
{
GIMPLE_PASS,
- "optimized", /* name */
+ "optimized", /* name */
NULL, /* gate */
execute_cleanup_cfg_post_optimizing, /* execute */
NULL, /* sub */
free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS);
- /* Remove the ssa structures. */
- if (cfun->gimple_df)
- delete_tree_ssa ();
-
/* And get rid of annotations we no longer need. */
delete_tree_cfg_annotations ();
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;
+
+ 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;
- 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;
- mark_symbols_for_renaming (stmt);
- 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;
- }
+ 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)
{
{
GIMPLE_PASS,
- NULL, /* name */
+ "*free_cfg_annotations", /* name */
NULL, /* gate */
- execute_fixup_cfg, /* execute */
+ execute_fixup_cfg, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
{
{
GIMPLE_PASS,
- NULL, /* name */
+ "*init_datastructures", /* name */
NULL, /* gate */
execute_init_datastructures, /* execute */
NULL, /* sub */
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);
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