gcc_assert (cfun == my_function);
memset(&fbi, 0, sizeof(fbi));
+ vec_free (info->conds);
info->conds = NULL;
+ vec_free (info->size_time_table);
info->size_time_table = NULL;
/* When optimizing and analyzing for IPA inliner, initialize loop optimizer
/* Write inline summary for edge E to OB. */
static void
-read_ipa_call_summary (struct lto_input_block *ib, struct cgraph_edge *e)
+read_ipa_call_summary (struct lto_input_block *ib, struct cgraph_edge *e,
+ bool prevails)
{
- struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
+ struct ipa_call_summary *es = prevails
+ ? ipa_call_summaries->get_create (e) : NULL;
predicate p;
int length, i;
- es->call_stmt_size = streamer_read_uhwi (ib);
- es->call_stmt_time = streamer_read_uhwi (ib);
- es->loop_depth = streamer_read_uhwi (ib);
+ int size = streamer_read_uhwi (ib);
+ int time = streamer_read_uhwi (ib);
+ int depth = streamer_read_uhwi (ib);
+
+ if (es)
+ {
+ es->call_stmt_size = size;
+ es->call_stmt_time = time;
+ es->loop_depth = depth;
+ }
bitpack_d bp = streamer_read_bitpack (ib);
- es->is_return_callee_uncaptured = bp_unpack_value (&bp, 1);
+ if (es)
+ es->is_return_callee_uncaptured = bp_unpack_value (&bp, 1);
+ else
+ bp_unpack_value (&bp, 1);
p.stream_in (ib);
- edge_set_predicate (e, &p);
+ if (es)
+ edge_set_predicate (e, &p);
length = streamer_read_uhwi (ib);
- if (length)
+ if (length && es && e->possibly_call_in_translation_unit_p ())
{
es->param.safe_grow_cleared (length);
for (i = 0; i < length; i++)
es->param[i].change_prob = streamer_read_uhwi (ib);
}
+ else
+ {
+ for (i = 0; i < length; i++)
+ streamer_read_uhwi (ib);
+ }
}
encoder = file_data->symtab_node_encoder;
node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
index));
- info = ipa_fn_summaries->get_create (node);
+ info = node->prevailing_p () ? ipa_fn_summaries->get_create (node) : NULL;
- info->estimated_stack_size
- = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
- info->size = info->self_size = streamer_read_uhwi (&ib);
- info->time = sreal::stream_in (&ib);
+ int stack_size = streamer_read_uhwi (&ib);
+ int size = streamer_read_uhwi (&ib);
+ sreal time = sreal::stream_in (&ib);
+
+ if (info)
+ {
+ info->estimated_stack_size
+ = info->estimated_self_stack_size = stack_size;
+ info->size = info->self_size = size;
+ info->time = time;
+ }
bp = streamer_read_bitpack (&ib);
- info->inlinable = bp_unpack_value (&bp, 1);
- info->fp_expressions = bp_unpack_value (&bp, 1);
+ if (info)
+ {
+ info->inlinable = bp_unpack_value (&bp, 1);
+ info->fp_expressions = bp_unpack_value (&bp, 1);
+ }
+ else
+ {
+ bp_unpack_value (&bp, 1);
+ bp_unpack_value (&bp, 1);
+ }
count2 = streamer_read_uhwi (&ib);
- gcc_assert (!info->conds);
+ gcc_assert (!info || !info->conds);
for (j = 0; j < count2; j++)
{
struct condition c;
c.by_ref = bp_unpack_value (&bp, 1);
if (c.agg_contents)
c.offset = streamer_read_uhwi (&ib);
- vec_safe_push (info->conds, c);
+ if (info)
+ vec_safe_push (info->conds, c);
}
count2 = streamer_read_uhwi (&ib);
- gcc_assert (!info->size_time_table);
+ gcc_assert (!info || !info->size_time_table);
for (j = 0; j < count2; j++)
{
struct size_time_entry e;
e.exec_predicate.stream_in (&ib);
e.nonconst_predicate.stream_in (&ib);
- vec_safe_push (info->size_time_table, e);
+ if (info)
+ vec_safe_push (info->size_time_table, e);
}
p.stream_in (&ib);
- set_hint_predicate (&info->loop_iterations, p);
+ if (info)
+ set_hint_predicate (&info->loop_iterations, p);
p.stream_in (&ib);
- set_hint_predicate (&info->loop_stride, p);
+ if (info)
+ set_hint_predicate (&info->loop_stride, p);
p.stream_in (&ib);
- set_hint_predicate (&info->array_index, p);
+ if (info)
+ set_hint_predicate (&info->array_index, p);
for (e = node->callees; e; e = e->next_callee)
- read_ipa_call_summary (&ib, e);
+ read_ipa_call_summary (&ib, e, info != NULL);
for (e = node->indirect_calls; e; e = e->next_callee)
- read_ipa_call_summary (&ib, e);
+ read_ipa_call_summary (&ib, e, info != NULL);
}
lto_free_section_data (file_data, LTO_section_ipa_fn_summary, NULL, data,