aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-08-13 04:37:51 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2012-08-13 02:37:51 +0000
commitf27c1867108c24557452bc6ea11196c7e7f09801 (patch)
tree45f40f7cd77f92dcd298eb5c790cad79a92c02be /gcc/lto-cgraph.c
parent56142d02b398b0a1b1d7ca1bcb3dbb291c597a30 (diff)
downloadgcc-f27c1867108c24557452bc6ea11196c7e7f09801.zip
gcc-f27c1867108c24557452bc6ea11196c7e7f09801.tar.gz
gcc-f27c1867108c24557452bc6ea11196c7e7f09801.tar.bz2
tree-pass.h (write_summary, [...]): Remove set and vset arguments.
* tree-pass.h (write_summary, write_optimization_summary): Remove set and vset arguments. * ipa-cp.c (ipcp_write_summary): Remove set and vset arugments. (write_node_summary_p): Likewise; use the encoder. (ipa_reference_write_optimization_summary): Likewise. * lto-cgraph.c (output_cgraph_opt_summary): Use encoder. (lto_symtab_encoder_new): Initialize in_partition field. (lto_symtab_encoder_delete): Destroy in_partition field. (LCC_NOT_FOUND): Move to lto-streamer.h (lto_symtab_encoder_deref): Likewise. (lto_symtab_encoder_in_partition_p, lto_set_symtab_encoder_in_partition): New functions. (referenced_from_other_partition_p): Rewrite to use encoder. (reachable_from_other_partition_p): Likewise. (referenced_from_this_partition_p): Likewise. (reachable_from_this_partition_p): Likewise. (lto_output_node): Likewise. (lto_output_varpool_node): Likewise. (output_refs): Likewise. (compute_ltrans_boundary): Initialize in_partition fileds of the encoder. (output_symtab): Likewise. (input_refs): Match the changes in output_refs. (output_cgraph_opt_summary_p): Remove set argument. (output_node_opt_summary): Replace set by encoder. (output_cgraph_opt_summary): Remove set argument; use the encoder. * ipa-pure-const.c (pure_const_write_summary): Remove set and vset arguments; use the encoder. * lto-streamer-out.c (lto_output): Remove set and vset argument; use the encoder. (produce_symtab): Likewise. * ipa-inline.h (inline_write_summary): Remove set and vset arguments. * ipa-inline-analysis.c (inline_write_summary): Likewise. * ipa-prop.c (ipa_prop_write_jump_functions): Remove set argument; use encoder. * ipa-prop.h (ipa_prop_write_jump_functions): Likewise. * passes.c (ipa_write_summaries_2): Remove set and vset arguments. (ipa_write_summaries_1): Update. (ipa_write_optimization_summaries_1): Likewise. (ipa_write_optimization_summaries): Likewise. * lto-streamer.h (lto_symtab_encoder_t): Add in_partition. (lto_symtab_encoder_iterator): New type. (lto_symtab_encoder_deref): Make inline. (output_symtab, referenced_from_other_partition_p, reachable_from_other_partition_p, referenced_from_this_partition_p, reachable_from_this_partition_p): Update. (lsei_end_p, lsei_next, lsei_node, lsei_cgraph_node, lsei_varpool_node): New inline functions. (LCC_NOT_FOUND): New macro. (lto_symtab_encoder_deref, lsei_start, lsei_next_in_partition, lsei_start_in_partition, lsei_next_function_in_partition, lsei_start_function_in_partition, lsei_next_variable_in_partition, lsei_start_variable_in_partition): New inline functions. * lto-partition.c (set_referenced_from_other_partition_p, set_reachable_from_other_partition_p, set_referenced_from_this_partition_p): New functions. (lto_promote_cross_file_statics): Use them. From-SVN: r190336
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r--gcc/lto-cgraph.c188
1 files changed, 69 insertions, 119 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index c77408f..c08d099 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -46,7 +46,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-streamer.h"
#include "gcov-io.h"
-static void output_cgraph_opt_summary (cgraph_node_set set);
+static void output_cgraph_opt_summary (void);
static void input_cgraph_opt_summary (VEC (symtab_node, heap) * nodes);
/* Number of LDPR values known to GCC. */
@@ -82,6 +82,7 @@ lto_symtab_encoder_new (void)
encoder->nodes = NULL;
encoder->body = pointer_set_create ();
encoder->initializer = pointer_set_create ();
+ encoder->in_partition = pointer_set_create ();
return encoder;
}
@@ -95,6 +96,7 @@ lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
pointer_map_destroy (encoder->map);
pointer_set_destroy (encoder->body);
pointer_set_destroy (encoder->initializer);
+ pointer_set_destroy (encoder->in_partition);
free (encoder);
}
@@ -124,7 +126,6 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
return ref;
}
-#define LCC_NOT_FOUND (-1)
/* Look up NODE in encoder. Return NODE's reference if it has been encoded
or LCC_NOT_FOUND if it is not there. */
@@ -138,18 +139,6 @@ lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
}
-/* Return the cgraph node corresponding to REF using ENCODER. */
-
-symtab_node
-lto_symtab_encoder_deref (lto_symtab_encoder_t encoder, int ref)
-{
- if (ref == LCC_NOT_FOUND)
- return NULL;
-
- return VEC_index (symtab_node, encoder->nodes, ref);
-}
-
-
/* Return TRUE if we should encode initializer of NODE (if any). */
bool
@@ -186,6 +175,25 @@ lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder,
pointer_set_insert (encoder->initializer, node);
}
+/* Return TRUE if we should encode initializer of NODE (if any). */
+
+bool
+lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
+ symtab_node node)
+{
+ return pointer_set_contains (encoder->in_partition, node);
+}
+
+/* Return TRUE if we should encode body of NODE (if any). */
+
+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);
+}
+
/* Output the cgraph EDGE to OB using ENCODER. */
static void
@@ -248,26 +256,15 @@ lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
/* Return if LIST contain references from other partitions. */
bool
-referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
- varpool_node_set vset)
+referenced_from_other_partition_p (struct ipa_ref_list *list, lto_symtab_encoder_t encoder)
{
int i;
struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (list, i, ref); i++)
{
- if (symtab_function_p (ref->referring))
- {
- if (ipa_ref_referring_node (ref)->symbol.in_other_partition
- || !cgraph_node_in_set_p (ipa_ref_referring_node (ref), set))
- return true;
- }
- else
- {
- if (ipa_ref_referring_varpool_node (ref)->symbol.in_other_partition
- || !varpool_node_in_set_p (ipa_ref_referring_varpool_node (ref),
- vset))
- return true;
- }
+ if (ref->referring->symbol.in_other_partition
+ || !lto_symtab_encoder_in_partition_p (encoder, ref->referring))
+ return true;
}
return false;
}
@@ -275,7 +272,7 @@ referenced_from_other_partition_p (struct ipa_ref_list *list, cgraph_node_set se
/* Return true when node is reachable from other partition. */
bool
-reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
+reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
{
struct cgraph_edge *e;
if (!node->analyzed)
@@ -284,7 +281,7 @@ reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
return false;
for (e = node->callers; e; e = e->next_caller)
if (e->caller->symbol.in_other_partition
- || !cgraph_node_in_set_p (e->caller, set))
+ || !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)e->caller))
return true;
return false;
}
@@ -292,36 +289,25 @@ reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
/* Return if LIST contain references from other partitions. */
bool
-referenced_from_this_partition_p (struct ipa_ref_list *list, cgraph_node_set set,
- varpool_node_set vset)
+referenced_from_this_partition_p (struct ipa_ref_list *list,
+ lto_symtab_encoder_t encoder)
{
int i;
struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (list, i, ref); i++)
- {
- if (symtab_function_p (ref->referring))
- {
- if (cgraph_node_in_set_p (ipa_ref_referring_node (ref), set))
- return true;
- }
- else
- {
- if (varpool_node_in_set_p (ipa_ref_referring_varpool_node (ref),
- vset))
- return true;
- }
- }
+ if (lto_symtab_encoder_in_partition_p (encoder, ref->referring))
+ return true;
return false;
}
/* Return true when node is reachable from other partition. */
bool
-reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
+reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
{
struct cgraph_edge *e;
for (e = node->callers; e; e = e->next_caller)
- if (cgraph_node_in_set_p (e->caller, set))
+ if (lto_symtab_encoder_in_partition_p (encoder, (symtab_node)e->caller))
return true;
return false;
}
@@ -336,8 +322,7 @@ reachable_from_this_partition_p (struct cgraph_node *node, cgraph_node_set set)
static void
lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
- lto_symtab_encoder_t encoder, cgraph_node_set set,
- varpool_node_set vset)
+ lto_symtab_encoder_t encoder)
{
unsigned int tag;
struct bitpack_d bp;
@@ -346,7 +331,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
bool in_other_partition = false;
struct cgraph_node *clone_of;
- boundary_p = !cgraph_node_in_set_p (node, set);
+ boundary_p = !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)node);
if (node->analyzed && !boundary_p)
tag = LTO_symtab_analyzed_node;
@@ -436,9 +421,9 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
bp_pack_value (&bp, tag == LTO_symtab_analyzed_node
&& !DECL_EXTERNAL (node->symbol.decl)
&& !DECL_COMDAT (node->symbol.decl)
- && (reachable_from_other_partition_p (node, set)
+ && (reachable_from_other_partition_p (node, encoder)
|| referenced_from_other_partition_p (&node->symbol.ref_list,
- set, vset)), 1);
+ encoder)), 1);
bp_pack_value (&bp, node->lowered, 1);
bp_pack_value (&bp, in_other_partition, 1);
/* Real aliases in a boundary become non-aliases. However we still stream
@@ -482,10 +467,10 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
static void
lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node,
- lto_symtab_encoder_t encoder,
- cgraph_node_set set, varpool_node_set vset)
+ lto_symtab_encoder_t encoder)
{
- bool boundary_p = !varpool_node_in_set_p (node, vset) && node->analyzed;
+ bool boundary_p = (node->analyzed
+ && !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)node));
struct bitpack_d bp;
int ref;
@@ -514,7 +499,7 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node
{
bp_pack_value (&bp, node->analyzed
&& referenced_from_other_partition_p (&node->symbol.ref_list,
- set, vset), 1);
+ encoder), 1);
bp_pack_value (&bp, boundary_p && !DECL_EXTERNAL (node->symbol.decl), 1);
/* in_other_partition. */
}
@@ -624,11 +609,9 @@ output_outgoing_cgraph_edges (struct cgraph_edge *edge,
/* Output the part of the cgraph in SET. */
static void
-output_refs (cgraph_node_set set, varpool_node_set vset,
- lto_symtab_encoder_t encoder)
+output_refs (lto_symtab_encoder_t encoder)
{
- cgraph_node_set_iterator csi;
- varpool_node_set_iterator vsi;
+ lto_symtab_encoder_iterator lsei;
struct lto_simple_output_block *ob;
int count;
struct ipa_ref *ref;
@@ -636,36 +619,17 @@ output_refs (cgraph_node_set set, varpool_node_set vset,
ob = lto_create_simple_output_block (LTO_section_refs);
- for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
- {
- struct cgraph_node *node = csi_node (csi);
-
- count = ipa_ref_list_nreferences (&node->symbol.ref_list);
- if (count)
- {
- streamer_write_uhwi_stream (ob->main_stream, count);
- streamer_write_uhwi_stream (ob->main_stream,
- lto_symtab_encoder_lookup (encoder,
- (symtab_node)node));
- for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list,
- i, ref); i++)
- lto_output_ref (ob, ref, encoder);
- }
- }
-
- streamer_write_uhwi_stream (ob->main_stream, 0);
-
- for (vsi = vsi_start (vset); !vsi_end_p (vsi); vsi_next (&vsi))
+ for (lsei = lsei_start_in_partition (encoder); !lsei_end_p (lsei);
+ lsei_next_in_partition (&lsei))
{
- struct varpool_node *node = vsi_node (vsi);
+ symtab_node node = lsei_node (lsei);
count = ipa_ref_list_nreferences (&node->symbol.ref_list);
if (count)
{
streamer_write_uhwi_stream (ob->main_stream, count);
streamer_write_uhwi_stream (ob->main_stream,
- lto_symtab_encoder_lookup (encoder,
- (symtab_node)node));
+ lto_symtab_encoder_lookup (encoder, node));
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list,
i, ref); i++)
lto_output_ref (ob, ref, encoder);
@@ -697,13 +661,14 @@ compute_ltrans_boundary (struct lto_out_decl_state *state,
{
node = csi_node (csi);
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))
{
struct varpool_node *vnode = vsi_node (vsi);
gcc_assert (!vnode->alias || vnode->alias_of);
- lto_symtab_encoder_encode (encoder, (symtab_node)vnode);
+ lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode);
lto_set_symtab_encoder_encode_initializer (encoder, vnode);
add_references (encoder, &vnode->symbol.ref_list);
}
@@ -750,17 +715,17 @@ compute_ltrans_boundary (struct lto_out_decl_state *state,
/* Output the part of the symtab in SET and VSET. */
void
-output_symtab (cgraph_node_set set, varpool_node_set vset)
+output_symtab (void)
{
struct cgraph_node *node;
struct lto_simple_output_block *ob;
- cgraph_node_set_iterator csi;
+ lto_symtab_encoder_iterator lsei;
int i, n_nodes;
lto_symtab_encoder_t encoder;
static bool asm_nodes_output = false;
if (flag_wpa)
- output_cgraph_opt_summary (set);
+ output_cgraph_opt_summary ();
ob = lto_create_simple_output_block (LTO_section_symtab_nodes);
@@ -779,17 +744,17 @@ output_symtab (cgraph_node_set set, varpool_node_set vset)
{
symtab_node node = lto_symtab_encoder_deref (encoder, i);
if (symtab_function_p (node))
- lto_output_node (ob, cgraph (node), encoder, set, vset);
+ lto_output_node (ob, cgraph (node), encoder);
else
- lto_output_varpool_node (ob, varpool (node), encoder,
- set, vset);
+ lto_output_varpool_node (ob, varpool (node), encoder);
}
/* Go over the nodes in SET again to write edges. */
- 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);
output_outgoing_cgraph_edges (node->callees, ob, encoder);
output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
}
@@ -808,7 +773,7 @@ output_symtab (cgraph_node_set set, varpool_node_set vset)
lto_output_toplevel_asms ();
}
- output_refs (set, vset, encoder);
+ output_refs (encoder);
}
/* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS,
@@ -1170,29 +1135,15 @@ input_refs (struct lto_input_block *ib,
int idx;
while (true)
{
- struct cgraph_node *node;
+ symtab_node node;
count = streamer_read_uhwi (ib);
if (!count)
break;
idx = streamer_read_uhwi (ib);
- node = cgraph (VEC_index (symtab_node, nodes, idx));
- while (count)
- {
- input_ref (ib, (symtab_node) node, nodes);
- count--;
- }
- }
- while (true)
- {
- struct varpool_node *node;
- count = streamer_read_uhwi (ib);
- if (!count)
- break;
- node = varpool (VEC_index (symtab_node, nodes,
- streamer_read_uhwi (ib)));
+ node = VEC_index (symtab_node, nodes, idx);
while (count)
{
- input_ref (ib, (symtab_node) node, nodes);
+ input_ref (ib, node, nodes);
count--;
}
}
@@ -1362,8 +1313,7 @@ input_symtab (void)
/* True when we need optimization summary for NODE. */
static int
-output_cgraph_opt_summary_p (struct cgraph_node *node,
- cgraph_node_set set ATTRIBUTE_UNUSED)
+output_cgraph_opt_summary_p (struct cgraph_node *node)
{
return (node->clone_of
&& (node->clone.tree_map
@@ -1383,7 +1333,7 @@ output_edge_opt_summary (struct output_block *ob ATTRIBUTE_UNUSED,
static void
output_node_opt_summary (struct output_block *ob,
struct cgraph_node *node,
- cgraph_node_set set)
+ lto_symtab_encoder_t encoder)
{
unsigned int index;
bitmap_iterator bi;
@@ -1430,7 +1380,7 @@ output_node_opt_summary (struct output_block *ob,
streamer_write_bitpack (&bp);
}
- if (cgraph_node_in_set_p (node, set))
+ if (lto_symtab_encoder_in_partition_p (encoder, (symtab_node) node))
{
for (e = node->callees; e; e = e->next_callee)
output_edge_opt_summary (ob, e);
@@ -1443,7 +1393,7 @@ output_node_opt_summary (struct output_block *ob,
At the moment it is the clone info structure. */
static void
-output_cgraph_opt_summary (cgraph_node_set set)
+output_cgraph_opt_summary (void)
{
symtab_node node;
int i, n_nodes;
@@ -1456,17 +1406,17 @@ output_cgraph_opt_summary (cgraph_node_set set)
n_nodes = lto_symtab_encoder_size (encoder);
for (i = 0; i < n_nodes; i++)
if (symtab_function_p (node = lto_symtab_encoder_deref (encoder, i))
- && output_cgraph_opt_summary_p (cgraph (node), set))
+ && output_cgraph_opt_summary_p (cgraph (node)))
count++;
streamer_write_uhwi (ob, count);
for (i = 0; i < n_nodes; i++)
{
node = lto_symtab_encoder_deref (encoder, i);
if (symtab_function_p (node)
- && output_cgraph_opt_summary_p (cgraph (node), set))
+ && output_cgraph_opt_summary_p (cgraph (node)))
{
streamer_write_uhwi (ob, i);
- output_node_opt_summary (ob, cgraph (node), set);
+ output_node_opt_summary (ob, cgraph (node), encoder);
}
}
produce_asm (ob, NULL);