diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-09 15:23:19 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-08-09 15:23:19 +0000 |
commit | 4d044066892ea8be28494fa571d6b686e79cd960 (patch) | |
tree | 9f0bf5f1369dcb3ba206377f3550a5b0a59cdd38 /gcc/ipa-ref.c | |
parent | 3dade231cb7933f9d60e0302945f13c60a7d4d56 (diff) | |
download | gcc-4d044066892ea8be28494fa571d6b686e79cd960.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201632 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-ref.c')
-rw-r--r-- | gcc/ipa-ref.c | 75 |
1 files changed, 60 insertions, 15 deletions
diff --git a/gcc/ipa-ref.c b/gcc/ipa-ref.c index d2c6002e176..9f45c8eb866 100644 --- a/gcc/ipa-ref.c +++ b/gcc/ipa-ref.c @@ -38,7 +38,7 @@ ipa_record_reference (symtab_node referring_node, symtab_node referred_node, enum ipa_ref_use use_type, gimple stmt) { - struct ipa_ref *ref; + struct ipa_ref *ref, *ref2; struct ipa_ref_list *list, *list2; ipa_ref_t *old_references; @@ -56,14 +56,16 @@ ipa_record_reference (symtab_node referring_node, ref->referring = referring_node; ref->referred = referred_node; ref->stmt = stmt; + ref->lto_stmt_uid = 0; ref->use = use_type; + ref->speculative = 0; /* If vector was moved in memory, update pointers. */ if (old_references != list->references->address ()) { int i; - for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++) - ipa_ref_referred_ref_list (ref)->referring[ref->referred_index] = ref; + for (i = 0; ipa_ref_list_reference_iterate (list, i, ref2); i++) + ipa_ref_referred_ref_list (ref2)->referring[ref2->referred_index] = ref2; } return ref; } @@ -155,6 +157,8 @@ ipa_dump_references (FILE * file, struct ipa_ref_list *list) symtab_node_asm_name (ref->referred), ref->referred->symbol.order, ipa_ref_use_name [ref->use]); + if (ref->speculative) + fprintf (file, " (speculative)"); } fprintf (file, "\n"); } @@ -172,22 +176,50 @@ ipa_dump_referring (FILE * file, struct ipa_ref_list *list) symtab_node_asm_name (ref->referring), ref->referring->symbol.order, ipa_ref_use_name [ref->use]); + if (ref->speculative) + fprintf (file, " (speculative)"); } fprintf (file, "\n"); } +/* Clone reference REF to DEST_NODE and set its stmt to STMT. */ + +struct ipa_ref * +ipa_clone_ref (struct ipa_ref *ref, + symtab_node dest_node, + gimple stmt) +{ + bool speculative = ref->speculative; + unsigned int stmt_uid = ref->lto_stmt_uid; + struct ipa_ref *ref2; + + ref2 = ipa_record_reference (dest_node, + ref->referred, + ref->use, stmt); + ref2->speculative = speculative; + ref2->lto_stmt_uid = stmt_uid; + return ref2; +} + /* Clone all references from SRC to DEST_NODE or DEST_VARPOOL_NODE. */ void ipa_clone_references (symtab_node dest_node, struct ipa_ref_list *src) { - struct ipa_ref *ref; + struct ipa_ref *ref, *ref2; int i; for (i = 0; ipa_ref_list_reference_iterate (src, i, ref); i++) - ipa_record_reference (dest_node, - ref->referred, - ref->use, ref->stmt); + { + bool speculative = ref->speculative; + unsigned int stmt_uid = ref->lto_stmt_uid; + + ref2 = ipa_record_reference (dest_node, + ref->referred, + ref->use, ref->stmt); + ref2->speculative = speculative; + ref2->lto_stmt_uid = stmt_uid; + } } /* Clone all referring from SRC to DEST_NODE or DEST_VARPOOL_NODE. */ @@ -196,12 +228,19 @@ void ipa_clone_referring (symtab_node dest_node, struct ipa_ref_list *src) { - struct ipa_ref *ref; + struct ipa_ref *ref, *ref2; int i; for (i = 0; ipa_ref_list_referring_iterate (src, i, ref); i++) - ipa_record_reference (ref->referring, - dest_node, - ref->use, ref->stmt); + { + bool speculative = ref->speculative; + unsigned int stmt_uid = ref->lto_stmt_uid; + + ref2 = ipa_record_reference (ref->referring, + dest_node, + ref->use, ref->stmt); + ref2->speculative = speculative; + ref2->lto_stmt_uid = stmt_uid; + } } /* Return true when execution of REF can lead to return from @@ -230,14 +269,17 @@ ipa_ref_has_aliases_p (struct ipa_ref_list *ref_list) struct ipa_ref * ipa_find_reference (symtab_node referring_node, symtab_node referred_node, - gimple stmt) + gimple stmt, unsigned int lto_stmt_uid) { struct ipa_ref *r = NULL; int i; for (i = 0; ipa_ref_list_reference_iterate (&referring_node->symbol.ref_list, i, r); i++) if (r->referred == referred_node - && (in_lto_p || r->stmt == stmt)) + && !r->speculative + && ((stmt && r->stmt == stmt) + || (lto_stmt_uid && r->lto_stmt_uid == lto_stmt_uid) + || (!stmt && !lto_stmt_uid && !r->stmt && !r->lto_stmt_uid))) return r; return NULL; } @@ -257,7 +299,9 @@ ipa_remove_stmt_references (symtab_node referring_node, gimple stmt) } /* Remove all stmt references in non-speculative references. - Those are not maintained during inlining & clonning. */ + Those are not maintained during inlining & clonning. + The exception are speculative references that are updated along + with callgraph edges associated with them. */ void ipa_clear_stmts_in_references (symtab_node referring_node) @@ -266,5 +310,6 @@ ipa_clear_stmts_in_references (symtab_node referring_node) int i; for (i = 0; ipa_ref_list_reference_iterate (&referring_node->symbol.ref_list, i, r); i++) - r->stmt = NULL; + if (!r->speculative) + r->stmt = NULL; } |