diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-27 14:56:33 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-27 14:56:33 +0000 |
commit | 4e2db0ad8a2a1ead055c58c5adbe586a817caa25 (patch) | |
tree | ba01f849174d822c82ea0fcae6a53e429d1ab377 | |
parent | af7c566277dfb54b1e235bed7274ad8d7125b356 (diff) | |
download | gcc-4e2db0ad8a2a1ead055c58c5adbe586a817caa25.tar.gz |
* doc/invoke.texi (-fipa-profile): Document.
* opts.c (decode_options): Enable ipa-profile at -O1.
* timevar.def (TV_IPA_PROFILE): Define.
* common.opt (fipa-profile): Add.
* cgraph.c (cgraph_clone_node): Set local flag and clear vtable method flag
for clones.
(cgraph_propagate_frequency): Handle only local ones.
* tree-pass.h (pass_ipa_profile): Declare.
* ipa-profile.c (gate_profile): Use flag_ipa_profile.
(pass_ipa_profile): Use TV_IPA_PROFILE.
* ipa.c (ipa_profile): New function.
(gate_ipa_profile): Likewise.
(pass_ipa_profile): New global variable.
* passes.c (pass_ipa_profile): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158788 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/cgraph.c | 4 | ||||
-rw-r--r-- | gcc/common.opt | 10 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 12 | ||||
-rw-r--r-- | gcc/ipa.c | 80 | ||||
-rw-r--r-- | gcc/opts.c | 1 | ||||
-rw-r--r-- | gcc/passes.c | 1 | ||||
-rw-r--r-- | gcc/timevar.def | 1 | ||||
-rw-r--r-- | gcc/tree-pass.h | 1 |
9 files changed, 122 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e42b826107e..a6e7bf42293 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2010-04-27 Jan Hubicka <jh@suse.cz> + + * doc/invoke.texi (-fipa-profile): Document. + * opts.c (decode_options): Enable ipa-profile at -O1. + * timevar.def (TV_IPA_PROFILE): Define. + * common.opt (fipa-profile): Add. + * cgraph.c (cgraph_clone_node): Set local flag and clear vtable method flag + for clones. + (cgraph_propagate_frequency): Handle only local ones. + * tree-pass.h (pass_ipa_profile): Declare. + * ipa-profile.c (gate_profile): Use flag_ipa_profile. + (pass_ipa_profile): Use TV_IPA_PROFILE. + * ipa.c (ipa_profile): New function. + (gate_ipa_profile): Likewise. + (pass_ipa_profile): New global variable. + * passes.c (pass_ipa_profile): New. + 2010-04-27 Nathan Froyd <froydnj@codesourcery.com> * config/arm/arm.c (arm_expand_builtin): Remove redundant declaration. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 95f441132f3..781d3b0455f 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1897,6 +1897,8 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int freq, new_node->analyzed = n->analyzed; new_node->local = n->local; new_node->local.externally_visible = false; + new_node->local.local = true; + new_node->local.vtable_method = false; new_node->global = n->global; new_node->rtl = n->rtl; new_node->count = count; @@ -2314,7 +2316,7 @@ cgraph_propagate_frequency (struct cgraph_node *node) { bool maybe_unlikely_executed = true, maybe_executed_once = true; struct cgraph_edge *edge; - if (node->needed || node->local.externally_visible) + if (!node->local.local) return false; gcc_assert (node->analyzed); if (node->frequency == NODE_FREQUENCY_HOT) diff --git a/gcc/common.opt b/gcc/common.opt index 70b2c9050bf..bb3932447cb 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -693,14 +693,18 @@ fipa-cp-clone Common Report Var(flag_ipa_cp_clone) Optimization Perform cloning to make Interprocedural constant propagation stronger -fipa-pure-const -Common Report Var(flag_ipa_pure_const) Init(0) Optimization -Discover pure and const functions +fipa-profile +Common Report Var(flag_ipa_profile) Init(0) Optimization +Perform interprocedural profile propagation fipa-pta Common Report Var(flag_ipa_pta) Init(0) Optimization Perform interprocedural points-to analysis +fipa-pure-const +Common Report Var(flag_ipa_pure_const) Init(0) Optimization +Discover pure and const functions + fipa-reference Common Report Var(flag_ipa_reference) Init(0) Optimization Discover readonly and non addressable static variables diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9829c1f35b6..23f744b9bfb 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -344,7 +344,7 @@ Objective-C and Objective-C++ Dialects}. -fgcse-sm -fif-conversion -fif-conversion2 -findirect-inlining @gol -finline-functions -finline-functions-called-once -finline-limit=@var{n} @gol -finline-small-functions -fipa-cp -fipa-cp-clone -fipa-matrix-reorg -fipa-pta @gol --fipa-pure-const -fipa-reference -fipa-struct-reorg @gol +-fipa-profile -fipa-pure-const -fipa-reference -fipa-struct-reorg @gol -fipa-type-escape -fira-algorithm=@var{algorithm} @gol -fira-region=@var{region} -fira-coalesce @gol -fira-loop-pressure -fno-ira-share-save-slots @gol @@ -5762,6 +5762,7 @@ compilation time. -fif-conversion2 @gol -fif-conversion @gol -fipa-pure-const @gol +-fipa-profile @gol -fipa-reference @gol -fmerge-constants -fsplit-wide-types @gol @@ -6602,6 +6603,15 @@ and reference analysis. This option can cause excessive memory and compile-time usage on large compilation units. It is not enabled by default at any optimization level. +@item -fipa-profile +@opindex fipa-profile +Perform interprocedural profile propagation. The functions called only from +cold functions are marked as cold. Also functions executed once (such as +@code{cold}, @code{noreturn}, static constructors or destructors) are identified. Cold +functions and loop less parts of functions executed once are then optimized for +size. +Enabled by default at @option{-O} and higher. + @item -fipa-cp @opindex fipa-cp Perform interprocedural constant propagation. diff --git a/gcc/ipa.c b/gcc/ipa.c index 8295357cc0e..00488b2146c 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -762,3 +762,83 @@ debug_cgraph_node_set (cgraph_node_set set) dump_cgraph_node_set (stderr, set); } +/* Simple ipa profile pass propagating frequencies across the callgraph. */ + +static unsigned int +ipa_profile (void) +{ + struct cgraph_node **order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); + struct cgraph_edge *e; + int order_pos; + bool something_changed = false; + int i; + + order_pos = cgraph_postorder (order); + for (i = order_pos - 1; i >= 0; i--) + { + if (order[i]->local.local && cgraph_propagate_frequency (order[i])) + { + for (e = order[i]->callees; e; e = e->next_callee) + if (e->callee->local.local && !e->callee->aux) + { + something_changed = true; + e->callee->aux = (void *)1; + } + } + order[i]->aux = NULL; + } + + while (something_changed) + { + something_changed = false; + for (i = order_pos - 1; i >= 0; i--) + { + if (order[i]->aux && cgraph_propagate_frequency (order[i])) + { + for (e = order[i]->callees; e; e = e->next_callee) + if (e->callee->local.local && !e->callee->aux) + { + something_changed = true; + e->callee->aux = (void *)1; + } + } + order[i]->aux = NULL; + } + } + free (order); + return 0; +} + +static bool +gate_ipa_profile (void) +{ + return flag_ipa_profile; +} + +struct ipa_opt_pass_d pass_ipa_profile = +{ + { + IPA_PASS, + "ipa-profile", /* name */ + gate_ipa_profile, /* gate */ + ipa_profile, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_IPA_PROFILE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0 /* todo_flags_finish */ + }, + NULL, /* generate_summary */ + NULL, /* write_summary */ + NULL, /* read_summary */ + NULL, /* write_optimization_summary */ + NULL, /* read_optimization_summary */ + NULL, /* stmt_fixup */ + 0, /* TODOs */ + NULL, /* function_transform */ + NULL /* variable_transform */ +}; diff --git a/gcc/opts.c b/gcc/opts.c index 0009a749dae..507b50227ee 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -858,6 +858,7 @@ decode_options (unsigned int argc, const char **argv) flag_if_conversion2 = opt1; flag_ipa_pure_const = opt1; flag_ipa_reference = opt1; + flag_ipa_profile = opt1; flag_merge_constants = opt1; flag_split_wide_types = opt1; flag_tree_ccp = opt1; diff --git a/gcc/passes.c b/gcc/passes.c index e503dc64bcc..ee6de5492f4 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -803,6 +803,7 @@ init_optimization_passes (void) p = &all_regular_ipa_passes; NEXT_PASS (pass_ipa_whole_program_visibility); + NEXT_PASS (pass_ipa_profile); NEXT_PASS (pass_ipa_cp); NEXT_PASS (pass_ipa_inline); NEXT_PASS (pass_ipa_reference); diff --git a/gcc/timevar.def b/gcc/timevar.def index 63530b8e973..219963faf51 100644 --- a/gcc/timevar.def +++ b/gcc/timevar.def @@ -59,6 +59,7 @@ DEFTIMEVAR (TV_WHOPR_WPA_IO , "whopr wpa I/O") DEFTIMEVAR (TV_WHOPR_LTRANS , "whopr ltrans") DEFTIMEVAR (TV_WHOPR_WPA_LTRANS_EXEC , "whopr wpa->ltrans") DEFTIMEVAR (TV_IPA_REFERENCE , "ipa reference") +DEFTIMEVAR (TV_IPA_PROFILE , "ipa profile") DEFTIMEVAR (TV_IPA_PURE_CONST , "ipa pure const") DEFTIMEVAR (TV_IPA_TYPE_ESCAPE , "ipa type escape") DEFTIMEVAR (TV_IPA_PTA , "ipa points-to") diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 3d7798e4ca4..a82dc83d2a7 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -459,6 +459,7 @@ extern struct simple_ipa_opt_pass pass_ipa_pta; extern struct simple_ipa_opt_pass pass_ipa_struct_reorg; extern struct ipa_opt_pass_d pass_ipa_lto_wpa_fixup; extern struct ipa_opt_pass_d pass_ipa_lto_finish_out; +extern struct ipa_opt_pass_d pass_ipa_profile; extern struct gimple_opt_pass pass_all_optimizations; extern struct gimple_opt_pass pass_cleanup_cfg_post_optimizing; |