summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-20 01:04:51 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-20 01:04:51 +0000
commitd826e13109822b8430676ef5f9de85fdbfe89ba8 (patch)
tree6d94167b35596d4f96592be435d8120a71ea2597
parent8b73097663664892cbcb87156e271e3d34736cc8 (diff)
downloadgcc-d826e13109822b8430676ef5f9de85fdbfe89ba8.tar.gz
* ipa-inline-transform.c (save_inline_function_body): Add comments.
* ipa-inline.c (inline_small_functions): Compute summaries first, populate heap later. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172751 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline-transform.c5
-rw-r--r--gcc/ipa-inline.c40
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,5 +1,11 @@
2011-04-19 Jan Hubicka <jh@suse.cz>
+ * 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 <jh@suse.cz>
+
* cgraph.h (save_inline_function_body): Remove.
* ipa-inline-transform.c: New file, broke out of...
* ipa-inline.c: ... this one; Update toplevel comment.
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));