Commit bf3f6510 by Jan Hubicka Committed by Jan Hubicka

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
parent 5d517141
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> 2012-10-28 Steven Bosscher <steven@gcc.gnu.org>
PR rtl-optimization/38711 PR rtl-optimization/38711
...@@ -1375,6 +1375,9 @@ dump_inline_summary (FILE * f, struct cgraph_node *node) ...@@ -1375,6 +1375,9 @@ dump_inline_summary (FILE * f, struct cgraph_node *node)
(int) s->estimated_self_stack_size); (int) s->estimated_self_stack_size);
fprintf (f, " global stack: %i\n", fprintf (f, " global stack: %i\n",
(int) s->estimated_stack_size); (int) s->estimated_stack_size);
if (s->scc_no)
fprintf (f, " In SCC: %i\n",
(int) s->scc_no);
for (i = 0; for (i = 0;
VEC_iterate (size_time_entry, s->entry, i, e); VEC_iterate (size_time_entry, s->entry, i, e);
i++) i++)
...@@ -3348,7 +3351,8 @@ do_estimate_edge_time (struct cgraph_edge *edge) ...@@ -3348,7 +3351,8 @@ do_estimate_edge_time (struct cgraph_edge *edge)
VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).size VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).size
= size + (size >= 0); = size + (size >= 0);
if (inline_summary (to)->scc_no 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; hints |= INLINE_HINT_same_scc;
VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).hints VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid).hints
= hints + 1; = hints + 1;
...@@ -3439,7 +3443,8 @@ do_estimate_edge_hints (struct cgraph_edge *edge) ...@@ -3439,7 +3443,8 @@ do_estimate_edge_hints (struct cgraph_edge *edge)
VEC_free (tree, heap, known_binfos); VEC_free (tree, heap, known_binfos);
VEC_free (ipa_agg_jump_function_p, heap, known_aggs); VEC_free (ipa_agg_jump_function_p, heap, known_aggs);
if (inline_summary (to)->scc_no 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; hints |= INLINE_HINT_same_scc;
return hints; return hints;
} }
......
...@@ -861,9 +861,9 @@ edge_badness (struct cgraph_edge *edge, bool dump) ...@@ -861,9 +861,9 @@ edge_badness (struct cgraph_edge *edge, bool dump)
We might mix the valud into the fraction by taking into account We might mix the valud into the fraction by taking into account
relative growth of the unit, but for now just add the number relative growth of the unit, but for now just add the number
into resulting fraction. */ into resulting fraction. */
if (badness > INT_MAX / 4) if (badness > INT_MAX / 8)
{ {
badness = INT_MAX / 4; badness = INT_MAX / 8;
if (dump) if (dump)
fprintf (dump_file, "Badness overflow\n"); fprintf (dump_file, "Badness overflow\n");
} }
...@@ -1360,8 +1360,19 @@ inline_small_functions (void) ...@@ -1360,8 +1360,19 @@ inline_small_functions (void)
if (!DECL_EXTERNAL (node->symbol.decl)) if (!DECL_EXTERNAL (node->symbol.decl))
initial_size += info->size; initial_size += info->size;
info->scc_no = (dfs && dfs->next_cycle && dfs->next_cycle != node if (dfs && dfs->next_cycle)
? dfs->scc_no + 1 : 0); {
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) for (edge = node->callers; edge; edge = edge->next_caller)
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment