summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-27 14:56:33 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-27 14:56:33 +0000
commit4e2db0ad8a2a1ead055c58c5adbe586a817caa25 (patch)
treeba01f849174d822c82ea0fcae6a53e429d1ab377 /gcc
parentaf7c566277dfb54b1e235bed7274ad8d7125b356 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/cgraph.c4
-rw-r--r--gcc/common.opt10
-rw-r--r--gcc/doc/invoke.texi12
-rw-r--r--gcc/ipa.c80
-rw-r--r--gcc/opts.c1
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/timevar.def1
-rw-r--r--gcc/tree-pass.h1
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;