[PATCH] Fix ipa_fn_summary_write for offloading LTO streaming (PR ipa/92357)
Richard Biener
rguenther@suse.de
Sat Dec 14 11:15:00 GMT 2019
On December 14, 2019 10:11:33 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>As discussed on IRC and in the PR, we get an ICE during
>inline_read_section
>in the offloading lto1, because the size of streamed out and expected
>to be
>streamed in data doesn't match. This happens on the testcase from the
>PR
>where
> for (edge = cnode->callees; edge; edge = edge->next_callee)
> write_ipa_call_summary (ob, edge);
>writes summaries for 2 edges and
> for (e = node->callees; e; e = e->next_callee)
> read_ipa_call_summary (&ib, e, info != NULL);
>has NULL node->callees and doesn't thus stream in anything.
>That is because
> for (int i = 0; i < lto_symtab_encoder_size (encoder); i++)
> {
>node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder,
>i));
> if (node
> && ((node->thunk.thunk_p && !node->inlined_to)
> || lto_symtab_encoder_in_partition_p (encoder, node)))
> {
> output_outgoing_cgraph_edges (node->callees, ob, encoder);
> output_outgoing_cgraph_edges (node->indirect_calls, ob, encoder);
> }
> }
>didn't stream the callees out, as lto_symtab_encoder_in_partition_p
>(encoder, node)
>is false. All the other IPA writers that write function summaries only
>handle functions that pass this predicate, using the
>lsei_*_function_in_partition
>iterators, but ipa_fn_summary_write streams all.
>
>Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
>regtested on x86_64-linux with nvptx-none offloading, ok for trunk?
Ok.
Richard.
>Note, there is another issue unrelated to this that still needs fixing.
>
>2019-12-14 Jakub Jelinek <jakub@redhat.com>
>
> PR ipa/92357
> * ipa-fnsummary.c (ipa_fn_summary_write): Use
> lto_symtab_encoder_iterator with lsei_start_function_in_partition and
> lsei_next_function_in_partition instead of walking all cgraph nodes
> in encoder.
>
>--- gcc/ipa-fnsummary.c.jj 2019-12-05 14:02:20.559570378 +0100
>+++ gcc/ipa-fnsummary.c 2019-12-13 18:01:08.344828332 +0100
>@@ -4364,24 +4364,24 @@ static void
> ipa_fn_summary_write (void)
> {
>struct output_block *ob = create_output_block
>(LTO_section_ipa_fn_summary);
>+ lto_symtab_encoder_iterator lsei;
> lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
> unsigned int count = 0;
>- int i;
>
>- for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
>+ for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p
>(lsei);
>+ lsei_next_function_in_partition (&lsei))
> {
>- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
>- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
>- if (cnode && cnode->definition && !cnode->alias)
>+ cgraph_node *cnode = lsei_cgraph_node (lsei);
>+ if (cnode->definition && !cnode->alias)
> count++;
> }
> streamer_write_uhwi (ob, count);
>
>- for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
>+ for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p
>(lsei);
>+ lsei_next_function_in_partition (&lsei))
> {
>- symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
>- cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
>- if (cnode && cnode->definition && !cnode->alias)
>+ cgraph_node *cnode = lsei_cgraph_node (lsei);
>+ if (cnode->definition && !cnode->alias)
> {
> class ipa_fn_summary *info = ipa_fn_summaries->get (cnode);
> class ipa_size_summary *size_info = ipa_size_summaries->get (cnode);
>
> Jakub
More information about the Gcc-patches
mailing list