On Tue, May 2, 2017 at 11:33 AM, Jan Hubicka <hubi...@ucw.cz> wrote: > Hi, > this patch makes ipa-cp to use nonspecialized time as a base for decision > about > cloning. I wonder about the capping - we perhaps want to use sreals further > in > the code because time differences can be large (with profile feedback). But I > guess this can be done incrementally - main point of the patch is to update > interfaces from ipa-analysis. > > Bootstrapped/regtested x86_64-linux, OK?
Ok. Richard. > Honza > > * ipa-cp.c (perform_estimation_of_a_value): Drop base_time parameter; > update use of estimate_ipcp_clone_size_and_time. > (estimate_local_effects): Update use of > estimate_ipcp_clone_size_and_time and perform_estimation_of_a_value. > * ipa-inline.h (estimate_ipcp_clone_size_and_time): Update prototype. > * ipa-inline-analysis.c (estimate_ipcp_clone_size_and_time): > Return nonspecialized time. > Index: ipa-cp.c > =================================================================== > --- ipa-cp.c (revision 247436) > +++ ipa-cp.c (working copy) > @@ -2792,16 +2792,16 @@ static void > perform_estimation_of_a_value (cgraph_node *node, vec<tree> known_csts, > vec<ipa_polymorphic_call_context> > known_contexts, > vec<ipa_agg_jump_function_p> known_aggs_ptrs, > - sreal base_time, int removable_params_cost, > + int removable_params_cost, > int est_move_cost, ipcp_value_base *val) > { > int size, time_benefit; > - sreal time; > + sreal time, base_time; > inline_hints hints; > > estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts, > known_aggs_ptrs, &size, &time, > - &hints); > + &base_time, &hints); > base_time -= time; > if (base_time > 65535) > base_time = 65535; > @@ -2836,15 +2836,14 @@ estimate_local_effects (struct cgraph_no > vec<ipa_agg_jump_function> known_aggs; > vec<ipa_agg_jump_function_p> known_aggs_ptrs; > bool always_const; > - sreal base_time = inline_summaries->get (node)->time.to_int (); > int removable_params_cost; > > if (!count || !ipcp_versionable_function_p (node)) > return; > > if (dump_file && (dump_flags & TDF_DETAILS)) > - fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %f.\n", > - node->name (), node->order, base_time.to_double ()); > + fprintf (dump_file, "\nEstimating effects for %s/%i.\n", > + node->name (), node->order); > > always_const = gather_context_independent_values (info, &known_csts, > &known_contexts, > &known_aggs, > @@ -2857,14 +2856,15 @@ estimate_local_effects (struct cgraph_no > { > struct caller_statistics stats; > inline_hints hints; > - sreal time; > + sreal time, base_time; > int size; > > init_caller_stats (&stats); > node->call_for_symbol_thunks_and_aliases (gather_caller_stats, &stats, > false); > estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts, > - known_aggs_ptrs, &size, &time, > &hints); > + known_aggs_ptrs, &size, &time, > + &base_time, &hints); > time -= devirt_bonus; > time -= hint_time_bonus (hints); > time -= removable_params_cost; > @@ -2877,20 +2877,20 @@ estimate_local_effects (struct cgraph_no > if (size <= 0 || node->local.local) > { > info->do_clone_for_all_contexts = true; > - base_time = time; > > if (dump_file) > fprintf (dump_file, " Decided to specialize for all " > "known contexts, code not going to grow.\n"); > } > - else if (good_cloning_opportunity_p (node, (base_time - time).to_int > (), > + else if (good_cloning_opportunity_p (node, > + MAX ((base_time - time).to_int (), > + 65536), > stats.freq_sum, stats.count_sum, > size)) > { > if (size + overall_size <= max_new_size) > { > info->do_clone_for_all_contexts = true; > - base_time = time; > overall_size += size; > > if (dump_file) > @@ -2926,7 +2926,7 @@ estimate_local_effects (struct cgraph_no > > int emc = estimate_move_cost (TREE_TYPE (val->value), true); > perform_estimation_of_a_value (node, known_csts, known_contexts, > - known_aggs_ptrs, base_time, > + known_aggs_ptrs, > removable_params_cost, emc, val); > > if (dump_file && (dump_flags & TDF_DETAILS)) > @@ -2961,7 +2961,7 @@ estimate_local_effects (struct cgraph_no > { > known_contexts[i] = val->value; > perform_estimation_of_a_value (node, known_csts, known_contexts, > - known_aggs_ptrs, base_time, > + known_aggs_ptrs, > removable_params_cost, 0, val); > > if (dump_file && (dump_flags & TDF_DETAILS)) > @@ -3005,7 +3005,7 @@ estimate_local_effects (struct cgraph_no > vec_safe_push (ajf->items, item); > > perform_estimation_of_a_value (node, known_csts, known_contexts, > - known_aggs_ptrs, base_time, > + known_aggs_ptrs, > removable_params_cost, 0, val); > > if (dump_file && (dump_flags & TDF_DETAILS)) > Index: ipa-inline.h > =================================================================== > --- ipa-inline.h (revision 247436) > +++ ipa-inline.h (working copy) > @@ -260,7 +260,8 @@ void estimate_ipcp_clone_size_and_time ( > vec<tree>, > vec<ipa_polymorphic_call_context>, > vec<ipa_agg_jump_function_p>, > - int *, sreal *, inline_hints *); > + int *, sreal *, sreal *, > + inline_hints *); > int estimate_growth (struct cgraph_node *); > bool growth_likely_positive (struct cgraph_node *, int); > void inline_merge_summary (struct cgraph_edge *edge); > Index: ipa-inline-analysis.c > =================================================================== > --- ipa-inline-analysis.c (revision 247436) > +++ ipa-inline-analysis.c (working copy) > @@ -3470,17 +3470,17 @@ estimate_ipcp_clone_size_and_time (struc > known_contexts, > vec<ipa_agg_jump_function_p> known_aggs, > int *ret_size, sreal *ret_time, > + sreal *ret_nonspec_time, > inline_hints *hints) > { > clause_t clause, nonspec_clause; > - sreal nonspec_time; > > evaluate_conditions_for_known_args (node, false, known_vals, known_aggs, > &clause, &nonspec_clause); > estimate_node_size_and_time (node, clause, nonspec_clause, > known_vals, known_contexts, > known_aggs, ret_size, NULL, ret_time, > - &nonspec_time, hints, vNULL); > + ret_nonspec_time, hints, vNULL); > } > > /* Translate all conditions from callee representation into caller