diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-09 12:31:32 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-09 12:31:32 +0000 |
commit | 5cf7e051674826c62b2d70c98530387013309834 (patch) | |
tree | 58bcd25939fd842f2d2ab057e27eab3107a48c31 /gcc/lto-cgraph.c | |
parent | 1af980453827d996e94e360fc137331a0dccb828 (diff) | |
download | gcc-5cf7e051674826c62b2d70c98530387013309834.tar.gz |
Replace cgraph_node_set and varpool_node_set by symtab_node_encoder
in partitioning.
* tree-pass.h (cgraph_node_set_def, varpool_node_set_def): Remove
forward declaration.
(lto_symtab_encoder_d): Forward declare.
(ipa_write_optimization_summaries): Update.
* lto-cgraph.c (lto_symtab_encoder_new): Do not initialize
body, initializer and in_partition.
(lto_symtab_encoder_delete): Update.
(lto_symtab_encoder_encode): Update.
(lto_symtab_encoder_lookup): Move inline.
(lto_symtab_encoder_delete_node): New function.
(lto_symtab_encoder_encode_body_p, lto_set_symtab_encoder_encode_body,
lto_symtab_encoder_encode_initializer_p,
lto_set_symtab_encoder_encode_initializer, lto_symtab_encoder_in_partition_p,
lto_symtab_encoder_in_partition_p): Update.
(compute_ltrans_boundary): Take encoder as an input.
* passes.c (ipa_write_summaries_1): Update.
(ipa_write_summaries_1): Update.
(ipa_write_summaries): Update.
(ipa_write_optimization_summaries): Update.
* lto-streamer.c (print_lto_report): Report number of cgraph nodes.
* lto-streamer.h (lto_stats_d): Replace num_output_cgraph_nodes by
num_output_symtab_nodes.
(lto_encoder_entry): New structure.
(struct lto_symtab_encoder_d): Reorg.
(lto_symtab_encoder_delete_node): Declare.
(lto_symtab_encoder_lookup): Bring inline.
(compute_ltrans_boundary): Update.
(lto_symtab_encoder_size): Update.
(lsei_node, lsei_cgraph_node, lsei_varpool_node): Update.
(lto_symtab_encoder_deref): Update.
Replace cgraph_node_set and varpool_node_set by symtab_node_encoder
in partitioning.
* lto-partition.h (ltrans_partition_def): Replace cgraph_set and varpool_set
by encoder.
* lto-partition.c (new_partition): Update.
* lto.c (cmp_partitions_order): Update.
(lto_wpa_write_files): Update.
(free_ltrans_partitions): Update.
(add_references_to_partition): Update.
(add_cgraph_node_to_partition_1): Update.
(add_cgraph_node_to_partition): Update.
(add_varpool_node_to_partition): Update.
(undo_partition): Update.
(lto_balanced_map): Update.
(set_referenced_from_other_partition_p, set_reachable_from_other_partition_p,
set_referenced_from_this_partition_p): Update.
(lto_promote_cross_file_statics): Update.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191107 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r-- | gcc/lto-cgraph.c | 115 |
1 files changed, 76 insertions, 39 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index c08d0998779..0281cdb42bc 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -80,9 +80,6 @@ lto_symtab_encoder_new (void) lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d); encoder->map = pointer_map_create (); encoder->nodes = NULL; - encoder->body = pointer_set_create (); - encoder->initializer = pointer_set_create (); - encoder->in_partition = pointer_set_create (); return encoder; } @@ -92,11 +89,8 @@ lto_symtab_encoder_new (void) void lto_symtab_encoder_delete (lto_symtab_encoder_t encoder) { - VEC_free (symtab_node, heap, encoder->nodes); + VEC_free (lto_encoder_entry, heap, encoder->nodes); pointer_map_destroy (encoder->map); - pointer_set_destroy (encoder->body); - pointer_set_destroy (encoder->initializer); - pointer_set_destroy (encoder->in_partition); free (encoder); } @@ -113,29 +107,57 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder, void **slot; slot = pointer_map_contains (encoder->map, node); - if (!slot) + if (!slot || !*slot) { - ref = VEC_length (symtab_node, encoder->nodes); - slot = pointer_map_insert (encoder->map, node); - *slot = (void *) (intptr_t) ref; - VEC_safe_push (symtab_node, heap, encoder->nodes, node); + lto_encoder_entry entry = {node, false, false, false}; + ref = VEC_length (lto_encoder_entry, encoder->nodes); + if (!slot) + slot = pointer_map_insert (encoder->map, node); + *slot = (void *) (intptr_t) (ref + 1); + VEC_safe_push (lto_encoder_entry, heap, encoder->nodes, &entry); } else - ref = (int) (intptr_t) *slot; + ref = (size_t) *slot - 1; return ref; } +/* Remove NODE from encoder. */ -/* Look up NODE in encoder. Return NODE's reference if it has been encoded - or LCC_NOT_FOUND if it is not there. */ - -int -lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder, - symtab_node node) +bool +lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder, + symtab_node node) { - void **slot = pointer_map_contains (encoder->map, node); - return (slot ? (int) (intptr_t) *slot : LCC_NOT_FOUND); + void **slot, **last_slot; + int index; + lto_encoder_entry last_node; + + slot = pointer_map_contains (encoder->map, node); + if (slot == NULL || !*slot) + return false; + + index = (size_t) *slot - 1; + gcc_checking_assert (VEC_index (lto_encoder_entry, + encoder->nodes, index).node + == node); + + /* Remove from vector. We do this by swapping node with the last element + of the vector. */ + last_node = VEC_pop (lto_encoder_entry, encoder->nodes); + if (last_node.node != node) + { + last_slot = pointer_map_contains (encoder->map, last_node.node); + gcc_checking_assert (last_slot && *last_slot); + *last_slot = (void *)(size_t) (index + 1); + + /* Move the last element to the original spot of NODE. */ + VEC_replace (lto_encoder_entry, encoder->nodes, index, + last_node); + } + + /* Remove element from hash table. */ + *slot = NULL; + return true; } @@ -145,7 +167,8 @@ bool lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder, struct cgraph_node *node) { - return pointer_set_contains (encoder->body, node); + int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); + return VEC_index (lto_encoder_entry, encoder->nodes, index).body; } /* Return TRUE if we should encode body of NODE (if any). */ @@ -154,7 +177,10 @@ static void lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder, struct cgraph_node *node) { - pointer_set_insert (encoder->body, node); + int index = lto_symtab_encoder_encode (encoder, (symtab_node)node); + gcc_checking_assert (VEC_index (lto_encoder_entry, encoder->nodes, + index).node == (symtab_node)node); + VEC_index (lto_encoder_entry, encoder->nodes, index).body = true; } /* Return TRUE if we should encode initializer of NODE (if any). */ @@ -163,7 +189,10 @@ bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder, struct varpool_node *node) { - return pointer_set_contains (encoder->initializer, node); + int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); + if (index == LCC_NOT_FOUND) + return false; + return VEC_index (lto_encoder_entry, encoder->nodes, index).initializer; } /* Return TRUE if we should encode initializer of NODE (if any). */ @@ -172,7 +201,8 @@ static void lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder, struct varpool_node *node) { - pointer_set_insert (encoder->initializer, node); + int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); + VEC_index (lto_encoder_entry, encoder->nodes, index).initializer = true; } /* Return TRUE if we should encode initializer of NODE (if any). */ @@ -181,7 +211,10 @@ bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder, symtab_node node) { - return pointer_set_contains (encoder->in_partition, node); + int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); + if (index == LCC_NOT_FOUND) + return false; + return VEC_index (lto_encoder_entry, encoder->nodes, index).in_partition; } /* Return TRUE if we should encode body of NODE (if any). */ @@ -190,8 +223,8 @@ void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder, symtab_node node) { - lto_symtab_encoder_encode (encoder, (symtab_node)node); - pointer_set_insert (encoder->in_partition, node); + int index = lto_symtab_encoder_encode (encoder, (symtab_node)node); + VEC_index (lto_encoder_entry, encoder->nodes, index).in_partition = true; } /* Output the cgraph EDGE to OB using ENCODER. */ @@ -645,28 +678,31 @@ output_refs (lto_symtab_encoder_t encoder) and insert them to encoders. */ void compute_ltrans_boundary (struct lto_out_decl_state *state, - cgraph_node_set set, varpool_node_set vset) + lto_symtab_encoder_t in_encoder) { struct cgraph_node *node; - cgraph_node_set_iterator csi; - varpool_node_set_iterator vsi; struct cgraph_edge *edge; int i; lto_symtab_encoder_t encoder; + lto_symtab_encoder_iterator lsei; encoder = state->symtab_node_encoder = lto_symtab_encoder_new (); - /* Go over all the nodes in SET and assign references. */ - for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi)) + /* Go over all entries in the IN_ENCODER and duplicate them to + ENCODER. At the same time insert masters of clones so + every master appears before clone. */ + for (lsei = lsei_start_function_in_partition (in_encoder); + !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) { - node = csi_node (csi); + node = lsei_cgraph_node (lsei); add_node_to (encoder, node, true); lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node); add_references (encoder, &node->symbol.ref_list); } - for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi)) + for (lsei = lsei_start_variable_in_partition (in_encoder); + !lsei_end_p (lsei); lsei_next_variable_in_partition (&lsei)) { - struct varpool_node *vnode = vsi_node (vsi); + struct varpool_node *vnode = lsei_varpool_node (lsei); gcc_assert (!vnode->alias || vnode->alias_of); lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode); lto_set_symtab_encoder_encode_initializer (encoder, vnode); @@ -696,13 +732,14 @@ compute_ltrans_boundary (struct lto_out_decl_state *state, /* Go over all the nodes again to include callees that are not in SET. */ - for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi)) + for (lsei = lsei_start_function_in_partition (encoder); + !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) { - node = csi_node (csi); + node = lsei_cgraph_node (lsei); for (edge = node->callees; edge; edge = edge->next_callee) { struct cgraph_node *callee = edge->callee; - if (!cgraph_node_in_set_p (callee, set)) + if (!lto_symtab_encoder_in_partition_p (encoder, (symtab_node)callee)) { /* We should have moved all the inlines. */ gcc_assert (!callee->global.inlined_to); |