On December 14, 2019 10:11:33 AM GMT+01:00, Jakub Jelinek <ja...@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 <ja...@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