From 49e26500723ff8d18ebec8057d1e686ad91113f9 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 21 Nov 2019 09:15:47 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-inline.c | 19 +++++++++++++++++-- gcc/ipa-inline.h | 10 ++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cab81d5..904b54c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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 negative time in calls summary; correct roundoff errors leading to negative times. diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 5d8b87a..6da3e96 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 626f264..6273f07 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 -- 2.7.4