free-lang-data can end up unsharing TYPE_SIZE[_UNIT], the following patch
fixes that similar to how verify_type_variant behaves to not ICE during
inlining.

Refactoring free-lang-data a bit could avoid the false unsharing.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2017-08-22  Richard Biener  <rguent...@suse.de>

        * tree-inline.c (remap_type_1): Change asserts on TYPE_SIZE[_UNIT]
        to allow for free-lang-data replacements similar to verify_type_variant.

Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c   (revision 251265)
+++ gcc/tree-inline.c   (working copy)
@@ -554,9 +554,16 @@ remap_type_1 (tree type, copy_body_data
   /* All variants of type share the same size, so use the already remaped 
data.  */
   if (TYPE_MAIN_VARIANT (new_tree) != new_tree)
     {
-      gcc_checking_assert (TYPE_SIZE (type) == TYPE_SIZE (TYPE_MAIN_VARIANT 
(type)));
-      gcc_checking_assert (TYPE_SIZE_UNIT (type) == TYPE_SIZE_UNIT 
(TYPE_MAIN_VARIANT (type)));
-
+      tree s = TYPE_SIZE (type);
+      tree mvs = TYPE_SIZE (TYPE_MAIN_VARIANT (type));
+      tree su = TYPE_SIZE_UNIT (type);
+      tree mvsu = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type));
+      gcc_checking_assert ((TREE_CODE (s) == PLACEHOLDER_EXPR
+                           && (TREE_CODE (mvs) == PLACEHOLDER_EXPR))
+                          || s == mvs);
+      gcc_checking_assert ((TREE_CODE (su) == PLACEHOLDER_EXPR
+                           && (TREE_CODE (mvsu) == PLACEHOLDER_EXPR))
+                          || su == mvsu);
       TYPE_SIZE (new_tree) = TYPE_SIZE (TYPE_MAIN_VARIANT (new_tree));
       TYPE_SIZE_UNIT (new_tree) = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT 
(new_tree));
     }

Reply via email to