ipa-inline.h (INLINE_HINT_known_hot): New hint.

* ipa-inline.h (INLINE_HINT_known_hot): New hint.
	* ipa-inline-analysis.c (dump_inline_hints): Dump it.
	(do_estimate_edge_time): Compute it.
	* ipa-inline.c (want_inline_small_function_p): Bypass
	INLINE_INSNS_AUTO/SINGLE limits for calls that are known
	to be hot.

From-SVN: r209523
This commit is contained in:
Jan Hubicka 2014-04-18 21:36:01 +02:00 committed by Jan Hubicka
parent e86a910ff5
commit b6d627e472
4 changed files with 36 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2014-04-18 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline.h (INLINE_HINT_known_hot): New hint.
* ipa-inline-analysis.c (dump_inline_hints): Dump it.
(do_estimate_edge_time): Compute it.
* ipa-inline.c (want_inline_small_function_p): Bypass
INLINE_INSNS_AUTO/SINGLE limits for calls that are known
to be hot.
2014-04-18 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline.c (spec_rem): New static variable.

View File

@ -671,6 +671,11 @@ dump_inline_hints (FILE *f, inline_hints hints)
hints &= ~INLINE_HINT_array_index;
fprintf (f, " array_index");
}
if (hints & INLINE_HINT_known_hot)
{
hints &= ~INLINE_HINT_known_hot;
fprintf (f, " known_hot");
}
gcc_assert (!hints);
}
@ -3666,6 +3671,17 @@ do_estimate_edge_time (struct cgraph_edge *edge)
&known_aggs);
estimate_node_size_and_time (callee, clause, known_vals, known_binfos,
known_aggs, &size, &min_size, &time, &hints, es->param);
/* When we have profile feedback, we can quite safely identify hot
edges and for those we disable size limits. Don't do that when
probability that caller will call the callee is low however, since it
may hurt optimization of the caller's hot path. */
if (edge->count && cgraph_maybe_hot_edge_p (edge)
&& (edge->count * 2
> (edge->caller->global.inlined_to
? edge->caller->global.inlined_to->count : edge->caller->count)))
hints |= INLINE_HINT_known_hot;
known_vals.release ();
known_binfos.release ();
known_aggs.release ();

View File

@ -578,18 +578,21 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
inline cnadidate. At themoment we allow inline hints to
promote non-inline function to inline and we increase
MAX_INLINE_INSNS_SINGLE 16fold for inline functions. */
else if (!DECL_DECLARED_INLINE_P (callee->decl)
else if ((!DECL_DECLARED_INLINE_P (callee->decl)
&& (!e->count || !cgraph_maybe_hot_edge_p (e)))
&& inline_summary (callee)->min_size - inline_edge_summary (e)->call_stmt_size
> MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
{
e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
want_inline = false;
}
else if (DECL_DECLARED_INLINE_P (callee->decl)
else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
&& inline_summary (callee)->min_size - inline_edge_summary (e)->call_stmt_size
> 16 * MAX_INLINE_INSNS_SINGLE)
{
e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl)
? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT
: CIF_MAX_INLINE_INSNS_AUTO_LIMIT);
want_inline = false;
}
else
@ -606,6 +609,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
&& growth >= MAX_INLINE_INSNS_SINGLE
&& ((!big_speedup
&& !(hints & (INLINE_HINT_indirect_call
| INLINE_HINT_known_hot
| INLINE_HINT_loop_iterations
| INLINE_HINT_array_index
| INLINE_HINT_loop_stride)))
@ -630,6 +634,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
inlining given function is very profitable. */
else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !big_speedup
&& !(hints & INLINE_HINT_known_hot)
&& growth >= ((hints & (INLINE_HINT_indirect_call
| INLINE_HINT_loop_iterations
| INLINE_HINT_array_index

View File

@ -68,7 +68,9 @@ enum inline_hints_vals {
INLINE_HINT_cross_module = 64,
/* If array indexes of loads/stores become known there may be room for
further optimization. */
INLINE_HINT_array_index = 128
INLINE_HINT_array_index = 128,
/* We know that the callee is hot by profile. */
INLINE_HINT_known_hot = 256
};
typedef int inline_hints;