> Hi. > > This is similar transformation for IPA passes. This time, > one needs to use opt_for_fn in order to get the right > parameter values. > > @Martin, Honza: > There are last few remaining parameters which should use > opt_for_fn: > > param_ipa_max_agg_items > param_ipa_cp_unit_growth > param_ipa_sra_max_replacements > param_max_speculative_devirt_maydefs max_speculative_devirt_maydefs is used only on analysis stage when cfun is set up properly, so it is safe to set it PerFunction.
Honza > > Can you please help me with these as it's in your code? > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > gcc/ChangeLog: > > 2020-01-03 Martin Liska <mli...@suse.cz> > > * auto-profile.c (auto_profile): Use opt_for_fn > for a parameter. > * ipa-cp.c (ipcp_lattice::add_value): Likewise. > (propagate_vals_across_arith_jfunc): Likewise. > (hint_time_bonus): Likewise. > (incorporate_penalties): Likewise. > (good_cloning_opportunity_p): Likewise. > (perform_estimation_of_a_value): Likewise. > (estimate_local_effects): Likewise. > (ipcp_propagate_stage): Likewise. > * ipa-fnsummary.c (decompose_param_expr): Likewise. > (set_switch_stmt_execution_predicate): Likewise. > (analyze_function_body): Likewise. > * ipa-inline-analysis.c (offline_size): Likewise. > * ipa-inline.c (early_inliner): Likewise. > * ipa-prop.c (ipa_analyze_node): Likewise. > (ipcp_transform_function): Likewise. > * ipa-sra.c (process_scan_results): Likewise. > (ipa_sra_summarize_function): Likewise. > * params.opt: Rename ipcp-unit-growth to > ipa-cp-unit-growth. Add Optimization for various > IPA-related parameters. > --- > gcc/auto-profile.c | 3 ++- > gcc/ipa-cp.c | 44 +++++++++++++++++++++++---------------- > gcc/ipa-fnsummary.c | 7 ++++--- > gcc/ipa-inline-analysis.c | 7 ++++--- > gcc/ipa-inline.c | 6 ++++-- > gcc/ipa-prop.c | 4 ++-- > gcc/ipa-sra.c | 6 ++++-- > gcc/params.opt | 34 +++++++++++++++--------------- > 8 files changed, 63 insertions(+), 48 deletions(-) > > > diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c > index 6aca2f29022..c5e9f1336a7 100644 > --- a/gcc/auto-profile.c > +++ b/gcc/auto-profile.c > @@ -1628,7 +1628,8 @@ auto_profile (void) > function before annotation, so the profile inside bar@loc_foo2 > will be useful. */ > autofdo::stmt_set promoted_stmts; > - for (int i = 0; i < param_early_inliner_max_iterations; i++) > + for (int i = 0; i < opt_for_fn (node->decl, > + param_early_inliner_max_iterations); i++) > { > if (!flag_value_profile_transformations > || !autofdo::afdo_vpt_for_early_inline (&promoted_stmts)) > diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c > index 43c0d5a6706..def89471abb 100644 > --- a/gcc/ipa-cp.c > +++ b/gcc/ipa-cp.c > @@ -1859,7 +1859,8 @@ ipcp_lattice<valtype>::add_value (valtype newval, > cgraph_edge *cs, > return false; > } > > - if (!unlimited && values_count == param_ipa_cp_value_list_size) > + if (!unlimited && values_count == opt_for_fn (cs->caller->decl, > + param_ipa_cp_value_list_size)) > { > /* We can only free sources, not the values themselves, because sources > of other values in this SCC might point to them. */ > @@ -1986,12 +1987,15 @@ propagate_vals_across_arith_jfunc (cgraph_edge *cs, > { > int i; > > - if (src_lat != dest_lat || param_ipa_cp_max_recursive_depth < 1) > + int max_recursive_depth = opt_for_fn(cs->caller->decl, > + param_ipa_cp_max_recursive_depth); > + if (src_lat != dest_lat || max_recursive_depth < 1) > return dest_lat->set_contains_variable (); > > /* No benefit if recursive execution is in low probability. */ > if (cs->sreal_frequency () * 100 > - <= ((sreal) 1) * param_ipa_cp_min_recursive_probability) > + <= ((sreal) 1) * opt_for_fn (cs->caller->decl, > + param_ipa_cp_min_recursive_probability)) > return dest_lat->set_contains_variable (); > > auto_vec<ipcp_value<tree> *, 8> val_seeds; > @@ -2019,7 +2023,7 @@ propagate_vals_across_arith_jfunc (cgraph_edge *cs, > /* Recursively generate lattice values with a limited count. */ > FOR_EACH_VEC_ELT (val_seeds, i, src_val) > { > - for (int j = 1; j < param_ipa_cp_max_recursive_depth; j++) > + for (int j = 1; j < max_recursive_depth; j++) > { > tree cstval = get_val_across_arith_op (opcode, opnd1_type, opnd2, > src_val, res_type); > @@ -3155,11 +3159,11 @@ devirtualization_time_bonus (struct cgraph_node *node, > /* Return time bonus incurred because of HINTS. */ > > static int > -hint_time_bonus (ipa_hints hints) > +hint_time_bonus (cgraph_node *node, ipa_hints hints) > { > int result = 0; > if (hints & (INLINE_HINT_loop_iterations | INLINE_HINT_loop_stride)) > - result += param_ipa_cp_loop_hint_bonus; > + result += opt_for_fn (node->decl, param_ipa_cp_loop_hint_bonus); > return result; > } > > @@ -3167,15 +3171,18 @@ hint_time_bonus (ipa_hints hints) > cloning goodness evaluation, do so. */ > > static inline int64_t > -incorporate_penalties (ipa_node_params *info, int64_t evaluation) > +incorporate_penalties (cgraph_node *node, ipa_node_params *info, > + int64_t evaluation) > { > if (info->node_within_scc && !info->node_is_self_scc) > evaluation = (evaluation > - * (100 - param_ipa_cp_recursion_penalty)) / 100; > + * (100 - opt_for_fn (node->decl, > + param_ipa_cp_recursion_penalty))) / 100; > > if (info->node_calling_single_call) > evaluation = (evaluation > - * (100 - param_ipa_cp_single_call_penalty)) > + * (100 - opt_for_fn (node->decl, > + param_ipa_cp_single_call_penalty))) > / 100; > > return evaluation; > @@ -3197,6 +3204,7 @@ good_cloning_opportunity_p (struct cgraph_node *node, > int time_benefit, > gcc_assert (size_cost > 0); > > class ipa_node_params *info = IPA_NODE_REF (node); > + int eval_threshold = opt_for_fn (node->decl, param_ipa_cp_eval_threshold); > if (max_count > profile_count::zero ()) > { > int factor = RDIV (count_sum.probability_in > @@ -3204,7 +3212,7 @@ good_cloning_opportunity_p (struct cgraph_node *node, > int time_benefit, > * 1000, REG_BR_PROB_BASE); > int64_t evaluation = (((int64_t) time_benefit * factor) > / size_cost); > - evaluation = incorporate_penalties (info, evaluation); > + evaluation = incorporate_penalties (node, info, evaluation); > > if (dump_file && (dump_flags & TDF_DETAILS)) > { > @@ -3216,16 +3224,16 @@ good_cloning_opportunity_p (struct cgraph_node *node, > int time_benefit, > info->node_within_scc > ? (info->node_is_self_scc ? ", self_scc" : ", scc") : "", > info->node_calling_single_call ? ", single_call" : "", > - evaluation, param_ipa_cp_eval_threshold); > + evaluation, eval_threshold); > } > > - return evaluation >= param_ipa_cp_eval_threshold; > + return evaluation >= eval_threshold; > } > else > { > int64_t evaluation = (((int64_t) time_benefit * freq_sum) > / size_cost); > - evaluation = incorporate_penalties (info, evaluation); > + evaluation = incorporate_penalties (node, info, evaluation); > > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, " good_cloning_opportunity_p (time: %i, " > @@ -3235,9 +3243,9 @@ good_cloning_opportunity_p (struct cgraph_node *node, > int time_benefit, > info->node_within_scc > ? (info->node_is_self_scc ? ", self_scc" : ", scc") : "", > info->node_calling_single_call ? ", single_call" : "", > - evaluation, param_ipa_cp_eval_threshold); > + evaluation, eval_threshold); > > - return evaluation >= param_ipa_cp_eval_threshold; > + return evaluation >= eval_threshold; > } > } > > @@ -3375,7 +3383,7 @@ perform_estimation_of_a_value (cgraph_node *node, > vec<tree> known_csts, > time_benefit = base_time.to_int () > + devirtualization_time_bonus (node, known_csts, known_contexts, > known_aggs) > - + hint_time_bonus (hints) > + + hint_time_bonus (node, hints) > + removable_params_cost + est_move_cost; > > gcc_checking_assert (size >=0); > @@ -3430,7 +3438,7 @@ estimate_local_effects (struct cgraph_node *node) > known_aggs, &size, &time, > &base_time, &hints); > time -= devirt_bonus; > - time -= hint_time_bonus (hints); > + time -= hint_time_bonus (node, hints); > time -= removable_params_cost; > size -= stats.n_calls * removable_params_cost; > > @@ -3858,7 +3866,7 @@ ipcp_propagate_stage (class ipa_topo_info *topo) > max_new_size = overall_size; > if (max_new_size < param_large_unit_insns) > max_new_size = param_large_unit_insns; > - max_new_size += max_new_size * param_ipcp_unit_growth / 100 + 1; > + max_new_size += max_new_size * param_ipa_cp_unit_growth / 100 + 1; > > if (dump_file) > fprintf (dump_file, "\noverall_size: %li, max_new_size: %li\n", > diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c > index fa01cb6c083..7364f823efd 100644 > --- a/gcc/ipa-fnsummary.c > +++ b/gcc/ipa-fnsummary.c > @@ -1324,7 +1324,7 @@ decompose_param_expr (struct ipa_func_body_info *fbi, > struct agg_position_info *aggpos, > expr_eval_ops *param_ops_p = NULL) > { > - int op_limit = param_ipa_max_param_expr_ops; > + int op_limit = opt_for_fn (fbi->node->decl, param_ipa_max_param_expr_ops); > int op_count = 0; > > if (param_ops_p) > @@ -1555,7 +1555,8 @@ set_switch_stmt_execution_predicate (struct > ipa_func_body_info *fbi, > > auto_vec<std::pair<tree, tree> > ranges; > tree type = TREE_TYPE (op); > - int bound_limit = param_ipa_max_switch_predicate_bounds; > + int bound_limit = opt_for_fn (fbi->node->decl, > + param_ipa_max_switch_predicate_bounds); > int bound_count = 0; > wide_int vr_wmin, vr_wmax; > value_range_kind vr_type = get_range_info (op, &vr_wmin, &vr_wmax); > @@ -2451,7 +2452,7 @@ analyze_function_body (struct cgraph_node *node, bool > early) > fbi.bb_infos = vNULL; > fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun)); > fbi.param_count = count_formal_params (node->decl); > - fbi.aa_walk_budget = param_ipa_max_aa_steps; > + fbi.aa_walk_budget = opt_for_fn (node->decl, param_ipa_max_aa_steps); > > nonconstant_names.safe_grow_cleared > (SSANAMES (my_function)->length ()); > diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c > index eb42caeb7ae..39be56c8f76 100644 > --- a/gcc/ipa-inline-analysis.c > +++ b/gcc/ipa-inline-analysis.c > @@ -455,9 +455,10 @@ offline_size (struct cgraph_node *node, ipa_size_summary > *info) > Take this into account. */ > else if (DECL_COMDAT (node->decl) > && node->can_remove_if_no_direct_calls_p ()) > - return (info->size > - * (100 - param_comdat_sharing_probability) > - + 50) / 100; > + { > + int prob = opt_for_fn (node->decl, param_comdat_sharing_probability); > + return info->size * (100 - prob + 50) / 100; > + } > } > return 0; > } > diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c > index 3b68fc47d01..96ce67d71a5 100644 > --- a/gcc/ipa-inline.c > +++ b/gcc/ipa-inline.c > @@ -2967,7 +2967,8 @@ early_inliner (function *fun) > } > /* We iterate incremental inlining to get trivial cases of indirect > inlining. */ > - while (iterations < param_early_inliner_max_iterations > + while (iterations < opt_for_fn (node->decl, > + param_early_inliner_max_iterations) > && early_inline_small_functions (node)) > { > timevar_push (TV_INTEGRATION); > @@ -2986,7 +2987,8 @@ early_inliner (function *fun) > es->call_stmt_time > = estimate_num_insns (edge->call_stmt, &eni_time_weights); > } > - if (iterations < param_early_inliner_max_iterations - 1) > + if (iterations < opt_for_fn (node->decl, > + param_early_inliner_max_iterations) - 1) > ipa_update_overall_fn_summary (node); > timevar_pop (TV_INTEGRATION); > iterations++; > diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c > index 035730d180d..9f80dd1f6a8 100644 > --- a/gcc/ipa-prop.c > +++ b/gcc/ipa-prop.c > @@ -2876,7 +2876,7 @@ ipa_analyze_node (struct cgraph_node *node) > fbi.bb_infos = vNULL; > fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun)); > fbi.param_count = ipa_get_param_count (info); > - fbi.aa_walk_budget = param_ipa_max_aa_steps; > + fbi.aa_walk_budget = opt_for_fn (node->decl, param_ipa_max_aa_steps); > > for (struct cgraph_edge *cs = node->callees; cs; cs = cs->next_callee) > { > @@ -5756,7 +5756,7 @@ ipcp_transform_function (struct cgraph_node *node) > fbi.bb_infos = vNULL; > fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun)); > fbi.param_count = param_count; > - fbi.aa_walk_budget = param_ipa_max_aa_steps; > + fbi.aa_walk_budget = opt_for_fn (node->decl, param_ipa_max_aa_steps); > > vec_safe_grow_cleared (descriptors, param_count); > ipa_populate_param_decls (node, *descriptors); > diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c > index a051a9f2154..79b543fa934 100644 > --- a/gcc/ipa-sra.c > +++ b/gcc/ipa-sra.c > @@ -2279,7 +2279,9 @@ process_scan_results (cgraph_node *node, struct > function *fun, > if (!desc->by_ref || optimize_function_for_size_p (fun)) > param_size_limit = cur_param_size; > else > - param_size_limit = param_ipa_sra_ptr_growth_factor * cur_param_size; > + param_size_limit > + = opt_for_fn (node->decl, > + param_ipa_sra_ptr_growth_factor) * cur_param_size; > if (nonarg_acc_size > param_size_limit > || (!desc->by_ref && nonarg_acc_size == param_size_limit)) > { > @@ -2499,7 +2501,7 @@ ipa_sra_summarize_function (cgraph_node *node) > bb_dereferences = XCNEWVEC (HOST_WIDE_INT, > by_ref_count > * last_basic_block_for_fn (fun)); > - aa_walking_limit = param_ipa_max_aa_steps; > + aa_walking_limit = opt_for_fn (node->decl, param_ipa_max_aa_steps); > scan_function (node, fun); > > if (dump_file) > diff --git a/gcc/params.opt b/gcc/params.opt > index 5d39244761a..094e04aae5e 100644 > --- a/gcc/params.opt > +++ b/gcc/params.opt > @@ -83,7 +83,7 @@ Common Joined UInteger Var(param_case_values_threshold) > Param Optimization > The smallest number of different values for which it is best to use a > jump-table instead of a tree of conditional branches, if 0, use the default > for the machine. > > -param=comdat-sharing-probability= > -Common Joined UInteger Var(param_comdat_sharing_probability) Init(20) Param > +Common Joined UInteger Var(param_comdat_sharing_probability) Init(20) Param > Optimization > Probability that COMDAT function will be shared with different compilation > unit. > > -param=cxx-max-namespaces-for-diagnostic-help= > @@ -191,35 +191,39 @@ Common Joined UInteger Var(param_integer_share_limit) > Init(251) IntegerRange(2, > The upper bound for sharing integer constants. > > -param=ipa-cp-eval-threshold= > -Common Joined UInteger Var(param_ipa_cp_eval_threshold) Init(500) Param > +Common Joined UInteger Var(param_ipa_cp_eval_threshold) Init(500) Param > Optimization > Threshold ipa-cp opportunity evaluation that is still considered beneficial > to clone. > > -param=ipa-cp-loop-hint-bonus= > -Common Joined UInteger Var(param_ipa_cp_loop_hint_bonus) Init(64) Param > +Common Joined UInteger Var(param_ipa_cp_loop_hint_bonus) Init(64) Param > Optimization > Compile-time bonus IPA-CP assigns to candidates which make loop bounds or > strides known. > > -param=ipa-cp-max-recursive-depth= > -Common Joined UInteger Var(param_ipa_cp_max_recursive_depth) Init(8) Param > +Common Joined UInteger Var(param_ipa_cp_max_recursive_depth) Init(8) Param > Optimization > Maximum depth of recursive cloning for self-recursive function. > > -param=ipa-cp-min-recursive-probability= > -Common Joined UInteger Var(param_ipa_cp_min_recursive_probability) Init(2) > Param > +Common Joined UInteger Var(param_ipa_cp_min_recursive_probability) Init(2) > Param Optimization > Recursive cloning only when the probability of call being executed exceeds > the parameter. > > -param=ipa-cp-recursion-penalty= > -Common Joined UInteger Var(param_ipa_cp_recursion_penalty) Init(40) > IntegerRange(0, 100) Param > +Common Joined UInteger Var(param_ipa_cp_recursion_penalty) Init(40) > IntegerRange(0, 100) Param Optimization > Percentage penalty the recursive functions will receive when they are > evaluated for cloning. > > -param=ipa-cp-single-call-penalty= > -Common Joined UInteger Var(param_ipa_cp_single_call_penalty) Init(15) > IntegerRange(0, 100) Param > +Common Joined UInteger Var(param_ipa_cp_single_call_penalty) Init(15) > IntegerRange(0, 100) Param Optimization > Percentage penalty functions containing a single call to another function > will receive when they are evaluated for cloning. > > +-param=ipa-cp-unit-growth= > +Common Joined UInteger Var(param_ipa_cp_unit_growth) Init(10) Param > +How much can given compilation unit grow because of the interprocedural > constant propagation (in percent). > + > -param=ipa-cp-value-list-size= > -Common Joined UInteger Var(param_ipa_cp_value_list_size) Init(8) Param > +Common Joined UInteger Var(param_ipa_cp_value_list_size) Init(8) Param > Optimization > Maximum size of a list of values associated with each parameter for > interprocedural constant propagation. > > -param=ipa-max-aa-steps= > -Common Joined UInteger Var(param_ipa_max_aa_steps) Init(25000) Param > +Common Joined UInteger Var(param_ipa_max_aa_steps) Init(25000) Param > Optimization > Maximum number of statements that will be visited by IPA formal parameter > analysis based on alias analysis in any given function. > > -param=ipa-max-agg-items= > @@ -227,11 +231,11 @@ Common Joined UInteger Var(param_ipa_max_agg_items) > Init(16) Param > Maximum number of aggregate content items for a parameter in jump functions > and lattices. > > -param=ipa-max-param-expr-ops= > -Common Joined UInteger Var(param_ipa_max_param_expr_ops) Init(10) Param > +Common Joined UInteger Var(param_ipa_max_param_expr_ops) Init(10) Param > Optimization > Maximum number of operations in a parameter expression that can be handled > by IPA analysis. > > -param=ipa-max-switch-predicate-bounds= > -Common Joined UInteger Var(param_ipa_max_switch_predicate_bounds) Init(5) > Param > +Common Joined UInteger Var(param_ipa_max_switch_predicate_bounds) Init(5) > Param Optimization > Maximal number of boundary endpoints of case ranges of switch statement used > during IPA functoin summary generation. > > -param=ipa-sra-max-replacements= > @@ -239,13 +243,9 @@ Common Joined UInteger > Var(param_ipa_sra_max_replacements) Init(8) IntegerRange( > Maximum pieces that IPA-SRA tracks per formal parameter, as a consequence, > also the maximum number of replacements of a formal parameter. > > -param=ipa-sra-ptr-growth-factor= > -Common Joined UInteger Var(param_ipa_sra_ptr_growth_factor) Init(2) Param > +Common Joined UInteger Var(param_ipa_sra_ptr_growth_factor) Init(2) Param > Optimization > Maximum allowed growth of number and total size of new parameters that > ipa-sra replaces a pointer to an aggregate with. > > --param=ipcp-unit-growth= > -Common Joined UInteger Var(param_ipcp_unit_growth) Init(10) Param > -How much can given compilation unit grow because of the interprocedural > constant propagation (in percent). > - > -param=ira-loop-reserved-regs= > Common Joined UInteger Var(param_ira_loop_reserved_regs) Init(2) Param > Optimization > The number of registers in each class kept unused by loop invariant motion. > @@ -423,7 +423,7 @@ Common Joined UInteger > Var(param_max_dse_active_local_stores) Init(5000) Param O > Maximum number of active local stores in RTL dead store elimination. > > -param=max-early-inliner-iterations= > -Common Joined UInteger Var(param_early_inliner_max_iterations) Init(1) Param > +Common Joined UInteger Var(param_early_inliner_max_iterations) Init(1) Param > Optimization > The maximum number of nested indirect inlining performed by early inliner. > > -param=max-fields-for-field-sensitive= >