Hi,
because early inliner is not producing call summaries, we do not want to
estimate calls to very large function when we already know that inlning
is going to fail.

Bootstrapped/regtested x86_64-linux.

        * 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.

Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 278540)
+++ ipa-inline.c        (working copy)
@@ -672,14 +672,29 @@ want_early_inline_function_p (struct cgr
     }
   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 ())
        {
Index: ipa-inline.h
===================================================================
--- ipa-inline.h        (revision 278540)
+++ ipa-inline.h        (working copy)
@@ -79,6 +79,16 @@ estimate_edge_size (struct cgraph_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

Reply via email to