invoke.texi: Document max-inline-insns-size...
authorJan Hubicka <hubicka@ucw.cz>
Sat, 5 Jan 2019 18:16:55 +0000 (19:16 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 5 Jan 2019 18:16:55 +0000 (18:16 +0000)
* doc/invoke.texi: Document max-inline-insns-size,
uninlined-function-insns, uninlined-function-time,
uninlined-thunk-insns and uninlined-thunk-time.
* params.def: Add max-inline-insns-size,
uninlined-function-insns, uninlined-function-time,
uninlined-thunk-insns and uninlined-thunk-time.
* ipa-fnsummary.c (compute_fn_summary, analyze_function_body): Use
new parameters.
* ipa-inline.c (can_inline_edge_by_limits_p,
want_inline_small_function_p): Use new parameters.

From-SVN: r267601

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/ipa-fnsummary.c
gcc/ipa-inline.c
gcc/params.def

index f8fd7458bef6329071c15feb0ab1342badaa0ae2..1cf9aae3781af388f6457b51ac34c2ed191c3383 100644 (file)
@@ -1,3 +1,16 @@
+2019-01-05  Jan Hubicka  <hubicka@ucw.cz>
+
+       * doc/invoke.texi: Document max-inline-insns-size,
+       uninlined-function-insns, uninlined-function-time,
+       uninlined-thunk-insns and uninlined-thunk-time.
+       * params.def: Add max-inline-insns-size,
+       uninlined-function-insns, uninlined-function-time,
+       uninlined-thunk-insns and uninlined-thunk-time.
+       * ipa-fnsummary.c (compute_fn_summary, analyze_function_body): Use
+       new parameters.
+       * ipa-inline.c (can_inline_edge_by_limits_p,
+       want_inline_small_function_p): Use new parameters.
+
 2019-01-05  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-fnsummary.c (analyze_function_body): Fix accounting of time.
index 292227a3fbb3b8d2c260ae470d2ad8441417f33e..3501a62abb4bbb83f8124250b3cc808cd52587da 100644 (file)
@@ -11007,6 +11007,23 @@ by the compiler are investigated.  To those functions, a different
 (more restrictive) limit compared to functions declared inline can
 be applied.
 
+@item max-inline-insns-size
+This is bound applied to calls which are optimized for size. Small growth
+may be desirable to anticipate optimization oppurtunities exposed by inlining.
+
+@item uninlined-function-insns
+Number of instructions accounted by inliner for function overhead such as
+function prologue and epilogue.
+
+@item uninlined-function-time
+Extra time accounted by inliner for function overhead such as time needed to
+execute function prologue and epilogue
+
+@item uninlined-thunk-insns
+@item uninlined-thunk-time
+Same as @option{--param uninlined-function-insns} and
+@option{--param uninlined-function-time} but applied to function thunks
+
 @item inline-min-speedup
 When estimated performance improvement of caller + callee runtime exceeds this
 threshold (in percent), the function can be inlined regardless of the limit on
index affb210e8ef046cb24d721693714f33430968f95..1f5ff98782573fcaff8a32a6493bbeab78c36ad8 100644 (file)
@@ -2034,7 +2034,10 @@ analyze_function_body (struct cgraph_node *node, bool early)
   info->account_size_time (0, 0, bb_predicate, bb_predicate);
 
   bb_predicate = predicate::not_inlined ();
-  info->account_size_time (2 * ipa_fn_summary::size_scale, 0, bb_predicate,
+  info->account_size_time (PARAM_VALUE (PARAM_UNINLINED_FUNCTION_INSNS)
+                          * ipa_fn_summary::size_scale,
+                          PARAM_VALUE (PARAM_UNINLINED_FUNCTION_TIME),
+                          bb_predicate,
                           bb_predicate);
 
   if (fbi.info)
@@ -2418,7 +2421,11 @@ compute_fn_summary (struct cgraph_node *node, bool early)
       node->local.can_change_signature = false;
       es->call_stmt_size = eni_size_weights.call_cost;
       es->call_stmt_time = eni_time_weights.call_cost;
-      info->account_size_time (ipa_fn_summary::size_scale * 2, 2, t, t);
+      info->account_size_time (ipa_fn_summary::size_scale
+                              * PARAM_VALUE
+                                (PARAM_UNINLINED_FUNCTION_THUNK_INSNS),
+                              PARAM_VALUE
+                                (PARAM_UNINLINED_FUNCTION_THUNK_TIME), t, t);
       t = predicate::not_inlined ();
       info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t);
       ipa_update_overall_fn_summary (node);
index 623381fd1eccdb7d54aab777e7be6c5707e57f64..b51e2282cc712fa3055f9df54c78aace6695bbd6 100644 (file)
@@ -523,7 +523,7 @@ can_inline_edge_by_limits_p (struct cgraph_edge *e, bool report,
               > opt_for_fn (caller->decl, optimize_size))
        {
          int growth = estimate_edge_growth (e);
-         if (growth > 0
+         if (growth > PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SIZE)
              && (!DECL_DECLARED_INLINE_P (callee->decl)
                  && growth >= MAX (MAX_INLINE_INSNS_SINGLE,
                                    MAX_INLINE_INSNS_AUTO)))
@@ -635,7 +635,7 @@ want_early_inline_function_p (struct cgraph_edge *e)
       int growth = estimate_edge_growth (e);
       int n;
 
-      if (growth <= 0)
+      if (growth <= PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SIZE))
        ;
       else if (!e->maybe_hot_p ()
               && growth > 0)
@@ -791,7 +791,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
       ipa_hints hints = estimate_edge_hints (e);
       int big_speedup = -1; /* compute this lazily */
 
-      if (growth <= 0)
+      if (growth <= PARAM_VALUE (PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SIZE)))
        ;
       /* Apply MAX_INLINE_INSNS_SINGLE limit.  Do not do so when
         hints suggests that inlining given function is very profitable.  */
@@ -809,6 +809,8 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
          want_inline = false;
        }
       else if (!DECL_DECLARED_INLINE_P (callee->decl)
+              && (in_lto_p
+                  && growth >= PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
               && !opt_for_fn (e->caller->decl, flag_inline_functions))
        {
          /* growth_likely_positive is expensive, always test it last.  */
index 8ca3bbd2621731d1e47bc7c037ed700327dcfb15..b89b475ca96327193c4043ec18844cf49bb2b8f5 100644 (file)
@@ -83,6 +83,33 @@ DEFPARAM (PARAM_MAX_INLINE_INSNS_AUTO,
          "The maximum number of instructions when automatically inlining.",
          30, 0, 0)
 
+DEFPARAM (PARAM_MAX_INLINE_INSNS_SIZE,
+         "max-inline-insns-size",
+         "The maximum number of instructions when inlining for size.",
+         0, 0, 0)
+
+DEFPARAM (PARAM_UNINLINED_FUNCTION_INSNS,
+         "uninlined-function-insns",
+         "Instruction accounted for function prologue, epilogue and other"
+         " overhead.",
+         2, 0, 0)
+
+DEFPARAM (PARAM_UNINLINED_FUNCTION_TIME,
+         "uninlined-function-time",
+         "Time accounted for function prologue, epilogue and other"
+         " overhead.",
+         0, 0, 0)
+
+DEFPARAM (PARAM_UNINLINED_FUNCTION_THUNK_INSNS,
+         "uninlined-thunk-insns",
+         "Instruction accounted for function thunk overhead.",
+         2, 0, 0)
+
+DEFPARAM (PARAM_UNINLINED_FUNCTION_THUNK_TIME,
+         "uninlined-thunk-time",
+         "Time accounted for function thunk overhead.",
+         2, 0, 0)
+
 DEFPARAM (PARAM_MAX_INLINE_INSNS_RECURSIVE,
          "max-inline-insns-recursive",
          "The maximum number of instructions inline function can grow to via recursive inlining.",