mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 12:41:17 +08:00
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:
parent
e86a910ff5
commit
b6d627e472
@ -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.
|
||||
|
@ -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 ();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user