As mentioned in PR91985, offloading compilation is broken at present
because of an issue with LTO streaming. With thanks to Joseph for
hints, here's a solution.

Unlike e.g. the _FloatN types, when decimal floating-point types are
enabled, common tree nodes are created for each float type size (e.g.
dfloat32_type_node) and also a pointer to each type is created
(e.g. dfloat32_ptr_type_node). tree-streamer.c:record_common_node emits
these like:

  <float:32>     (dfloat32_type_node)
  <float:64>     (dfloat64_type_node)
  <float:128>    (dfloat128_type_node)
  <float:32> *   (dfloat32_ptr_type_node)
  <float:32>
  <float:64> *   (dfloat64_ptr_type_node)
  <float:64>
  <float:128> *  (dfloat128_ptr_type_node)
  <float:128>

I.e., with explicit emission of a copy of the pointed-to type following
the pointer itself.

When DFP is disabled, we instead get:

  <<< error >>>
  <<< error >>>
  <<< error >>>
  <<< error >>>
  <<< error >>>
  <<< error >>>

So, the number of nodes emitted during LTO write-out in the host/read-in
in the offload compiler do not match.

This patch restores the number of nodes emitted by creating
dfloatN_ptr_type_node as generic pointers rather than treating them as
flat error_type_nodes. I don't think there's an easy way of creating an
"error_type_node *", nor do I know if that would really be preferable.

Tested with offloading to NVPTX & bootstrapped. OK to apply?

Thanks,

Julian

ChangeLog

        gcc/
        * tree.c (build_common_tree_nodes): Use pointer type for
        dfloat32_ptr_type_node, dfloat64_ptr_type_node and
        dfloat128_ptr_type_node when decimal floating point support
        is disabled.
commit 17119773a8a45af098364b4faafe68f2e868479a
Author: Julian Brown <jul...@codesourcery.com>
Date:   Wed Nov 27 18:41:56 2019 -0800

    Fix decimal floating-point LTO streaming for offloading compilation
    
            gcc/
            * tree.c (build_common_tree_nodes): Use pointer type for
            dfloat32_ptr_type_node, dfloat64_ptr_type_node and
            dfloat128_ptr_type_node when decimal floating point support is disabled.

diff --git a/gcc/tree.c b/gcc/tree.c
index 5ae250ee595..db3f225ea7f 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -10354,6 +10354,15 @@ build_common_tree_nodes (bool signed_char)
       layout_type (dfloat128_type_node);
       dfloat128_ptr_type_node = build_pointer_type (dfloat128_type_node);
     }
+  else
+    {
+      /* These must be pointers else tree-streamer.c:record_common_node will emit
+	 a different number of nodes depending on DFP availability, which breaks
+	 offloading compilation.  */
+      dfloat32_ptr_type_node = ptr_type_node;
+      dfloat64_ptr_type_node = ptr_type_node;
+      dfloat128_ptr_type_node = ptr_type_node;
+    }
 
   complex_integer_type_node = build_complex_type (integer_type_node, true);
   complex_float_type_node = build_complex_type (float_type_node, true);

Reply via email to