invoke.texi (-fipa-profile): Document.

* 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.

From-SVN: r158788
This commit is contained in:
Jan Hubicka 2010-04-27 16:56:33 +02:00 committed by Jan Hubicka
parent 38e3d8681f
commit e65bb9be49
9 changed files with 122 additions and 5 deletions

View file

@ -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.

View file

@ -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)

View file

@ -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

View file

@ -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.

View file

@ -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 */
};

View file

@ -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;

View file

@ -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);

View file

@ -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")

View file

@ -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;