Hi, this patch disables the streaming of alias 0 flag and adds a comment why.
Bootstrapped/regtested x86_64-linux, OK? Honza * lto-streamer-out.c (hash_tree): Do not stream TYPE_ALIAS_SET. * tree-streamer-out.c (pack_ts_type_common_value_fields): Do not stream TYPE_ALIAS_SET. * tree-streamer-in.c (unpack_ts_type_common_value_fields): Do not stream TYPE_ALIAS_SET. * lto.c (compare_tree_sccs_1): Do not compare TYPE_ALIAS_SET. Index: lto-streamer-out.c =================================================================== --- lto-streamer-out.c (revision 231081) +++ lto-streamer-out.c (working copy) @@ -1109,10 +1109,6 @@ hash_tree (struct streamer_tree_cache_d hstate.commit_flag (); hstate.add_int (TYPE_PRECISION (t)); hstate.add_int (TYPE_ALIGN (t)); - hstate.add_int ((TYPE_ALIAS_SET (t) == 0 - || (!in_lto_p - && get_alias_set (t) == 0)) - ? 0 : -1); } if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL)) Index: lto/lto.c =================================================================== --- lto/lto.c (revision 231081) +++ lto/lto.c (working copy) @@ -1166,7 +1166,9 @@ compare_tree_sccs_1 (tree t1, tree t2, t compare_values (TYPE_READONLY); compare_values (TYPE_PRECISION); compare_values (TYPE_ALIGN); - compare_values (TYPE_ALIAS_SET); + /* Do not compare TYPE_ALIAS_SET. Doing so introduce ordering issues + with calls to get_alias_set which may initialize it for streamed + in types. */ } /* We don't want to compare locations, so there is nothing do compare Index: tree-streamer-out.c =================================================================== --- tree-streamer-out.c (revision 231081) +++ tree-streamer-out.c (working copy) @@ -317,13 +317,9 @@ pack_ts_type_common_value_fields (struct bp_pack_value (bp, TYPE_RESTRICT (expr), 1); bp_pack_value (bp, TYPE_USER_ALIGN (expr), 1); bp_pack_value (bp, TYPE_READONLY (expr), 1); - /* Make sure to preserve the fact whether the frontend would assign - alias-set zero to this type. Do that only for main variants, because - type variants alias sets are never computed. - FIXME: This does not work for pre-streamed builtin types. */ - bp_pack_value (bp, (TYPE_ALIAS_SET (expr) == 0 - || (!in_lto_p && TYPE_MAIN_VARIANT (expr) == expr - && get_alias_set (expr) == 0)), 1); + /* We used to stream TYPE_ALIAS_SET == 0 information to let frontends mark + types that are opaque for TBAA. This however did not work as intended, + becuase TYPE_ALIAS_SET == 0 was regularly lost in canonical type merging. */ if (RECORD_OR_UNION_TYPE_P (expr)) { bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1); Index: tree-streamer-in.c =================================================================== --- tree-streamer-in.c (revision 231081) +++ tree-streamer-in.c (working copy) @@ -366,7 +366,6 @@ unpack_ts_type_common_value_fields (stru TYPE_RESTRICT (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_READONLY (expr) = (unsigned) bp_unpack_value (bp, 1); - TYPE_ALIAS_SET (expr) = bp_unpack_value (bp, 1) ? 0 : -1; if (RECORD_OR_UNION_TYPE_P (expr)) { TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1);