aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-cgraph.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/lto-cgraph.c')
-rw-r--r--gcc/lto-cgraph.c121
1 files changed, 75 insertions, 46 deletions
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index bc0f010..147975b 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -1804,8 +1804,7 @@ output_cgraph_opt_summary_p (struct cgraph_node *node)
{
return ((node->clone_of || node->former_clone_of)
&& (node->clone.tree_map
- || node->clone.args_to_skip
- || node->clone.combined_args_to_skip));
+ || node->clone.param_adjustments));
}
/* Output optimization summary for EDGE to OB. */
@@ -1822,42 +1821,53 @@ output_node_opt_summary (struct output_block *ob,
struct cgraph_node *node,
lto_symtab_encoder_t encoder)
{
- unsigned int index;
- bitmap_iterator bi;
struct ipa_replace_map *map;
- struct bitpack_d bp;
int i;
struct cgraph_edge *e;
- if (node->clone.args_to_skip)
- {
- streamer_write_uhwi (ob, bitmap_count_bits (node->clone.args_to_skip));
- EXECUTE_IF_SET_IN_BITMAP (node->clone.args_to_skip, 0, index, bi)
- streamer_write_uhwi (ob, index);
- }
- else
- streamer_write_uhwi (ob, 0);
- if (node->clone.combined_args_to_skip)
+ /* TODO: Should this code be moved to ipa-param-manipulation? */
+ struct bitpack_d bp;
+ bp = bitpack_create (ob->main_stream);
+ bp_pack_value (&bp, (node->clone.param_adjustments != NULL), 1);
+ streamer_write_bitpack (&bp);
+ if (ipa_param_adjustments *adjustments = node->clone.param_adjustments)
{
- streamer_write_uhwi (ob, bitmap_count_bits (node->clone.combined_args_to_skip));
- EXECUTE_IF_SET_IN_BITMAP (node->clone.combined_args_to_skip, 0, index, bi)
- streamer_write_uhwi (ob, index);
+ streamer_write_uhwi (ob, vec_safe_length (adjustments->m_adj_params));
+ ipa_adjusted_param *adj;
+ FOR_EACH_VEC_SAFE_ELT (adjustments->m_adj_params, i, adj)
+ {
+ bp = bitpack_create (ob->main_stream);
+ bp_pack_value (&bp, adj->base_index, IPA_PARAM_MAX_INDEX_BITS);
+ bp_pack_value (&bp, adj->prev_clone_index, IPA_PARAM_MAX_INDEX_BITS);
+ bp_pack_value (&bp, adj->op, 2);
+ bp_pack_value (&bp, adj->param_prefix_index, 2);
+ bp_pack_value (&bp, adj->prev_clone_adjustment, 1);
+ bp_pack_value (&bp, adj->reverse, 1);
+ bp_pack_value (&bp, adj->user_flag, 1);
+ streamer_write_bitpack (&bp);
+ if (adj->op == IPA_PARAM_OP_SPLIT
+ || adj->op == IPA_PARAM_OP_NEW)
+ {
+ stream_write_tree (ob, adj->type, true);
+ if (adj->op == IPA_PARAM_OP_SPLIT)
+ {
+ stream_write_tree (ob, adj->alias_ptr_type, true);
+ streamer_write_uhwi (ob, adj->unit_offset);
+ }
+ }
+ }
+ streamer_write_hwi (ob, adjustments->m_always_copy_start);
+ bp = bitpack_create (ob->main_stream);
+ bp_pack_value (&bp, node->clone.param_adjustments->m_skip_return, 1);
+ streamer_write_bitpack (&bp);
}
- else
- streamer_write_uhwi (ob, 0);
+
streamer_write_uhwi (ob, vec_safe_length (node->clone.tree_map));
FOR_EACH_VEC_SAFE_ELT (node->clone.tree_map, i, map)
{
- /* At the moment we assume all old trees to be PARM_DECLs, because we have no
- mechanism to store function local declarations into summaries. */
- gcc_assert (!map->old_tree);
streamer_write_uhwi (ob, map->parm_num);
gcc_assert (EXPR_LOCATION (map->new_tree) == UNKNOWN_LOCATION);
stream_write_tree (ob, map->new_tree, true);
- bp = bitpack_create (ob->main_stream);
- bp_pack_value (&bp, map->replace_p, 1);
- bp_pack_value (&bp, map->ref_p, 1);
- streamer_write_bitpack (&bp);
}
if (lto_symtab_encoder_in_partition_p (encoder, node))
@@ -1922,26 +1932,49 @@ input_node_opt_summary (struct cgraph_node *node,
{
int i;
int count;
- int bit;
- struct bitpack_d bp;
struct cgraph_edge *e;
- count = streamer_read_uhwi (ib_main);
- if (count)
- node->clone.args_to_skip = BITMAP_GGC_ALLOC ();
- for (i = 0; i < count; i++)
- {
- bit = streamer_read_uhwi (ib_main);
- bitmap_set_bit (node->clone.args_to_skip, bit);
- }
- count = streamer_read_uhwi (ib_main);
- if (count)
- node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
- for (i = 0; i < count; i++)
+ /* TODO: Should this code be moved to ipa-param-manipulation? */
+ struct bitpack_d bp;
+ bp = streamer_read_bitpack (ib_main);
+ bool have_adjustments = bp_unpack_value (&bp, 1);
+ if (have_adjustments)
{
- bit = streamer_read_uhwi (ib_main);
- bitmap_set_bit (node->clone.combined_args_to_skip, bit);
+ count = streamer_read_uhwi (ib_main);
+ vec<ipa_adjusted_param, va_gc> *new_params = NULL;
+ for (i = 0; i < count; i++)
+ {
+ ipa_adjusted_param adj;
+ memset (&adj, 0, sizeof (adj));
+ bp = streamer_read_bitpack (ib_main);
+ adj.base_index = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS);
+ adj.prev_clone_index
+ = bp_unpack_value (&bp, IPA_PARAM_MAX_INDEX_BITS);
+ adj.op = (enum ipa_parm_op) bp_unpack_value (&bp, 2);
+ adj.param_prefix_index = bp_unpack_value (&bp, 2);
+ adj.prev_clone_adjustment = bp_unpack_value (&bp, 1);
+ adj.reverse = bp_unpack_value (&bp, 1);
+ adj.user_flag = bp_unpack_value (&bp, 1);
+ if (adj.op == IPA_PARAM_OP_SPLIT
+ || adj.op == IPA_PARAM_OP_NEW)
+ {
+ adj.type = stream_read_tree (ib_main, data_in);
+ if (adj.op == IPA_PARAM_OP_SPLIT)
+ {
+ adj.alias_ptr_type = stream_read_tree (ib_main, data_in);
+ adj.unit_offset = streamer_read_uhwi (ib_main);
+ }
+ }
+ vec_safe_push (new_params, adj);
+ }
+ int always_copy_start = streamer_read_hwi (ib_main);
+ bp = streamer_read_bitpack (ib_main);
+ bool skip_return = bp_unpack_value (&bp, 1);
+ node->clone.param_adjustments
+ = (new (ggc_alloc <ipa_param_adjustments> ())
+ ipa_param_adjustments (new_params, always_copy_start, skip_return));
}
+
count = streamer_read_uhwi (ib_main);
for (i = 0; i < count; i++)
{
@@ -1949,11 +1982,7 @@ input_node_opt_summary (struct cgraph_node *node,
vec_safe_push (node->clone.tree_map, map);
map->parm_num = streamer_read_uhwi (ib_main);
- map->old_tree = NULL;
map->new_tree = stream_read_tree (ib_main, data_in);
- bp = streamer_read_bitpack (ib_main);
- map->replace_p = bp_unpack_value (&bp, 1);
- map->ref_p = bp_unpack_value (&bp, 1);
}
for (e = node->callees; e; e = e->next_callee)
input_edge_opt_summary (e, ib_main);