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:
parent
38e3d8681f
commit
e65bb9be49
9 changed files with 122 additions and 5 deletions
|
@ -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>
|
2010-04-27 Nathan Froyd <froydnj@codesourcery.com>
|
||||||
|
|
||||||
* config/arm/arm.c (arm_expand_builtin): Remove redundant declaration.
|
* config/arm/arm.c (arm_expand_builtin): Remove redundant declaration.
|
||||||
|
|
|
@ -1897,6 +1897,8 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int freq,
|
||||||
new_node->analyzed = n->analyzed;
|
new_node->analyzed = n->analyzed;
|
||||||
new_node->local = n->local;
|
new_node->local = n->local;
|
||||||
new_node->local.externally_visible = false;
|
new_node->local.externally_visible = false;
|
||||||
|
new_node->local.local = true;
|
||||||
|
new_node->local.vtable_method = false;
|
||||||
new_node->global = n->global;
|
new_node->global = n->global;
|
||||||
new_node->rtl = n->rtl;
|
new_node->rtl = n->rtl;
|
||||||
new_node->count = count;
|
new_node->count = count;
|
||||||
|
@ -2314,7 +2316,7 @@ cgraph_propagate_frequency (struct cgraph_node *node)
|
||||||
{
|
{
|
||||||
bool maybe_unlikely_executed = true, maybe_executed_once = true;
|
bool maybe_unlikely_executed = true, maybe_executed_once = true;
|
||||||
struct cgraph_edge *edge;
|
struct cgraph_edge *edge;
|
||||||
if (node->needed || node->local.externally_visible)
|
if (!node->local.local)
|
||||||
return false;
|
return false;
|
||||||
gcc_assert (node->analyzed);
|
gcc_assert (node->analyzed);
|
||||||
if (node->frequency == NODE_FREQUENCY_HOT)
|
if (node->frequency == NODE_FREQUENCY_HOT)
|
||||||
|
|
|
@ -693,14 +693,18 @@ fipa-cp-clone
|
||||||
Common Report Var(flag_ipa_cp_clone) Optimization
|
Common Report Var(flag_ipa_cp_clone) Optimization
|
||||||
Perform cloning to make Interprocedural constant propagation stronger
|
Perform cloning to make Interprocedural constant propagation stronger
|
||||||
|
|
||||||
fipa-pure-const
|
fipa-profile
|
||||||
Common Report Var(flag_ipa_pure_const) Init(0) Optimization
|
Common Report Var(flag_ipa_profile) Init(0) Optimization
|
||||||
Discover pure and const functions
|
Perform interprocedural profile propagation
|
||||||
|
|
||||||
fipa-pta
|
fipa-pta
|
||||||
Common Report Var(flag_ipa_pta) Init(0) Optimization
|
Common Report Var(flag_ipa_pta) Init(0) Optimization
|
||||||
Perform interprocedural points-to analysis
|
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
|
fipa-reference
|
||||||
Common Report Var(flag_ipa_reference) Init(0) Optimization
|
Common Report Var(flag_ipa_reference) Init(0) Optimization
|
||||||
Discover readonly and non addressable static variables
|
Discover readonly and non addressable static variables
|
||||||
|
|
|
@ -344,7 +344,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||||
-fgcse-sm -fif-conversion -fif-conversion2 -findirect-inlining @gol
|
-fgcse-sm -fif-conversion -fif-conversion2 -findirect-inlining @gol
|
||||||
-finline-functions -finline-functions-called-once -finline-limit=@var{n} @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
|
-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
|
-fipa-type-escape -fira-algorithm=@var{algorithm} @gol
|
||||||
-fira-region=@var{region} -fira-coalesce @gol
|
-fira-region=@var{region} -fira-coalesce @gol
|
||||||
-fira-loop-pressure -fno-ira-share-save-slots @gol
|
-fira-loop-pressure -fno-ira-share-save-slots @gol
|
||||||
|
@ -5762,6 +5762,7 @@ compilation time.
|
||||||
-fif-conversion2 @gol
|
-fif-conversion2 @gol
|
||||||
-fif-conversion @gol
|
-fif-conversion @gol
|
||||||
-fipa-pure-const @gol
|
-fipa-pure-const @gol
|
||||||
|
-fipa-profile @gol
|
||||||
-fipa-reference @gol
|
-fipa-reference @gol
|
||||||
-fmerge-constants
|
-fmerge-constants
|
||||||
-fsplit-wide-types @gol
|
-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
|
compile-time usage on large compilation units. It is not enabled by
|
||||||
default at any optimization level.
|
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
|
@item -fipa-cp
|
||||||
@opindex fipa-cp
|
@opindex fipa-cp
|
||||||
Perform interprocedural constant propagation.
|
Perform interprocedural constant propagation.
|
||||||
|
|
80
gcc/ipa.c
80
gcc/ipa.c
|
@ -762,3 +762,83 @@ debug_cgraph_node_set (cgraph_node_set set)
|
||||||
dump_cgraph_node_set (stderr, 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 */
|
||||||
|
};
|
||||||
|
|
|
@ -858,6 +858,7 @@ decode_options (unsigned int argc, const char **argv)
|
||||||
flag_if_conversion2 = opt1;
|
flag_if_conversion2 = opt1;
|
||||||
flag_ipa_pure_const = opt1;
|
flag_ipa_pure_const = opt1;
|
||||||
flag_ipa_reference = opt1;
|
flag_ipa_reference = opt1;
|
||||||
|
flag_ipa_profile = opt1;
|
||||||
flag_merge_constants = opt1;
|
flag_merge_constants = opt1;
|
||||||
flag_split_wide_types = opt1;
|
flag_split_wide_types = opt1;
|
||||||
flag_tree_ccp = opt1;
|
flag_tree_ccp = opt1;
|
||||||
|
|
|
@ -803,6 +803,7 @@ init_optimization_passes (void)
|
||||||
|
|
||||||
p = &all_regular_ipa_passes;
|
p = &all_regular_ipa_passes;
|
||||||
NEXT_PASS (pass_ipa_whole_program_visibility);
|
NEXT_PASS (pass_ipa_whole_program_visibility);
|
||||||
|
NEXT_PASS (pass_ipa_profile);
|
||||||
NEXT_PASS (pass_ipa_cp);
|
NEXT_PASS (pass_ipa_cp);
|
||||||
NEXT_PASS (pass_ipa_inline);
|
NEXT_PASS (pass_ipa_inline);
|
||||||
NEXT_PASS (pass_ipa_reference);
|
NEXT_PASS (pass_ipa_reference);
|
||||||
|
|
|
@ -59,6 +59,7 @@ DEFTIMEVAR (TV_WHOPR_WPA_IO , "whopr wpa I/O")
|
||||||
DEFTIMEVAR (TV_WHOPR_LTRANS , "whopr ltrans")
|
DEFTIMEVAR (TV_WHOPR_LTRANS , "whopr ltrans")
|
||||||
DEFTIMEVAR (TV_WHOPR_WPA_LTRANS_EXEC , "whopr wpa->ltrans")
|
DEFTIMEVAR (TV_WHOPR_WPA_LTRANS_EXEC , "whopr wpa->ltrans")
|
||||||
DEFTIMEVAR (TV_IPA_REFERENCE , "ipa reference")
|
DEFTIMEVAR (TV_IPA_REFERENCE , "ipa reference")
|
||||||
|
DEFTIMEVAR (TV_IPA_PROFILE , "ipa profile")
|
||||||
DEFTIMEVAR (TV_IPA_PURE_CONST , "ipa pure const")
|
DEFTIMEVAR (TV_IPA_PURE_CONST , "ipa pure const")
|
||||||
DEFTIMEVAR (TV_IPA_TYPE_ESCAPE , "ipa type escape")
|
DEFTIMEVAR (TV_IPA_TYPE_ESCAPE , "ipa type escape")
|
||||||
DEFTIMEVAR (TV_IPA_PTA , "ipa points-to")
|
DEFTIMEVAR (TV_IPA_PTA , "ipa points-to")
|
||||||
|
|
|
@ -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 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_wpa_fixup;
|
||||||
extern struct ipa_opt_pass_d pass_ipa_lto_finish_out;
|
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_all_optimizations;
|
||||||
extern struct gimple_opt_pass pass_cleanup_cfg_post_optimizing;
|
extern struct gimple_opt_pass pass_cleanup_cfg_post_optimizing;
|
||||||
|
|
Loading…
Add table
Reference in a new issue