This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix inliner assert with free-lang-data
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 22 Aug 2017 13:09:45 +0200 (CEST)
- Subject: [PATCH] Fix inliner assert with free-lang-data
- Authentication-results: sourceware.org; auth=none
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 <rguenther@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));
}