diff options
author | Jan Hubicka <jh@suse.cz> | 2013-08-09 17:23:19 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-08-09 15:23:19 +0000 |
commit | 042ae7d242e9def81372edef1eff1046851699f0 (patch) | |
tree | 9f0bf5f1369dcb3ba206377f3550a5b0a59cdd38 /gcc/cgraphclones.c | |
parent | 6efa6002d5b3575c7e1f9096f2e0f15252ac9c4b (diff) | |
download | gcc-042ae7d242e9def81372edef1eff1046851699f0.zip gcc-042ae7d242e9def81372edef1eff1046851699f0.tar.gz gcc-042ae7d242e9def81372edef1eff1046851699f0.tar.bz2 |
cgraphbuild.c (cgraph_rebuild_references): Rebuild only non-speculative refs.
* cgraphbuild.c (cgraph_rebuild_references): Rebuild only non-speculative
refs.
* cgraph.c (cgraph_update_edge_in_call_site_hash): New function.
(cgraph_add_edge_to_call_site_hash): Deal with speculative calls.
(cgraph_set_call_stmt): Likewise.
(cgraph_create_edge_1): Fix release checking compilatoin;
clear lto_stmt_uid.
(cgraph_free_edge): Free indirect info.
(cgraph_turn_edge_to_speculative): New function.
(cgraph_speculative_call_info): New function.
(cgraph_make_edge_direct): Return direct edge; handle speculation.
(cgraph_redirect_edge_call_stmt_to_callee): Expand speculative
edges.
(dump_cgraph_node): Dump speculation.
(verify_edge_count_and_frequency): Accept speculative edges.
(verify_edge_corresponds_to_fndecl): Handle partitioned cgraph.
(verify_cgraph_node): Handle speculation.
* cgraph.h (cgraph_edge): Add SPECULATIVE flag.
(cgraph_set_call_stmt): Update prototype.
(cgraph_make_edge_direct): Update prototype.
(cgraph_speculative_call_info): Declare.
* ipa-cp.c (ipcp_discover_new_direct_edges): Be ready for edge
to change; update call of ipa_find_references.
* ipa-ref.c (ipa_record_reference): Fix return value; clear
lto_stmt_uid and speculative flags.
(ipa_dump_references): Dump speculation.
(ipa_clone_references): Clone speculative flag.
(ipa_clone_referring): Likewise.
(ipa_clone_ref): New function.
(ipa_find_reference): Look into lto_stmt_uids
(ipa_clear_stmts_in_references): Do not clear speculative calls.
* ipa-ref.h (ipa_ref): Add lto_stmt_uid and speculative flags.
(ipa_find_reference): Update declaration.
(ipa_clone_ref): Declare.
* lto-cgraph.c (lto_output_edge): Make lto_stmt_uids start from 0;
stream speculative flag.
(lto_output_ref): Stream statements uids and speculation.
(input_ref): Likewise.
(input_edge): Stream speuclation.
* cgraphclones.c (cgraph_clone_edge): Clone speculation.
(cgraph_set_call_stmt_including_clones): Handle speculation.
* ipa-inline.c (heap_edge_removal_hook): New function.
(inline_small_functions): Register it.
* lto-streamer-in.c (fixup_call_stmt_edges_1): Bounds checking;
also initialize refs.
* ipa-prop.c (ipa_make_edge_direct_to_target): Be ready for
edge to change.
(try_make_edge_direct_simple_call): Likewise.
(try_make_edge_direct_simple_call): Likewise.
(update_indirect_edges_after_inlining): Likewise.
(remove_described_reference): Look proper lto_stmt_uid.
(propagate_controlled_uses): Likewise.
(propagate_controlled_uses): Liekwise.
* tree-inline.c (copy_bb): Copy speculative edges.
(redirect_all_calls): New function.
(copy_cfg_body): Do redirection after loop info
is updated.
(delete_unreachable_blocks_update_callgraph): Updadte
speculation.
From-SVN: r201632
Diffstat (limited to 'gcc/cgraphclones.c')
-rw-r--r-- | gcc/cgraphclones.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 464c524..ae26a02 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -147,6 +147,7 @@ cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n, /* Clone flags that depend on call_stmt availability manually. */ new_edge->can_throw_external = e->can_throw_external; new_edge->call_stmt_cannot_inline_p = e->call_stmt_cannot_inline_p; + new_edge->speculative = e->speculative; if (update_original) { e->count -= new_edge->count; @@ -474,17 +475,21 @@ cgraph_find_replacement_node (struct cgraph_node *node) } /* Like cgraph_set_call_stmt but walk the clone tree and update all - clones sharing the same function body. */ + clones sharing the same function body. + When WHOLE_SPECULATIVE_EDGES is true, all three components of + speculative edge gets updated. Otherwise we update only direct + call. */ void cgraph_set_call_stmt_including_clones (struct cgraph_node *orig, - gimple old_stmt, gimple new_stmt) + gimple old_stmt, gimple new_stmt, + bool update_speculative) { struct cgraph_node *node; struct cgraph_edge *edge = cgraph_edge (orig, old_stmt); if (edge) - cgraph_set_call_stmt (edge, new_stmt); + cgraph_set_call_stmt (edge, new_stmt, update_speculative); node = orig->clones; if (node) @@ -492,7 +497,23 @@ cgraph_set_call_stmt_including_clones (struct cgraph_node *orig, { struct cgraph_edge *edge = cgraph_edge (node, old_stmt); if (edge) - cgraph_set_call_stmt (edge, new_stmt); + { + cgraph_set_call_stmt (edge, new_stmt, update_speculative); + /* If UPDATE_SPECULATIVE is false, it means that we are turning + speculative call into a real code sequence. Update the + callgraph edges. */ + if (edge->speculative && !update_speculative) + { + struct cgraph_edge *direct, *indirect; + struct ipa_ref *ref; + + gcc_assert (!edge->indirect_unknown_callee); + cgraph_speculative_call_info (edge, direct, indirect, ref); + direct->speculative = false; + indirect->speculative = false; + ref->speculative = false; + } + } if (node->clones) node = node->clones; else if (node->next_sibling_clone) @@ -811,6 +832,7 @@ cgraph_materialize_all_clones (void) { struct cgraph_node *node; bool stabilized = false; + if (cgraph_dump_file) fprintf (cgraph_dump_file, "Materializing clones\n"); |