invoke.texi: Document max-inline-insns-size...

* 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
This commit is contained in:
Jan Hubicka 2019-01-05 19:16:55 +01:00 committed by Jan Hubicka
parent 121356b017
commit d06f73a387
5 changed files with 71 additions and 5 deletions

View 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> 2019-01-05 Jan Hubicka <hubicka@ucw.cz>
* ipa-fnsummary.c (analyze_function_body): Fix accounting of time. * ipa-fnsummary.c (analyze_function_body): Fix accounting of time.

View File

@ -11007,6 +11007,23 @@ by the compiler are investigated. To those functions, a different
(more restrictive) limit compared to functions declared inline can (more restrictive) limit compared to functions declared inline can
be applied. 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 @item inline-min-speedup
When estimated performance improvement of caller + callee runtime exceeds this When estimated performance improvement of caller + callee runtime exceeds this
threshold (in percent), the function can be inlined regardless of the limit on threshold (in percent), the function can be inlined regardless of the limit on

View File

@ -2034,7 +2034,10 @@ analyze_function_body (struct cgraph_node *node, bool early)
info->account_size_time (0, 0, bb_predicate, bb_predicate); info->account_size_time (0, 0, bb_predicate, bb_predicate);
bb_predicate = predicate::not_inlined (); 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); bb_predicate);
if (fbi.info) if (fbi.info)
@ -2418,7 +2421,11 @@ compute_fn_summary (struct cgraph_node *node, bool early)
node->local.can_change_signature = false; node->local.can_change_signature = false;
es->call_stmt_size = eni_size_weights.call_cost; es->call_stmt_size = eni_size_weights.call_cost;
es->call_stmt_time = eni_time_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 (); t = predicate::not_inlined ();
info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t); info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t);
ipa_update_overall_fn_summary (node); ipa_update_overall_fn_summary (node);

View File

@ -523,7 +523,7 @@ can_inline_edge_by_limits_p (struct cgraph_edge *e, bool report,
> opt_for_fn (caller->decl, optimize_size)) > opt_for_fn (caller->decl, optimize_size))
{ {
int growth = estimate_edge_growth (e); int growth = estimate_edge_growth (e);
if (growth > 0 if (growth > PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SIZE)
&& (!DECL_DECLARED_INLINE_P (callee->decl) && (!DECL_DECLARED_INLINE_P (callee->decl)
&& growth >= MAX (MAX_INLINE_INSNS_SINGLE, && growth >= MAX (MAX_INLINE_INSNS_SINGLE,
MAX_INLINE_INSNS_AUTO))) MAX_INLINE_INSNS_AUTO)))
@ -635,7 +635,7 @@ want_early_inline_function_p (struct cgraph_edge *e)
int growth = estimate_edge_growth (e); int growth = estimate_edge_growth (e);
int n; int n;
if (growth <= 0) if (growth <= PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SIZE))
; ;
else if (!e->maybe_hot_p () else if (!e->maybe_hot_p ()
&& growth > 0) && growth > 0)
@ -791,7 +791,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
ipa_hints hints = estimate_edge_hints (e); ipa_hints hints = estimate_edge_hints (e);
int big_speedup = -1; /* compute this lazily */ 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 /* Apply MAX_INLINE_INSNS_SINGLE limit. Do not do so when
hints suggests that inlining given function is very profitable. */ 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; want_inline = false;
} }
else if (!DECL_DECLARED_INLINE_P (callee->decl) 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)) && !opt_for_fn (e->caller->decl, flag_inline_functions))
{ {
/* growth_likely_positive is expensive, always test it last. */ /* growth_likely_positive is expensive, always test it last. */

View File

@ -83,6 +83,33 @@ DEFPARAM (PARAM_MAX_INLINE_INSNS_AUTO,
"The maximum number of instructions when automatically inlining.", "The maximum number of instructions when automatically inlining.",
30, 0, 0) 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, DEFPARAM (PARAM_MAX_INLINE_INSNS_RECURSIVE,
"max-inline-insns-recursive", "max-inline-insns-recursive",
"The maximum number of instructions inline function can grow to via recursive inlining.", "The maximum number of instructions inline function can grow to via recursive inlining.",