aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2019-11-21 09:15:47 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-21 08:15:47 +0000
commit49e26500723ff8d18ebec8057d1e686ad91113f9 (patch)
treeb3376b2e4fda39fd3b42de5e16b74341d785944b /gcc
parentd2bcf46cd03bcc3ebdd9102e53022b6fb03202f7 (diff)
downloadgcc-49e26500723ff8d18ebec8057d1e686ad91113f9.zip
gcc-49e26500723ff8d18ebec8057d1e686ad91113f9.tar.gz
gcc-49e26500723ff8d18ebec8057d1e686ad91113f9.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline.c19
-rw-r--r--gcc/ipa-inline.h10
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 <jh@suse.cz>
+ * 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 <jh@suse.cz>
+
* 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