From 1a3118e962531f1a76397596f5448cc8e0b34b5f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 20 Apr 2011 03:04:51 +0200 Subject: [PATCH] ipa-inline-transform.c (save_inline_function_body): Add comments. * ipa-inline-transform.c (save_inline_function_body): Add comments. * ipa-inline.c (inline_small_functions): Compute summaries first, populate heap later. From-SVN: r172751 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-inline-transform.c | 5 +++++ gcc/ipa-inline.c | 40 ++++++++++++++++++++++++-------------- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ba9b21c4c1..9ca4ae40b68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-04-19 Jan Hubicka + + * ipa-inline-transform.c (save_inline_function_body): Add comments. + * ipa-inline.c (inline_small_functions): Compute summaries first, populate + heap later. + 2011-04-19 Jan Hubicka * cgraph.h (save_inline_function_body): Remove. diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 0fb24488893..25ad84a418c 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -253,6 +253,9 @@ save_inline_function_body (struct cgraph_node *node) /* Now node in question has no clones. */ node->clones = NULL; + /* Inline clones share decl with the function they are cloned + from. Walk the whole clone tree and redirect them all to the + new decl. */ if (first_clone->clones) for (n = first_clone->clones; n != first_clone;) { @@ -275,6 +278,8 @@ save_inline_function_body (struct cgraph_node *node) tree_function_versioning (node->decl, first_clone->decl, NULL, true, NULL, NULL, NULL); + /* The function will be short lived and removed after we inline all the clones, + but make it internal so we won't confuse ourself. */ DECL_EXTERNAL (first_clone->decl) = 0; DECL_COMDAT_GROUP (first_clone->decl) = NULL_TREE; TREE_PUBLIC (first_clone->decl) = 0; diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 5140cfa744c..48d38983459 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1127,22 +1127,18 @@ inline_small_functions (void) "\nDeciding on inlining of small functions. Starting with size %i.\n", initial_size); - /* Populate the heeap with all edges we might inline. - While doing so compute overall unit size and other global - parameters used by badness metrics. */ + /* Compute overall unit size and other global parameters used by badness + metrics. */ max_count = 0; max_benefit = 0; + for (node = cgraph_nodes; node; node = node->next) if (node->analyzed && !node->global.inlined_to) { struct inline_summary *info = inline_summary (node); - if (dump_file) - fprintf (dump_file, "Enqueueing calls of %s/%i.\n", - cgraph_node_name (node), node->uid); - info->estimated_growth = INT_MIN; if (!DECL_EXTERNAL (node->decl)) @@ -1156,20 +1152,34 @@ inline_small_functions (void) max_count = edge->count; if (max_benefit < benefit) max_benefit = benefit; - if (edge->inline_failed - && can_inline_edge_p (edge, true) - && want_inline_small_function_p (edge, true) - && edge->inline_failed) - { - gcc_assert (!edge->aux); - update_edge_key (heap, edge); - } } } overall_size = initial_size; max_size = compute_max_insns (overall_size); min_size = overall_size; + + /* Populate the heeap with all edges we might inline. */ + + for (node = cgraph_nodes; node; node = node->next) + if (node->analyzed + && !node->global.inlined_to) + { + if (dump_file) + fprintf (dump_file, "Enqueueing calls of %s/%i.\n", + cgraph_node_name (node), node->uid); + + for (edge = node->callers; edge; edge = edge->next_caller) + if (edge->inline_failed + && can_inline_edge_p (edge, true) + && want_inline_small_function_p (edge, true) + && edge->inline_failed) + { + gcc_assert (!edge->aux); + update_edge_key (heap, edge); + } + } + gcc_assert (in_lto_p || !max_count || (profile_info && flag_branch_probabilities)); -- 2.30.2