aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-08-10 09:52:23 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2012-08-10 07:52:23 +0000
commitc170d40f35ca1d3b3ee6b152066b0abef9c8c93a (patch)
treea4119dbf7cb9f4c8a3b1dcd3719430eb66b2d714 /gcc/ipa-inline.c
parent938ff79ae799ad8e961c6562b31d20899c6a132b (diff)
downloadgcc-c170d40f35ca1d3b3ee6b152066b0abef9c8c93a.zip
gcc-c170d40f35ca1d3b3ee6b152066b0abef9c8c93a.tar.gz
gcc-c170d40f35ca1d3b3ee6b152066b0abef9c8c93a.tar.bz2
re PR middle-end/54146 (Very slow compile with attribute((flatten)))
PR middle-end/54146 * ipa-inline-transform.c (inline_call): Add UPDATE_OVERALL_SUMMARY parameter; honnor it. * ipa-inline.c (recursive_inlining): Update call of inline_call. (inline_small_functions): Likewise. (ipa_inline): Likewise. (inline_always_inline_functions): Likewise. (early_inline_small_functions): Likewise. (flatten_function): Do separate update of summary info. * ipa-inline.h (inline_update_overall_summary): Declare. (inline_call): Update. * ipa-inline-analysis.c (inline_merge_summary): Break out updating code to ... (inline_update_overall_summary): Likewise. From-SVN: r190283
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r--gcc/ipa-inline.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 1a4594d..d8b66e6 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -1209,7 +1209,7 @@ recursive_inlining (struct cgraph_edge *edge,
}
cgraph_redirect_edge_callee (curr, master_clone);
- inline_call (curr, false, new_edges, &overall_size);
+ inline_call (curr, false, new_edges, &overall_size, true);
lookup_recursive_calls (node, curr->callee, heap);
n++;
}
@@ -1480,7 +1480,7 @@ inline_small_functions (void)
fprintf (dump_file, " Peeling recursion with depth %i\n", depth);
gcc_checking_assert (!callee->global.inlined_to);
- inline_call (edge, true, &new_indirect_edges, &overall_size);
+ inline_call (edge, true, &new_indirect_edges, &overall_size, true);
if (flag_indirect_inlining)
add_new_edges_to_heap (heap, new_indirect_edges);
@@ -1602,7 +1602,7 @@ flatten_function (struct cgraph_node *node, bool early)
xstrdup (cgraph_node_name (callee)),
xstrdup (cgraph_node_name (e->caller)));
orig_callee = callee;
- inline_call (e, true, NULL, NULL);
+ inline_call (e, true, NULL, NULL, false);
if (e->callee != orig_callee)
orig_callee->symbol.aux = (void *) node;
flatten_function (e->callee, early);
@@ -1611,6 +1611,8 @@ flatten_function (struct cgraph_node *node, bool early)
}
node->symbol.aux = NULL;
+ if (!node->global.inlined_to)
+ inline_update_overall_summary (node);
}
/* Decide on the inlining. We do so in the topological order to avoid
@@ -1710,7 +1712,7 @@ ipa_inline (void)
inline_summary (node->callers->caller)->size);
}
- inline_call (node->callers, true, NULL, NULL);
+ inline_call (node->callers, true, NULL, NULL, true);
if (dump_file)
fprintf (dump_file,
" Inlined into %s which now has %i size\n",
@@ -1768,9 +1770,11 @@ inline_always_inline_functions (struct cgraph_node *node)
fprintf (dump_file, " Inlining %s into %s (always_inline).\n",
xstrdup (cgraph_node_name (e->callee)),
xstrdup (cgraph_node_name (e->caller)));
- inline_call (e, true, NULL, NULL);
+ inline_call (e, true, NULL, NULL, false);
inlined = true;
}
+ if (inlined)
+ inline_update_overall_summary (node);
return inlined;
}
@@ -1818,7 +1822,7 @@ early_inline_small_functions (struct cgraph_node *node)
fprintf (dump_file, " Inlining %s into %s.\n",
xstrdup (cgraph_node_name (callee)),
xstrdup (cgraph_node_name (e->caller)));
- inline_call (e, true, NULL, NULL);
+ inline_call (e, true, NULL, NULL, true);
inlined = true;
}