diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-13 12:21:16 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-13 12:21:16 +0000 |
commit | 12d5ae9f36940d21c2d3804a81678b6ebc941d80 (patch) | |
tree | e903dc537f27c5dd690cb3a98029321225e8f7b4 /gcc/ipa-inline-transform.c | |
parent | 936c99ae35bdc3ab7e01faae57b9570cf0d18781 (diff) | |
download | gcc-12d5ae9f36940d21c2d3804a81678b6ebc941d80.tar.gz |
* cgraph.c (cgraph_turn_edge_to_speculative): Return newly
introduced edge; fix typo in sanity check.
(cgraph_resolve_speculation): Export; improve diagnostic.
(cgraph_redirect_edge_call_stmt_to_callee): Better diagnostic; cancel
speculation at type mismatch.
* cgraph.h (cgraph_turn_edge_to_speculative): Update.
(cgraph_resolve_speculation): Declare.
(symtab_can_be_discarded): New function.
* value-prof.c (gimple_ic_transform): Remove actual transform code.
* ipa-inline-transform.c (speculation_removed): New global var.
(clone_inlined_nodes): See if speculation can be removed.
(inline_call): If speculations was removed, we growths may not match.
* ipa-inline.c (can_inline_edge_p): Add DISREGARD_LIMITS parameter.
(speculation_useful_p): New function.
(resolve_noninline_speculation): New function.
(inline_small_functions): Resolve useless speculations.
* ipa-inline.h (speculation_useful_p): Declare
* ipa.c (can_replace_by_local_alias): Simplify.
(ipa_profile): Produce speculative calls in non-lto, too;
add simple cost model; produce local aliases.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201683 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-inline-transform.c')
-rw-r--r-- | gcc/ipa-inline-transform.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 54b113ac000..8ead336de64 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see int ncalls_inlined; int nfunctions_inlined; +bool speculation_removed; /* Scale frequency of NODE edges by FREQ_SCALE. */ @@ -134,6 +135,7 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original, int *overall_size) { struct cgraph_node *inlining_into; + struct cgraph_edge *next; if (e->caller->global.inlined_to) inlining_into = e->caller->global.inlined_to; @@ -186,9 +188,17 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, e->callee->global.inlined_to = inlining_into; /* Recursively clone all bodies. */ - for (e = e->callee->callees; e; e = e->next_callee) - if (!e->inline_failed) - clone_inlined_nodes (e, duplicate, update_original, overall_size); + for (e = e->callee->callees; e; e = next) + { + next = e->next_callee; + if (!e->inline_failed) + clone_inlined_nodes (e, duplicate, update_original, overall_size); + if (e->speculative && !speculation_useful_p (e, true)) + { + cgraph_resolve_speculation (e, NULL); + speculation_removed = true; + } + } } @@ -218,6 +228,7 @@ inline_call (struct cgraph_edge *e, bool update_original, bool predicated = inline_edge_summary (e)->predicate != NULL; #endif + speculation_removed = false; /* Don't inline inlined edges. */ gcc_assert (e->inline_failed); /* Don't even think of inlining inline clone. */ @@ -267,6 +278,7 @@ inline_call (struct cgraph_edge *e, bool update_original, error due to INLINE_SIZE_SCALE roudoff errors. */ gcc_assert (!update_overall_summary || !overall_size || new_edges_found || abs (estimated_growth - (new_size - old_size)) <= 1 + || speculation_removed /* FIXME: a hack. Edges with false predicate are accounted wrong, we should remove them from callgraph. */ || predicated); |