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>
|
||||
|
||||
* 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->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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
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);
|
||||
}
|
||||
|
||||
/* 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_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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue