From bf3f651054fdf0fdd672ffe344b0886e74f20098 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sun, 28 Oct 2012 13:00:32 +0100 Subject: [PATCH] inlinehint-3.c: New testcase. * gcc.dg/ipa/inlinehint-3.c: New testcase. * ipa-inline.c (edge_badness): Fix overflow. (inline_small_functions): Initialize SCCs correctly. (do_estimate_edge_time, do_estimate_edge_hints): Skip self recursive functions in SCC hints. From-SVN: r192891 --- gcc/ChangeLog | 8 ++++++ gcc/ipa-inline-analysis.c | 9 ++++-- gcc/ipa-inline.c | 19 ++++++++++--- gcc/testsuite/gcc.dg/ipa/inlinehint-3.c | 37 +++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/inlinehint-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ed5d44aca4..1e30bc1e7ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-10-28 Jan Hubicka + + * gcc.dg/ipa/inlinehint-3.c: New testcase. + * ipa-inline.c (edge_badness): Fix overflow. + (inline_small_functions): Initialize SCCs correctly. + (do_estimate_edge_time, do_estimate_edge_hints): Skip self + recursive functions in SCC hints. + 2012-10-28 Steven Bosscher PR rtl-optimization/38711 diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 8dd9c6927ed..3b56e7ae0a0 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -1375,6 +1375,9 @@ dump_inline_summary (FILE * f, struct cgraph_node *node) (int) s->estimated_self_stack_size); fprintf (f, " global stack: %i\n", (int) s->estimated_stack_size); + if (s->scc_no) + fprintf (f, " In SCC: %i\n", + (int) s->scc_no); for (i = 0; VEC_iterate (size_time_entry, s->entry, i, e); i++) @@ -3348,7 +3351,8 @@ do_estimate_edge_time (struct cgraph_edge *edge) VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).size = size + (size >= 0); if (inline_summary (to)->scc_no - && inline_summary (to)->scc_no == inline_summary (callee)->scc_no) + && inline_summary (to)->scc_no == inline_summary (callee)->scc_no + && !cgraph_edge_recursive_p (edge)) hints |= INLINE_HINT_same_scc; VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).hints = hints + 1; @@ -3439,7 +3443,8 @@ do_estimate_edge_hints (struct cgraph_edge *edge) VEC_free (tree, heap, known_binfos); VEC_free (ipa_agg_jump_function_p, heap, known_aggs); if (inline_summary (to)->scc_no - && inline_summary (to)->scc_no == inline_summary (callee)->scc_no) + && inline_summary (to)->scc_no == inline_summary (callee)->scc_no + && !cgraph_edge_recursive_p (edge)) hints |= INLINE_HINT_same_scc; return hints; } diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 39e450dfd43..6d5b252519a 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -861,9 +861,9 @@ edge_badness (struct cgraph_edge *edge, bool dump) We might mix the valud into the fraction by taking into account relative growth of the unit, but for now just add the number into resulting fraction. */ - if (badness > INT_MAX / 4) + if (badness > INT_MAX / 8) { - badness = INT_MAX / 4; + badness = INT_MAX / 8; if (dump) fprintf (dump_file, "Badness overflow\n"); } @@ -1360,8 +1360,19 @@ inline_small_functions (void) if (!DECL_EXTERNAL (node->symbol.decl)) initial_size += info->size; - info->scc_no = (dfs && dfs->next_cycle && dfs->next_cycle != node - ? dfs->scc_no + 1 : 0); + if (dfs && dfs->next_cycle) + { + struct cgraph_node *n2; + int id = dfs->scc_no + 1; + for (n2 = node; n2; + n2 = ((struct ipa_dfs_info *) node->symbol.aux)->next_cycle) + { + struct inline_summary *info2 = inline_summary (n2); + if (info2->scc_no) + break; + info2->scc_no = id; + } + } } for (edge = node->callers; edge; edge = edge->next_caller) diff --git a/gcc/testsuite/gcc.dg/ipa/inlinehint-3.c b/gcc/testsuite/gcc.dg/ipa/inlinehint-3.c new file mode 100644 index 00000000000..110ae443c67 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/inlinehint-3.c @@ -0,0 +1,37 @@ +/* { dg-options "-O3 -c -fdump-ipa-inline-details -fno-early-inlining -fno-ipa-cp" } */ +void abort (void); +int sum; +int a[10]; +int +scc_next (int c) +{ + int i; + for (i=0;i