diff options
author | Jan Hubicka <jh@suse.cz> | 2006-08-21 03:42:39 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2006-08-21 01:42:39 +0000 |
commit | 70d539ce3a777b83d929c6de70b14a6eb7f3a100 (patch) | |
tree | a12516abd37107b901b016eeb00d8d3bf4e3660f /gcc/ipa-inline.c | |
parent | 76395e081fd157eea5646a1dc4add10415d8b330 (diff) | |
download | gcc-70d539ce3a777b83d929c6de70b14a6eb7f3a100.zip gcc-70d539ce3a777b83d929c6de70b14a6eb7f3a100.tar.gz gcc-70d539ce3a777b83d929c6de70b14a6eb7f3a100.tar.bz2 |
re PR middle-end/28071 (A file that can not be compiled in reasonable time/space)
PR rtl-optimization/28071
* tree-optimize.c (tree_rest_of_compilation): Do not remove edges
twice.
* tree-inline.c (copy_bb): Use cgraph_set_call_stmt.
* ipa-inline.c (cgraph_check_inline_limits): Add one_only argument.
(cgraph_decide_inlining, cgraph_decide_inlining_of_small_function,
cgraph_decide_inlining_incrementally): Update use of
cgraph_check_inline_limits.
* cgraph.c (edge_hash, edge_eq): New function.
(cgraph_edge, cgraph_set_call_stmt, cgraph_create_edge,
cgraph_edge_remove_caller, cgraph_node_remove_callees,
cgraph_remove_node): Maintain call site hash.
* cgraph.h (struct cgraph_node): Add call_site_hash.
(cgraph_set_call_stmt): New function.
From-SVN: r116284
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index cc83d36..638fdef 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -243,20 +243,27 @@ cgraph_estimate_growth (struct cgraph_node *node) } /* Return false when inlining WHAT into TO is not good idea - as it would cause too large growth of function bodies. */ + as it would cause too large growth of function bodies. + When ONE_ONLY is true, assume that only one call site is going + to be inlined, otherwise figure out how many call sites in + TO calls WHAT and verify that all can be inlined. + */ static bool cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what, - const char **reason) + const char **reason, bool one_only) { int times = 0; struct cgraph_edge *e; int newsize; int limit; - for (e = to->callees; e; e = e->next_callee) - if (e->callee == what) - times++; + if (one_only) + times = 1; + else + for (e = to->callees; e; e = e->next_callee) + if (e->callee == what) + times++; if (to->global.inlined_to) to = to->global.inlined_to; @@ -836,7 +843,7 @@ cgraph_decide_inlining_of_small_functions (void) { struct cgraph_node *callee; if (!cgraph_check_inline_limits (edge->caller, edge->callee, - &edge->inline_failed)) + &edge->inline_failed, true)) { if (dump_file) fprintf (dump_file, " Not inlining into %s:%s.\n", @@ -1037,7 +1044,7 @@ cgraph_decide_inlining (void) old_insns = overall_insns; if (cgraph_check_inline_limits (node->callers->caller, node, - NULL)) + NULL, false)) { cgraph_mark_inline (node->callers); if (dump_file) @@ -1109,7 +1116,8 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *node, bool early) && (!early || (cgraph_estimate_size_after_inlining (1, e->caller, e->callee) <= e->caller->global.insns)) - && cgraph_check_inline_limits (node, e->callee, &e->inline_failed) + && cgraph_check_inline_limits (node, e->callee, &e->inline_failed, + false) && (DECL_SAVED_TREE (e->callee->decl) || e->callee->inline_decl)) { if (cgraph_default_inline_p (e->callee, &failed_reason)) |