ipa-inline-analysis.c (growth_data): Add uninlinable field.

* ipa-inline-analysis.c (growth_data): Add uninlinable field.
	(do_estimate_growth_1): Record if any uninlinable edge was seen.
	(estimate_growth): Handle uninlinable edges correctly.
	(check_callers): New.
	(growth_likely_positive): Handle aliases correctly.

From-SVN: r220710
This commit is contained in:
Jan Hubicka 2015-02-15 00:46:25 +01:00 committed by Jan Hubicka
parent 31de760604
commit cf3648f245
2 changed files with 50 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2015-02-14 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline-analysis.c (growth_data): Add uninlinable field.
(do_estimate_growth_1): Record if any uninlinable edge was seen.
(estimate_growth): Handle uninlinable edges correctly.
(check_callers): New.
(growth_likely_positive): Handle aliases correctly.
2015-02-14 Jan Hubicka <hubicka@ucw.cz> 2015-02-14 Jan Hubicka <hubicka@ucw.cz>
* ipa-chkp.c: Use iterate_direct_aliases. * ipa-chkp.c: Use iterate_direct_aliases.

View File

@ -3901,6 +3901,7 @@ struct growth_data
{ {
struct cgraph_node *node; struct cgraph_node *node;
bool self_recursive; bool self_recursive;
bool uninlinable;
int growth; int growth;
}; };
@ -3917,6 +3918,12 @@ do_estimate_growth_1 (struct cgraph_node *node, void *data)
{ {
gcc_checking_assert (e->inline_failed); gcc_checking_assert (e->inline_failed);
if (cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
{
d->uninlinable = true;
continue;
}
if (e->caller == d->node if (e->caller == d->node
|| (e->caller->global.inlined_to || (e->caller->global.inlined_to
&& e->caller->global.inlined_to == d->node)) && e->caller->global.inlined_to == d->node))
@ -3932,10 +3939,10 @@ do_estimate_growth_1 (struct cgraph_node *node, void *data)
int int
estimate_growth (struct cgraph_node *node) estimate_growth (struct cgraph_node *node)
{ {
struct growth_data d = { node, 0, false }; struct growth_data d = { node, false, false, 0 };
struct inline_summary *info = inline_summaries->get (node); struct inline_summary *info = inline_summaries->get (node);
node->call_for_symbol_thunks_and_aliases (do_estimate_growth_1, &d, true); node->call_for_symbol_and_aliases (do_estimate_growth_1, &d, true);
/* For self recursive functions the growth estimation really should be /* For self recursive functions the growth estimation really should be
infinity. We don't want to return very large values because the growth infinity. We don't want to return very large values because the growth
@ -3943,7 +3950,7 @@ estimate_growth (struct cgraph_node *node)
return zero or negative growths. */ return zero or negative growths. */
if (d.self_recursive) if (d.self_recursive)
d.growth = d.growth < info->size ? info->size : d.growth; d.growth = d.growth < info->size ? info->size : d.growth;
else if (DECL_EXTERNAL (node->decl)) else if (DECL_EXTERNAL (node->decl) || d.uninlinable)
; ;
else else
{ {
@ -3962,6 +3969,28 @@ estimate_growth (struct cgraph_node *node)
return d.growth; return d.growth;
} }
/* Verify if there are fewer than MAX_CALLERS. */
static bool
check_callers (cgraph_node *node, int *max_callers)
{
ipa_ref *ref;
for (cgraph_edge *e = node->callers; e; e = e->next_caller)
{
(*max_callers)--;
if (!*max_callers
|| cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
return true;
}
FOR_EACH_ALIAS (node, ref)
if (check_callers (dyn_cast <cgraph_node *> (ref->referring), max_callers))
return true;
return false;
}
/* Make cheap estimation if growth of NODE is likely positive knowing /* Make cheap estimation if growth of NODE is likely positive knowing
EDGE_GROWTH of one particular edge. EDGE_GROWTH of one particular edge.
@ -3969,7 +3998,8 @@ estimate_growth (struct cgraph_node *node)
and skip computation if there are too many callers. */ and skip computation if there are too many callers. */
bool bool
growth_likely_positive (struct cgraph_node *node, int edge_growth ATTRIBUTE_UNUSED) growth_likely_positive (struct cgraph_node *node,
int edge_growth)
{ {
int max_callers; int max_callers;
struct cgraph_edge *e; struct cgraph_edge *e;
@ -4000,9 +4030,16 @@ growth_likely_positive (struct cgraph_node *node, int edge_growth ATTRIBUTE_UNUS
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
{ {
max_callers--; max_callers--;
if (!max_callers) if (!max_callers
|| cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
return true; return true;
} }
ipa_ref *ref;
FOR_EACH_ALIAS (node, ref)
if (check_callers (dyn_cast <cgraph_node *> (ref->referring), &max_callers))
return true;
return estimate_growth (node) > 0; return estimate_growth (node) > 0;
} }