Commit ab38481c by Jan Hubicka Committed by Jan Hubicka

ipa-cp.c (perform_estimation_of_a_value): Turn time to sreal.


	* ipa-cp.c (perform_estimation_of_a_value): Turn time to sreal.
	(estimate_local_effects): Likewise.
	* ipa-inline.c (compute_inlined_call_time, want_inline_small_function_p,
	edge_badness, inline_small_functions, dump_overall_stats): LIkewise.
	* ipa-inline.h (edge_growth_cache_entry, estimate_time_after_inlining,
	estimate_ipcp_clone_size_and_time, do_estimate_edge_time,
	do_estimate_edge_time, estimate_edge_time): Likewise.
	* ipa-inline-analysis.c (estimate_node_size_and_time,
	estimate_ipcp_clone_size_and_time, do_estimate_edge_time): Likewise.
	(estimate_time_after_inlining): Remove.

From-SVN: r247380
parent b26f45f0
2017-04-28 Jan Hubicka <hubicka@ucw.cz>
* ipa-cp.c (perform_estimation_of_a_value): Turn time to sreal.
(estimate_local_effects): Likewise.
* ipa-inline.c (compute_inlined_call_time, want_inline_small_function_p,
edge_badness, inline_small_functions, dump_overall_stats): LIkewise.
* ipa-inline.h (edge_growth_cache_entry, estimate_time_after_inlining,
estimate_ipcp_clone_size_and_time, do_estimate_edge_time,
do_estimate_edge_time, estimate_edge_time): Likewise.
* ipa-inline-analysis.c (estimate_node_size_and_time,
estimate_ipcp_clone_size_and_time, do_estimate_edge_time): Likewise.
(estimate_time_after_inlining): Remove.
2017-04-28 Martin Liska <mliska@suse.cz> 2017-04-28 Martin Liska <mliska@suse.cz>
* doc/gcov.texi: Enhance documentation of gcov. * doc/gcov.texi: Enhance documentation of gcov.
......
...@@ -2792,16 +2792,20 @@ static void ...@@ -2792,16 +2792,20 @@ static void
perform_estimation_of_a_value (cgraph_node *node, vec<tree> known_csts, perform_estimation_of_a_value (cgraph_node *node, vec<tree> known_csts,
vec<ipa_polymorphic_call_context> known_contexts, vec<ipa_polymorphic_call_context> known_contexts,
vec<ipa_agg_jump_function_p> known_aggs_ptrs, vec<ipa_agg_jump_function_p> known_aggs_ptrs,
int base_time, int removable_params_cost, sreal base_time, int removable_params_cost,
int est_move_cost, ipcp_value_base *val) int est_move_cost, ipcp_value_base *val)
{ {
int time, size, time_benefit; int size, time_benefit;
sreal time;
inline_hints hints; inline_hints hints;
estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts, estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts,
known_aggs_ptrs, &size, &time, known_aggs_ptrs, &size, &time,
&hints); &hints);
time_benefit = base_time - time base_time -= time;
if (base_time > 65535)
base_time = 65535;
time_benefit = base_time.to_int ()
+ devirtualization_time_bonus (node, known_csts, known_contexts, + devirtualization_time_bonus (node, known_csts, known_contexts,
known_aggs_ptrs) known_aggs_ptrs)
+ hint_time_bonus (hints) + hint_time_bonus (hints)
...@@ -2832,15 +2836,15 @@ estimate_local_effects (struct cgraph_node *node) ...@@ -2832,15 +2836,15 @@ estimate_local_effects (struct cgraph_node *node)
vec<ipa_agg_jump_function> known_aggs; vec<ipa_agg_jump_function> known_aggs;
vec<ipa_agg_jump_function_p> known_aggs_ptrs; vec<ipa_agg_jump_function_p> known_aggs_ptrs;
bool always_const; bool always_const;
int base_time = inline_summaries->get (node)->time.to_int (); sreal base_time = inline_summaries->get (node)->time.to_int ();
int removable_params_cost; int removable_params_cost;
if (!count || !ipcp_versionable_function_p (node)) if (!count || !ipcp_versionable_function_p (node))
return; return;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %i.\n", fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %f.\n",
node->name (), node->order, base_time); node->name (), node->order, base_time.to_double ());
always_const = gather_context_independent_values (info, &known_csts, always_const = gather_context_independent_values (info, &known_csts,
&known_contexts, &known_aggs, &known_contexts, &known_aggs,
...@@ -2853,7 +2857,8 @@ estimate_local_effects (struct cgraph_node *node) ...@@ -2853,7 +2857,8 @@ estimate_local_effects (struct cgraph_node *node)
{ {
struct caller_statistics stats; struct caller_statistics stats;
inline_hints hints; inline_hints hints;
int time, size; sreal time;
int size;
init_caller_stats (&stats); init_caller_stats (&stats);
node->call_for_symbol_thunks_and_aliases (gather_caller_stats, &stats, node->call_for_symbol_thunks_and_aliases (gather_caller_stats, &stats,
...@@ -2867,7 +2872,7 @@ estimate_local_effects (struct cgraph_node *node) ...@@ -2867,7 +2872,7 @@ estimate_local_effects (struct cgraph_node *node)
if (dump_file) if (dump_file)
fprintf (dump_file, " - context independent values, size: %i, " fprintf (dump_file, " - context independent values, size: %i, "
"time_benefit: %i\n", size, base_time - time); "time_benefit: %f\n", size, (base_time - time).to_double ());
if (size <= 0 || node->local.local) if (size <= 0 || node->local.local)
{ {
...@@ -2878,7 +2883,7 @@ estimate_local_effects (struct cgraph_node *node) ...@@ -2878,7 +2883,7 @@ estimate_local_effects (struct cgraph_node *node)
fprintf (dump_file, " Decided to specialize for all " fprintf (dump_file, " Decided to specialize for all "
"known contexts, code not going to grow.\n"); "known contexts, code not going to grow.\n");
} }
else if (good_cloning_opportunity_p (node, base_time - time, else if (good_cloning_opportunity_p (node, (base_time - time).to_int (),
stats.freq_sum, stats.count_sum, stats.freq_sum, stats.count_sum,
size)) size))
{ {
......
...@@ -3260,7 +3260,7 @@ estimate_node_size_and_time (struct cgraph_node *node, ...@@ -3260,7 +3260,7 @@ estimate_node_size_and_time (struct cgraph_node *node,
vec<tree> known_vals, vec<tree> known_vals,
vec<ipa_polymorphic_call_context> known_contexts, vec<ipa_polymorphic_call_context> known_contexts,
vec<ipa_agg_jump_function_p> known_aggs, vec<ipa_agg_jump_function_p> known_aggs,
int *ret_size, int *ret_min_size, int *ret_time, int *ret_size, int *ret_min_size, sreal *ret_time,
inline_hints *ret_hints, inline_hints *ret_hints,
vec<inline_param_summary> vec<inline_param_summary>
inline_param_summary) inline_param_summary)
...@@ -3336,14 +3336,14 @@ estimate_node_size_and_time (struct cgraph_node *node, ...@@ -3336,14 +3336,14 @@ estimate_node_size_and_time (struct cgraph_node *node,
known_vals, known_contexts, known_aggs); known_vals, known_contexts, known_aggs);
gcc_checking_assert (size >= 0); gcc_checking_assert (size >= 0);
gcc_checking_assert (time >= 0); gcc_checking_assert (time >= 0);
time = RDIV (time, INLINE_TIME_SCALE); time = time / INLINE_TIME_SCALE;
size = RDIV (size, INLINE_SIZE_SCALE); size = RDIV (size, INLINE_SIZE_SCALE);
min_size = RDIV (min_size, INLINE_SIZE_SCALE); min_size = RDIV (min_size, INLINE_SIZE_SCALE);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\n size:%i time:%f\n", (int) size, time.to_double ()); fprintf (dump_file, "\n size:%i time:%f\n", (int) size, time.to_double ());
if (ret_time) if (ret_time)
*ret_time = time.to_int (); *ret_time = time;
if (ret_size) if (ret_size)
*ret_size = size; *ret_size = size;
if (ret_min_size) if (ret_min_size)
...@@ -3365,7 +3365,7 @@ estimate_ipcp_clone_size_and_time (struct cgraph_node *node, ...@@ -3365,7 +3365,7 @@ estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
vec<ipa_polymorphic_call_context> vec<ipa_polymorphic_call_context>
known_contexts, known_contexts,
vec<ipa_agg_jump_function_p> known_aggs, vec<ipa_agg_jump_function_p> known_aggs,
int *ret_size, int *ret_time, int *ret_size, sreal *ret_time,
inline_hints *hints) inline_hints *hints)
{ {
clause_t clause; clause_t clause;
...@@ -3800,10 +3800,10 @@ simple_edge_hints (struct cgraph_edge *edge) ...@@ -3800,10 +3800,10 @@ simple_edge_hints (struct cgraph_edge *edge)
When caching, also update the cache entry. Compute both time and When caching, also update the cache entry. Compute both time and
size, since we always need both metrics eventually. */ size, since we always need both metrics eventually. */
int sreal
do_estimate_edge_time (struct cgraph_edge *edge) do_estimate_edge_time (struct cgraph_edge *edge)
{ {
int time; sreal time;
int size; int size;
inline_hints hints; inline_hints hints;
struct cgraph_node *callee; struct cgraph_node *callee;
...@@ -3845,7 +3845,7 @@ do_estimate_edge_time (struct cgraph_edge *edge) ...@@ -3845,7 +3845,7 @@ do_estimate_edge_time (struct cgraph_edge *edge)
inline_summaries->get (edge->callee)->min_size = min_size; inline_summaries->get (edge->callee)->min_size = min_size;
if ((int) edge_growth_cache.length () <= edge->uid) if ((int) edge_growth_cache.length () <= edge->uid)
edge_growth_cache.safe_grow_cleared (symtab->edges_max_uid); edge_growth_cache.safe_grow_cleared (symtab->edges_max_uid);
edge_growth_cache[edge->uid].time = time + (time >= 0); edge_growth_cache[edge->uid].time = time;
edge_growth_cache[edge->uid].size = size + (size >= 0); edge_growth_cache[edge->uid].size = size + (size >= 0);
hints |= simple_edge_hints (edge); hints |= simple_edge_hints (edge);
...@@ -3933,26 +3933,6 @@ do_estimate_edge_hints (struct cgraph_edge *edge) ...@@ -3933,26 +3933,6 @@ do_estimate_edge_hints (struct cgraph_edge *edge)
return hints; return hints;
} }
/* Estimate self time of the function NODE after inlining EDGE. */
int
estimate_time_after_inlining (struct cgraph_node *node,
struct cgraph_edge *edge)
{
struct inline_edge_summary *es = inline_edge_summary (edge);
if (!es->predicate || !false_predicate_p (es->predicate))
{
sreal time =
inline_summaries->get (node)->time + estimate_edge_time (edge);
if (time < 0)
time = 0;
return time.to_int ();
}
return inline_summaries->get (node)->time.to_int ();
}
/* Estimate the size of NODE after inlining EDGE which should be an /* Estimate the size of NODE after inlining EDGE which should be an
edge to either NODE or a call inlined into NODE. */ edge to either NODE or a call inlined into NODE. */
......
...@@ -663,13 +663,12 @@ compute_uninlined_call_time (struct inline_summary *callee_info, ...@@ -663,13 +663,12 @@ compute_uninlined_call_time (struct inline_summary *callee_info,
inline sreal inline sreal
compute_inlined_call_time (struct cgraph_edge *edge, compute_inlined_call_time (struct cgraph_edge *edge,
int edge_time) sreal time)
{ {
cgraph_node *caller = (edge->caller->global.inlined_to cgraph_node *caller = (edge->caller->global.inlined_to
? edge->caller->global.inlined_to ? edge->caller->global.inlined_to
: edge->caller); : edge->caller);
sreal caller_time = inline_summaries->get (caller)->time; sreal caller_time = inline_summaries->get (caller)->time;
sreal time = edge_time;
if (edge->count && caller->count) if (edge->count && caller->count)
time *= (sreal)edge->count / caller->count; time *= (sreal)edge->count / caller->count;
...@@ -753,14 +752,6 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report) ...@@ -753,14 +752,6 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
int growth = estimate_edge_growth (e); int growth = estimate_edge_growth (e);
inline_hints hints = estimate_edge_hints (e); inline_hints hints = estimate_edge_hints (e);
bool big_speedup = big_speedup_p (e); bool big_speedup = big_speedup_p (e);
/*
fprintf (stderr, "%i %i %i\n",growth,hints,big_speedup);
dump_inline_summary (stderr, e->caller->global.inlined_to ? e->caller->global.inlined_to : e->caller);
dump_inline_summary (stderr, e->callee);
sreal time = compute_uninlined_call_time (inline_summaries->get (e->callee),
e);
sreal inlined_time = compute_inlined_call_time (e, estimate_edge_time (e));
fprintf (stderr, "%f %f\n", time.to_double (), inlined_time.to_double ());*/
if (growth <= 0) if (growth <= 0)
; ;
...@@ -1019,7 +1010,8 @@ static sreal ...@@ -1019,7 +1010,8 @@ static sreal
edge_badness (struct cgraph_edge *edge, bool dump) edge_badness (struct cgraph_edge *edge, bool dump)
{ {
sreal badness; sreal badness;
int growth, edge_time; int growth;
sreal edge_time;
struct cgraph_node *callee = edge->callee->ultimate_alias_target (); struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
struct inline_summary *callee_info = inline_summaries->get (callee); struct inline_summary *callee_info = inline_summaries->get (callee);
inline_hints hints; inline_hints hints;
...@@ -1033,7 +1025,7 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -1033,7 +1025,7 @@ edge_badness (struct cgraph_edge *edge, bool dump)
gcc_checking_assert (edge_time >= 0); gcc_checking_assert (edge_time >= 0);
/* FIXME: -1 to care of rounding issues should go away once cache is migrated. /* FIXME: -1 to care of rounding issues should go away once cache is migrated.
to sreals. */ to sreals. */
gcc_checking_assert (edge_time - 1 <= callee_info->time); gcc_checking_assert (edge_time <= callee_info->time);
gcc_checking_assert (growth <= callee_info->size); gcc_checking_assert (growth <= callee_info->size);
if (dump) if (dump)
...@@ -1043,9 +1035,9 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -1043,9 +1035,9 @@ edge_badness (struct cgraph_edge *edge, bool dump)
edge->caller->order, edge->caller->order,
xstrdup_for_dump (callee->name ()), xstrdup_for_dump (callee->name ()),
edge->callee->order); edge->callee->order);
fprintf (dump_file, " size growth %i, time %i ", fprintf (dump_file, " size growth %i, time %f ",
growth, growth,
edge_time); edge_time.to_double ());
dump_inline_hints (dump_file, hints); dump_inline_hints (dump_file, hints);
if (big_speedup_p (edge)) if (big_speedup_p (edge))
fprintf (dump_file, " big_speedup"); fprintf (dump_file, " big_speedup");
...@@ -1883,7 +1875,7 @@ inline_small_functions (void) ...@@ -1883,7 +1875,7 @@ inline_small_functions (void)
sreal cached_badness = edge_badness (edge, false); sreal cached_badness = edge_badness (edge, false);
int old_size_est = estimate_edge_size (edge); int old_size_est = estimate_edge_size (edge);
int old_time_est = estimate_edge_time (edge); sreal old_time_est = estimate_edge_time (edge);
int old_hints_est = estimate_edge_hints (edge); int old_hints_est = estimate_edge_hints (edge);
reset_edge_growth_cache (edge); reset_edge_growth_cache (edge);
...@@ -2250,20 +2242,20 @@ inline_to_all_callers (struct cgraph_node *node, void *data) ...@@ -2250,20 +2242,20 @@ inline_to_all_callers (struct cgraph_node *node, void *data)
static void static void
dump_overall_stats (void) dump_overall_stats (void)
{ {
int64_t sum_weighted = 0, sum = 0; sreal sum_weighted = 0, sum = 0;
struct cgraph_node *node; struct cgraph_node *node;
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (!node->global.inlined_to if (!node->global.inlined_to
&& !node->alias) && !node->alias)
{ {
int time = inline_summaries->get (node)->time.to_double (); sreal time = inline_summaries->get (node)->time;
sum += time; sum += time;
sum_weighted += time * node->count; sum_weighted += time * node->count;
} }
fprintf (dump_file, "Overall time estimate: " fprintf (dump_file, "Overall time estimate: "
"%" PRId64" weighted by profile: " "%f weighted by profile: "
"%" PRId64"\n", sum, sum_weighted); "%f\n", sum.to_double (), sum_weighted.to_double ());
} }
/* Output some useful stats about inlining. */ /* Output some useful stats about inlining. */
......
...@@ -232,7 +232,8 @@ extern vec<inline_edge_summary_t> inline_edge_summary_vec; ...@@ -232,7 +232,8 @@ extern vec<inline_edge_summary_t> inline_edge_summary_vec;
struct edge_growth_cache_entry struct edge_growth_cache_entry
{ {
int time, size; sreal time;
int size;
inline_hints hints; inline_hints hints;
}; };
...@@ -249,19 +250,18 @@ void inline_write_summary (void); ...@@ -249,19 +250,18 @@ void inline_write_summary (void);
void inline_free_summary (void); void inline_free_summary (void);
void inline_analyze_function (struct cgraph_node *node); void inline_analyze_function (struct cgraph_node *node);
void initialize_inline_failed (struct cgraph_edge *); void initialize_inline_failed (struct cgraph_edge *);
int estimate_time_after_inlining (struct cgraph_node *, struct cgraph_edge *);
int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *); int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *);
void estimate_ipcp_clone_size_and_time (struct cgraph_node *, void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
vec<tree>, vec<tree>,
vec<ipa_polymorphic_call_context>, vec<ipa_polymorphic_call_context>,
vec<ipa_agg_jump_function_p>, vec<ipa_agg_jump_function_p>,
int *, int *, inline_hints *); int *, sreal *, inline_hints *);
int estimate_growth (struct cgraph_node *); int estimate_growth (struct cgraph_node *);
bool growth_likely_positive (struct cgraph_node *, int); bool growth_likely_positive (struct cgraph_node *, int);
void inline_merge_summary (struct cgraph_edge *edge); void inline_merge_summary (struct cgraph_edge *edge);
void inline_update_overall_summary (struct cgraph_node *node); void inline_update_overall_summary (struct cgraph_node *node);
int do_estimate_edge_size (struct cgraph_edge *edge); int do_estimate_edge_size (struct cgraph_edge *edge);
int do_estimate_edge_time (struct cgraph_edge *edge); sreal do_estimate_edge_time (struct cgraph_edge *edge);
inline_hints do_estimate_edge_hints (struct cgraph_edge *edge); inline_hints do_estimate_edge_hints (struct cgraph_edge *edge);
void initialize_growth_caches (void); void initialize_growth_caches (void);
void free_growth_caches (void); void free_growth_caches (void);
...@@ -314,14 +314,14 @@ estimate_edge_growth (struct cgraph_edge *edge) ...@@ -314,14 +314,14 @@ estimate_edge_growth (struct cgraph_edge *edge)
/* Return estimated callee runtime increase after inlining /* Return estimated callee runtime increase after inlining
EDGE. */ EDGE. */
static inline int static inline sreal
estimate_edge_time (struct cgraph_edge *edge) estimate_edge_time (struct cgraph_edge *edge)
{ {
int ret; sreal ret;
if ((int)edge_growth_cache.length () <= edge->uid if ((int)edge_growth_cache.length () <= edge->uid
|| !(ret = edge_growth_cache[edge->uid].time)) || !edge_growth_cache[edge->uid].size)
return do_estimate_edge_time (edge); return do_estimate_edge_time (edge);
return ret - (ret > 0); return edge_growth_cache[edge->uid].time;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment