re PR middle-end/28779 (internal compiler error: in cgraph_estimate_size_after_inlining, at ipa-inline.c:106)

PR middle-end/28779
	* ipa-inline.c (cgraph_decide_inlining, cgraph_early_inlining): Compute
	function body sizes.
	* cgraphunit.c (cgraph_analyze_function): Don't do so.

From-SVN: r116274
This commit is contained in:
Jan Hubicka 2006-08-20 18:46:54 +00:00
parent 96ddac7425
commit 1057fc810f
3 changed files with 34 additions and 9 deletions

View File

@ -1,4 +1,11 @@
006-08-20 Danny Smith <dannysmith@users.sourceforge.net>
2006-08-20 Jan Hubicka <jh@suse.cz>
PR middle-end/28779
* ipa-inline.c (cgraph_decide_inlining, cgraph_early_inlining): Compute
function body sizes.
* cgraphunit.c (cgraph_analyze_function): Don't do so.
2006-08-20 Danny Smith <dannysmith@users.sourceforge.net>
PR target/28648 c:
* tree.c (handle_dll_attribute): Return early if not a

View File

@ -928,7 +928,8 @@ cgraph_analyze_function (struct cgraph_node *node)
cgraph_create_edges (node, decl);
node->local.inlinable = tree_inlinable_function_p (decl);
node->local.self_insns = estimate_num_insns (decl);
if (!flag_unit_at_a_time)
node->local.self_insns = estimate_num_insns (decl);
if (node->local.inlinable)
node->local.disregard_inline_limits
= lang_hooks.tree_inlining.disregard_inline_limits (decl);

View File

@ -899,13 +899,23 @@ cgraph_decide_inlining (void)
timevar_push (TV_INLINE_HEURISTICS);
max_count = 0;
for (node = cgraph_nodes; node; node = node->next)
{
struct cgraph_edge *e;
initial_insns += node->local.self_insns;
for (e = node->callees; e; e = e->next_callee)
if (max_count < e->count)
max_count = e->count;
}
if (node->analyzed && (node->needed || node->reachable))
{
struct cgraph_edge *e;
/* At the moment, no IPA passes change function bodies before inlining.
Save some time by not recomputing function body sizes if early inlining
already did so. */
if (!flag_early_inlining)
node->local.self_insns = node->global.insns
= estimate_num_insns (node->decl);
initial_insns += node->local.self_insns;
gcc_assert (node->local.self_insns == node->global.insns);
for (e = node->callees; e; e = e->next_callee)
if (max_count < e->count)
max_count = e->count;
}
overall_insns = initial_insns;
gcc_assert (!max_count || (profile_info && flag_branch_probabilities));
@ -1177,6 +1187,13 @@ cgraph_early_inlining (void)
order = ggc_alloc (sizeof (*order) * cgraph_n_nodes);
nnodes = cgraph_postorder (order);
for (i = nnodes - 1; i >= 0; i--)
{
node = order[i];
if (node->analyzed && (node->needed || node->reachable))
node->local.self_insns = node->global.insns
= estimate_num_insns (node->decl);
}
for (i = nnodes - 1; i >= 0; i--)
{
node = order[i];