From: Jan Hubicka Date: Thu, 21 Nov 2019 08:15:47 +0000 (+0100) Subject: Avoid quadratic behaviour of early inliner. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=49e26500723ff8d18ebec8057d1e686ad91113f9;p=gcc.git Avoid quadratic behaviour of early inliner. * ipa-inline.c (want_early_inline_function_p): Do not estimate edge growth when callee function is very large. * ipa-inline.h (estimate_min_edge_growth): New. From-SVN: r278542 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cab81d5e910..904b54c9ebe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-20 Jan Hubicka + + * ipa-inline.c (want_early_inline_function_p): Do not estimate + edge growth when callee function is very large. + * ipa-inline.h (estimate_min_edge_growth): New. + 2019-11-20 Jan Hubicka * ipa-fnsummary.c (ipa_fn_summary::account_size_time): Allow diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 5d8b87a7bc3..6da3e96b45d 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -672,14 +672,29 @@ want_early_inline_function_p (struct cgraph_edge *e) } else { - int growth = estimate_edge_growth (e); + /* First take care of very large functions. */ + int min_growth = estimate_min_edge_growth (e), growth = 0; int n; int early_inlining_insns = opt_for_fn (e->caller->decl, optimize) >= 3 ? param_early_inlining_insns : param_early_inlining_insns_o2; + if (min_growth > early_inlining_insns) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt, + " will not early inline: %C->%C, " + "call is cold and code would grow " + "at least by %i\n", + e->caller, callee, + min_growth); + want_inline = false; + } + else + growth = estimate_edge_growth (e); - if (growth <= param_max_inline_insns_size) + + if (!want_inline || growth <= param_max_inline_insns_size) ; else if (!e->maybe_hot_p ()) { diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h index 626f264d5d0..6273f0747f9 100644 --- a/gcc/ipa-inline.h +++ b/gcc/ipa-inline.h @@ -79,6 +79,16 @@ estimate_edge_size (struct cgraph_edge *edge) return entry->size - (entry->size > 0); } +/* Return lower bound on estimated callee growth after inlining EDGE. */ + +static inline int +estimate_min_edge_growth (struct cgraph_edge *edge) +{ + ipa_call_summary *s = ipa_call_summaries->get (edge); + struct cgraph_node *callee = edge->callee->ultimate_alias_target (); + return (ipa_fn_summaries->get (callee)->min_size - s->call_stmt_size); +} + /* Return estimated callee growth after inlining EDGE. */ static inline int