diff options
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 6bbfcf0c00e..cc83d366a56 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) |