diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ipa-inline-analysis.c | 16 | ||||
-rw-r--r-- | gcc/ipa-inline.c | 11 | ||||
-rw-r--r-- | gcc/ipa-inline.h | 4 |
4 files changed, 36 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7d1c9df32f..5221338c22d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 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. (dump_overall_stats): New function. (dump_inline_stats): New function. diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index c471e0cd899..dfe305810fc 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -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 (); diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 1b7a74e0745..65e653320ad 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -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 diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h index 8ee075f9300..1e9ff4ca0a8 100644 --- a/gcc/ipa-inline.h +++ b/gcc/ipa-inline.h @@ -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; |