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
This commit is contained in:
parent
5d51714103
commit
bf3f651054
@ -1,3 +1,11 @@
|
||||
2012-10-28 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* 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 <steven@gcc.gnu.org>
|
||||
|
||||
PR rtl-optimization/38711
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
37
gcc/testsuite/gcc.dg/ipa/inlinehint-3.c
Normal file
37
gcc/testsuite/gcc.dg/ipa/inlinehint-3.c
Normal file
@ -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<c;i++)
|
||||
a[i]=c;
|
||||
scc_entry (c);
|
||||
}
|
||||
int
|
||||
scc_entry (int c)
|
||||
{
|
||||
int i;
|
||||
for (i=0;i<c;i++)
|
||||
sum+=a[i];
|
||||
if (c--)
|
||||
scc_next (c);
|
||||
return sum;
|
||||
}
|
||||
main()
|
||||
{
|
||||
int sum;
|
||||
int i;
|
||||
for (i=0;i<10;i++)
|
||||
scc_entry (i);
|
||||
if (sum < 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
/* { dg-final { scan-ipa-dump "in_scc" "inline" } } */
|
||||
/* { dg-final { scan-ipa-dump "same_scc" "inline" } } */
|
||||
/* Main is not in scc, the two functions are. */
|
||||
/* { dg-final { scan-ipa-dump-times "In SCC" 2 "inline" } } */
|
||||
/* { dg-final { cleanup-ipa-dump "inline" } } */
|
Loading…
Reference in New Issue
Block a user