aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@gcc.gnu.org>2006-08-20 18:46:54 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2006-08-20 18:46:54 +0000
commit1057fc810fbf25761a2a9d14bad091c963020c62 (patch)
tree5f6853458a71f7068d93f5fe6eb654628397fa00 /gcc
parent96ddac7425dd56d6852f0ad53bf2283d9976aae8 (diff)
downloadgcc-1057fc810fbf25761a2a9d14bad091c963020c62.zip
gcc-1057fc810fbf25761a2a9d14bad091c963020c62.tar.gz
gcc-1057fc810fbf25761a2a9d14bad091c963020c62.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cgraphunit.c3
-rw-r--r--gcc/ipa-inline.c31
3 files changed, 34 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6104ecd..3ab3aa0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 64b3891..00351d2 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -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);
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 6bbfcf0..cc83d36 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -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));
@@ -1180,6 +1190,13 @@ cgraph_early_inlining (void)
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];
if (node->analyzed && node->local.inlinable
&& (node->needed || node->reachable)
&& node->callers)