summaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-09 12:31:32 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-09 12:31:32 +0000
commit5cf7e051674826c62b2d70c98530387013309834 (patch)
tree58bcd25939fd842f2d2ab057e27eab3107a48c31 /gcc/lto-cgraph.c
parent1af980453827d996e94e360fc137331a0dccb828 (diff)
downloadgcc-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.c115
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);