On June 29, 2014 9:53:03 PM CEST, Jan Hubicka <hubi...@ucw.cz> wrote:
>> In addition of pr61644 and pr61646, this commit breaks a lot of
>> fortran tests with -flto -O0.
>Hello,
>the problem here is that we have POINTER_TYPE that points to array of
>variable
>length (not sure why it happens only with -O0). The ICE is introduced
>by the
>fact that we stream the type inside of function body then and thus it
>never
>goes through the lto.c's type handling.
>
>This patch fixes the ICE by moving the fixup somewhat earlier (perhaps
>it is
>good idea in general). I do not believe resulting IL is correct: we do
>not
>compute canonical type of the pointer nor we link correctly the
>variants.
>
>Richard, we probably ought to try to make all of the canonical type
>fixup
>happen also for function local types which would involve moving it all
>from
>lto.c into generic code? :((
>
>I am testing the patch.  I think it is better to have fixup here, so OK
>if
>it passes?

Please revert the original patch instead which was not tested properly. I'll 
get back to this after I return from vacation.

Richard.

>Honza
>
>Index: lto-streamer-in.c
>===================================================================
>--- lto-streamer-in.c  (revision 212098)
>+++ lto-streamer-in.c  (working copy)
>@@ -1182,6 +1182,58 @@ lto_read_tree (struct lto_input_block *i
> }
> 
> 
>+/* Copy fields that are not streamed but copied from other nodes.  */
>+static void
>+lto_copy_fields_not_streamed (tree t)
>+{
>+  if (TYPE_P (t) && TYPE_MAIN_VARIANT (t) != t)
>+    {
>+      tree mv = TYPE_MAIN_VARIANT (t);
>+
>+      if (COMPLETE_TYPE_P (t))
>+      {
>+        TYPE_SIZE (t) = TYPE_SIZE (mv);
>+        TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (mv);
>+      }
>+      TYPE_ATTRIBUTES (t) = TYPE_ATTRIBUTES (mv);
>+
>+      if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPE_NON_COMMON))
>+      {
>+        if (TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>+          TYPE_VALUES (t) = TYPE_VALUES (mv);
>+        else if (TREE_CODE (t) == ARRAY_TYPE)
>+          TYPE_DOMAIN (t) = TYPE_DOMAIN (mv);
>+
>+          if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>+          TYPE_VFIELD (t) = TYPE_VFIELD (mv);
>+        else if ((TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>+                 || TREE_CODE (t) == INTEGER_TYPE
>+                 || TREE_CODE (t) == BOOLEAN_TYPE
>+                 || TREE_CODE (t) == REAL_TYPE
>+                 || TREE_CODE (t) == FIXED_POINT_TYPE)
>+          TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (mv);
>+
>+        if (TREE_CODE (t) == METHOD_TYPE)
>+          TYPE_METHOD_BASETYPE (t) = TYPE_METHOD_BASETYPE (mv);
>+        else if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>+          TYPE_METHODS (t) = TYPE_METHODS (mv);
>+        else if (TREE_CODE (t) == OFFSET_TYPE)
>+          TYPE_OFFSET_BASETYPE (t) = TYPE_OFFSET_BASETYPE (mv);
>+        else if (TREE_CODE (t) == ARRAY_TYPE)
>+          TYPE_ARRAY_MAX_SIZE (t) = TYPE_ARRAY_MAX_SIZE (mv);
>+        else if ((TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>+                 || TREE_CODE (t) == INTEGER_TYPE
>+                 || TREE_CODE (t) == BOOLEAN_TYPE
>+                 || TREE_CODE (t) == REAL_TYPE
>+                 || TREE_CODE (t) == FIXED_POINT_TYPE)
>+          TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (mv);
>+
>+        if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>+          TYPE_BINFO (t) = TYPE_BINFO (mv);
>+      }
>+    }
>+}
>+
> /* Populate the reader cache with trees materialized from the SCC
>    following in the IB, DATA_IN stream.  */
> 
>@@ -1194,6 +1246,7 @@ lto_input_scc (struct lto_input_block *i
>   unsigned size = streamer_read_uhwi (ib);
>   hashval_t scc_hash = streamer_read_uhwi (ib);
>   unsigned scc_entry_len = 1;
>+  unsigned from = data_in->reader_cache->nodes.length ();
> 
>   if (size == 1)
>     {
>@@ -1233,6 +1286,12 @@ lto_input_scc (struct lto_input_block *i
>       }
>     }
> 
>+  /* Copy fileds we do not stream before unification so we can compare
>them
>+     without being worried if they are already initialized.  */
>+  for (unsigned i = 0; i < size; ++i)
>+    lto_copy_fields_not_streamed
>+       (streamer_tree_cache_get_tree (data_in->reader_cache, from +
>i));
>+
>   *len = size;
>   *entry_len = scc_entry_len;
>   return scc_hash;
>Index: lto/lto.c
>===================================================================
>--- lto/lto.c  (revision 212114)
>+++ lto/lto.c  (working copy)
>@@ -1050,58 +1050,6 @@ lto_register_function_decl_in_symtab (st
>                        decl, get_resolution (data_in, ix));
> }
> 
>-/* Copy fields that are not streamed but copied from other nodes.  */
>-static void
>-lto_copy_fields_not_streamed (tree t)
>-{
>-  if (TYPE_P (t) && TYPE_MAIN_VARIANT (t) != t)
>-    {
>-      tree mv = TYPE_MAIN_VARIANT (t);
>-
>-      if (COMPLETE_TYPE_P (t))
>-      {
>-        TYPE_SIZE (t) = TYPE_SIZE (mv);
>-        TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (mv);
>-      }
>-      TYPE_ATTRIBUTES (t) = TYPE_ATTRIBUTES (mv);
>-
>-      if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPE_NON_COMMON))
>-      {
>-        if (TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>-          TYPE_VALUES (t) = TYPE_VALUES (mv);
>-        else if (TREE_CODE (t) == ARRAY_TYPE)
>-          TYPE_DOMAIN (t) = TYPE_DOMAIN (mv);
>-
>-          if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>-          TYPE_VFIELD (t) = TYPE_VFIELD (mv);
>-        else if ((TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>-                 || TREE_CODE (t) == INTEGER_TYPE
>-                 || TREE_CODE (t) == BOOLEAN_TYPE
>-                 || TREE_CODE (t) == REAL_TYPE
>-                 || TREE_CODE (t) == FIXED_POINT_TYPE)
>-          TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (mv);
>-
>-        if (TREE_CODE (t) == METHOD_TYPE)
>-          TYPE_METHOD_BASETYPE (t) = TYPE_METHOD_BASETYPE (mv);
>-        else if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>-          TYPE_METHODS (t) = TYPE_METHODS (mv);
>-        else if (TREE_CODE (t) == OFFSET_TYPE)
>-          TYPE_OFFSET_BASETYPE (t) = TYPE_OFFSET_BASETYPE (mv);
>-        else if (TREE_CODE (t) == ARRAY_TYPE)
>-          TYPE_ARRAY_MAX_SIZE (t) = TYPE_ARRAY_MAX_SIZE (mv);
>-        else if ((TREE_CODE (t) == ENUMERAL_TYPE && COMPLETE_TYPE_P (t))
>-                 || TREE_CODE (t) == INTEGER_TYPE
>-                 || TREE_CODE (t) == BOOLEAN_TYPE
>-                 || TREE_CODE (t) == REAL_TYPE
>-                 || TREE_CODE (t) == FIXED_POINT_TYPE)
>-          TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (mv);
>-
>-        if (RECORD_OR_UNION_TYPE_P (t) && COMPLETE_TYPE_P (t))
>-          TYPE_BINFO (t) = TYPE_BINFO (mv);
>-      }
>-    }
>-}
>-
> /* For the type T re-materialize it in the type variant list and
>    the pointer/reference-to chains.  */
> 
>@@ -1958,19 +1906,13 @@ lto_read_decls (struct lto_file_decl_dat
>                 || streamer_handle_as_builtin_p (first)))
>           continue;
> 
>-        /* Copy fileds we do not stream before unification so we can
>compare them
>-           without being worried if they are already initialized.  */
>-        for (unsigned i = 0; i < len; ++i)
>-          lto_copy_fields_not_streamed
>-             (streamer_tree_cache_get_tree (data_in->reader_cache, from +
>i));
>-
>         /* Try to unify the SCC with already existing ones.  */
>         if (!flag_ltrans
>             && unify_scc (data_in->reader_cache, from,
>                           len, scc_entry_len, scc_hash))
>           continue;
> 
>         /* Do remaining fixup tasks for prevailing nodes.  */
>         bool seen_type = false;
>         for (unsigned i = 0; i < len; ++i)
>           {


Reply via email to