[PATCH] Fix ipa_fn_summary_write for offloading LTO streaming (PR ipa/92357)

Jakub Jelinek jakub@redhat.com
Sat Dec 14 10:43:00 GMT 2019


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?

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