re PR fortran/48636 (Enable more inlining with -O2 and higher)

PR middle-end/48636
	* ipa-inline.c (big_speedup_p): New function.
	(want_inline_small_function_p): Use it.
	(edge_badness): Dump it.
	* params.def (inline-min-speedup): New parameter.
	* doc/invoke.texi (inline-min-speedup): Document.

From-SVN: r193331
This commit is contained in:
Jan Hubicka 2012-11-08 17:46:18 +01:00 committed by Jan Hubicka
parent 774b8a558c
commit 42f7b0fa26
6 changed files with 47 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2012-11-08 Jan Hubicka <jh@suse.cz>
PR middle-end/48636
* ipa-inline.c (big_speedup_p): New function.
(want_inline_small_function_p): Use it.
(edge_badness): Dump it.
* params.def (inline-min-speedup): New parameter.
* doc/invoke.texi (inline-min-speedup): Document.
2012-11-08 Martin Jambor <mjambor@suse.cz> 2012-11-08 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (determine_known_aggregate_parts): Skip writes to * ipa-prop.c (determine_known_aggregate_parts): Skip writes to

View File

@ -8945,6 +8945,12 @@ by the compiler are investigated. To those functions, a different
be applied. be applied.
The default value is 40. The default value is 40.
@item inline-min-speedup
When estimated performance improvement of caller + callee runtime exceeds this
threshold (in precent), the function can be inlined regardless the limit on
@option{--param max-inline-insns-single} and @option{--param
max-inline-insns-auto}.
@item large-function-insns @item large-function-insns
The limit specifying really large functions. For functions larger than this The limit specifying really large functions. For functions larger than this
limit after inlining, inlining is constrained by limit after inlining, inlining is constrained by

View File

@ -493,6 +493,22 @@ compute_inlined_call_time (struct cgraph_edge *edge,
return time; return time;
} }
/* Return true if the speedup for inlining E is bigger than
PARAM_MAX_INLINE_MIN_SPEEDUP. */
static bool
big_speedup_p (struct cgraph_edge *e)
{
gcov_type time = compute_uninlined_call_time (inline_summary (e->callee),
e);
gcov_type inlined_time = compute_inlined_call_time (e,
estimate_edge_time (e));
if (time - inlined_time
> RDIV (time * PARAM_VALUE (PARAM_INLINE_MIN_SPEEDUP), 100))
return true;
return false;
}
/* Return true if we are interested in inlining small function. /* Return true if we are interested in inlining small function.
When REPORT is true, report reason to dump file. */ When REPORT is true, report reason to dump file. */
@ -514,6 +530,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
{ {
int growth = estimate_edge_growth (e); int growth = estimate_edge_growth (e);
inline_hints hints = estimate_edge_hints (e); inline_hints hints = estimate_edge_hints (e);
bool big_speedup = big_speedup_p (e);
if (growth <= 0) if (growth <= 0)
; ;
@ -521,6 +538,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
hints suggests that inlining given function is very profitable. */ hints suggests that inlining given function is very profitable. */
else if (DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (DECL_DECLARED_INLINE_P (callee->symbol.decl)
&& growth >= MAX_INLINE_INSNS_SINGLE && growth >= MAX_INLINE_INSNS_SINGLE
&& !big_speedup
&& !(hints & (INLINE_HINT_indirect_call && !(hints & (INLINE_HINT_indirect_call
| INLINE_HINT_loop_iterations | INLINE_HINT_loop_iterations
| INLINE_HINT_loop_stride))) | INLINE_HINT_loop_stride)))
@ -574,6 +592,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that
inlining given function is very profitable. */ inlining given function is very profitable. */
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl)
&& !big_speedup
&& growth >= ((hints & (INLINE_HINT_indirect_call && growth >= ((hints & (INLINE_HINT_indirect_call
| INLINE_HINT_loop_iterations | INLINE_HINT_loop_iterations
| INLINE_HINT_loop_stride)) | INLINE_HINT_loop_stride))
@ -836,6 +855,8 @@ edge_badness (struct cgraph_edge *edge, bool dump)
growth, growth,
edge_time); edge_time);
dump_inline_hints (dump_file, hints); dump_inline_hints (dump_file, hints);
if (big_speedup_p (edge))
fprintf (dump_file, " big_speedup");
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }

View File

@ -46,6 +46,11 @@ DEFPARAM (PARAM_PREDICTABLE_BRANCH_OUTCOME,
"Maximal estimated outcome of branch considered predictable", "Maximal estimated outcome of branch considered predictable",
2, 0, 50) 2, 0, 50)
DEFPARAM (PARAM_INLINE_MIN_SPEEDUP,
"inline-min-speedup",
"The minimal estimated speedup allowing inliner to ignore inline-insns-single and inline-isnsns-auto",
10, 0, 0)
/* The single function inlining limit. This is the maximum size /* The single function inlining limit. This is the maximum size
of a function counted in internal gcc instructions (not in of a function counted in internal gcc instructions (not in
real machine instructions) that is eligible for inlining real machine instructions) that is eligible for inlining

View File

@ -1,3 +1,8 @@
2012-11-08 Jan Hubicka <jh@suse.cz>
PR middle-end/48636
* gcc.dg/winline-3.c: Update.
2012-11-08 Martin Jambor <mjambor@suse.cz> 2012-11-08 Martin Jambor <mjambor@suse.cz>
* gfortran.dg/ipcp-array-1.f90: New test. * gfortran.dg/ipcp-array-1.f90: New test.

View File

@ -1,5 +1,5 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Winline -O2 --param max-inline-insns-single=1" } */ /* { dg-options "-Winline -O2 --param max-inline-insns-single=1 --param inline-min-speedup=100" } */
void big (void); void big (void);
inline int q(void) /* { dg-warning "max-inline-insns-single" "" } */ inline int q(void) /* { dg-warning "max-inline-insns-single" "" } */