summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ipa-inline-analysis.c16
-rw-r--r--gcc/ipa-inline.c11
-rw-r--r--gcc/ipa-inline.h4
4 files changed, 36 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a7d1c9df32f..5221338c22d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2014-04-18 Jan Hubicka <hubicka@ucw.cz>
+ * ipa-inline.h (INLINE_HINT_known_hot): New hint.
+ * ipa-inline-analysis.c (dump_inline_hints): Dump it.
+ (do_estimate_edge_time): Compute it.
+ * ipa-inline.c (want_inline_small_function_p): Bypass
+ INLINE_INSNS_AUTO/SINGLE limits for calls that are known
+ to be hot.
+
+2014-04-18 Jan Hubicka <hubicka@ucw.cz>
+
* ipa-inline.c (spec_rem): New static variable.
(dump_overall_stats): New function.
(dump_inline_stats): New function.
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index c471e0cd899..dfe305810fc 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -671,6 +671,11 @@ dump_inline_hints (FILE *f, inline_hints hints)
hints &= ~INLINE_HINT_array_index;
fprintf (f, " array_index");
}
+ if (hints & INLINE_HINT_known_hot)
+ {
+ hints &= ~INLINE_HINT_known_hot;
+ fprintf (f, " known_hot");
+ }
gcc_assert (!hints);
}
@@ -3666,6 +3671,17 @@ do_estimate_edge_time (struct cgraph_edge *edge)
&known_aggs);
estimate_node_size_and_time (callee, clause, known_vals, known_binfos,
known_aggs, &size, &min_size, &time, &hints, es->param);
+
+ /* When we have profile feedback, we can quite safely identify hot
+ edges and for those we disable size limits. Don't do that when
+ probability that caller will call the callee is low however, since it
+ may hurt optimization of the caller's hot path. */
+ if (edge->count && cgraph_maybe_hot_edge_p (edge)
+ && (edge->count * 2
+ > (edge->caller->global.inlined_to
+ ? edge->caller->global.inlined_to->count : edge->caller->count)))
+ hints |= INLINE_HINT_known_hot;
+
known_vals.release ();
known_binfos.release ();
known_aggs.release ();
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 1b7a74e0745..65e653320ad 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -578,18 +578,21 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
inline cnadidate. At themoment we allow inline hints to
promote non-inline function to inline and we increase
MAX_INLINE_INSNS_SINGLE 16fold for inline functions. */
- else if (!DECL_DECLARED_INLINE_P (callee->decl)
+ else if ((!DECL_DECLARED_INLINE_P (callee->decl)
+ && (!e->count || !cgraph_maybe_hot_edge_p (e)))
&& inline_summary (callee)->min_size - inline_edge_summary (e)->call_stmt_size
> MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
{
e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
want_inline = false;
}
- else if (DECL_DECLARED_INLINE_P (callee->decl)
+ else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
&& inline_summary (callee)->min_size - inline_edge_summary (e)->call_stmt_size
> 16 * MAX_INLINE_INSNS_SINGLE)
{
- e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
+ e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl)
+ ? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT
+ : CIF_MAX_INLINE_INSNS_AUTO_LIMIT);
want_inline = false;
}
else
@@ -606,6 +609,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
&& growth >= MAX_INLINE_INSNS_SINGLE
&& ((!big_speedup
&& !(hints & (INLINE_HINT_indirect_call
+ | INLINE_HINT_known_hot
| INLINE_HINT_loop_iterations
| INLINE_HINT_array_index
| INLINE_HINT_loop_stride)))
@@ -630,6 +634,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
inlining given function is very profitable. */
else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !big_speedup
+ && !(hints & INLINE_HINT_known_hot)
&& growth >= ((hints & (INLINE_HINT_indirect_call
| INLINE_HINT_loop_iterations
| INLINE_HINT_array_index
diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h
index 8ee075f9300..1e9ff4ca0a8 100644
--- a/gcc/ipa-inline.h
+++ b/gcc/ipa-inline.h
@@ -68,7 +68,9 @@ enum inline_hints_vals {
INLINE_HINT_cross_module = 64,
/* If array indexes of loads/stores become known there may be room for
further optimization. */
- INLINE_HINT_array_index = 128
+ INLINE_HINT_array_index = 128,
+ /* We know that the callee is hot by profile. */
+ INLINE_HINT_known_hot = 256
};
typedef int inline_hints;