> > I think you are doing too many things in one patch. I'm fine with > dropping the zero-alias-set streaming (but I'd rather not assert > as FE get_alias_set langhook may assign zero to random tree nodes).
Ok, the assert was there mostly to double check that all zero alias sets rematerialize correctly in LTO which I tested so it can go. > > I'm also fine with handling flag_strict_aliasing conservatively > during inlining - but the condition you placed on this handling > needs a comment. I couldn't decipher it ;) OK, there is symmetric condition in ipa-inline-analysis, will comment on it. It indeed can go in separately. > > > + if (dump_file) > > + fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n", > > + to->name (), to->order); > > So I wonder if it makes sense to pessimize such inlining as well. I don't know - even for Firefox that heavily mix -fstrict-aliasing and -fno-strict-aliasing units this seems quite rare occasion and it is hard to judge when dopping the flag_strict_aliasing. > > The two above should be enough to fix the correctness issue. We also need to prevent ipa-icf and fold_const from optimizing functions early in a way that is not compatible with inlining -fno-strict-aliasing comdat to -fstrict-aliasing function. Honza > > The parse_optimize_options hack looks indeed interesting, but we solved > the issue differently by > > 2014-11-27 Richard Biener <rguent...@suse.de> > > PR middle-end/63704 > * alias.c (mems_in_disjoint_alias_sets_p): Remove assert > and instead return false when !fstrict-aliasing. > > So the hack can be removed as a separate commit after the first one > above. This should make optimize("fno-strict-aliasing") work. > > > I don't really see why we need all the other changes and IMHO the > get_alias_set interface change is ugly and fragile. And this doesn't > look like sth for stage3. > > Thus please split the patch up. > > Thanks, > Richard. > > > Honza > > > > * tree.c (free_lang_data): Pass true to get_alias_set. > > * tree-streamer-in.c (unpack_ts_type_common_value_fields): Do not stream > > alias set. > > * tree-ssa-alias.c (ao_ref_base_alias_set, ao_ref_alias_set): Pass true > > to get_alias_set; comment. > > (same_type_for_tbaa): Likewise. > > * alias.c (alias_set_subset_of, alias_sets_conflict_p): When strict > > aliasing is disabled, return true. > > (get_alias_set): New parameter strict. > > (new_alias_set): Always produce new alias set. > > (record_component_aliases): Pass true to get_alias_set. > > * alias.h (get_alias_set): New optional parameter STRICT. > > * lto-streamer-out.c (hash_tree): Do not hash alias set. > > * ipa-inline-transform.c (inline_call): Drop strict aliasing of > > caller if needed. > > * ipa-icf-gimple.c (func_checker::compatible_types_p): Pass true > > to get_alias_set. > > * tree-streamer-out.c (pack_ts_type_common_value_fields): Do not > > stream TYPE_ALIAS_SET; sanity check that alias set 0 at LTO time will > > match what frontneds does. > > * fold-const.c (operand_equal_p): Be cureful about TBAA info before > > inlining even with -fno-strict-aliasing. > > * gimple.c (gimple_get_alias_set): Pass true to get_alias_set. > > > > * misc.c (gnat_get_alias_set): Pass true to get_alias_set. > > * utils.c (relate_alias_sets): Likewise. > > * trans.c (validate_unchecked_conversion): Likewise. > > > > * lto-symtab.c (warn_type_compatibility_p): Pass true to get_alias_set. > > * lto.c (compare_tree_sccs_1): Do not ocmpare TYPE_ALIAS_SET. > > > > * gcc.c-torture/execute/alias-1.c: New testcase. > > * gcc.dg/lto/alias-1_0.c: New testcase. > > * gcc.dg/lto/alias-1_1.c: New testcase. > > > > * c-common.c (parse_optimize_options): Remove hack about > > flag_strict_aliasing. > > (convert_vector_to_pointer_for_subscript): Pass true to get_alias_set. > > > > * cp-objcp-common.c (cxx_get_alias_set): Pass true to get_alias_set. > > > > * rtti.c (typeid_ok_p): Pass true to get_alias_set. > > Index: tree.c > > =================================================================== > > --- tree.c (revision 231020) > > +++ tree.c (working copy) > > @@ -5971,7 +5971,8 @@ free_lang_data (void) > > while the slots are still in the way the frontends generated them. */ > > for (i = 0; i < itk_none; ++i) > > if (integer_types[i]) > > - TYPE_ALIAS_SET (integer_types[i]) = get_alias_set (integer_types[i]); > > + TYPE_ALIAS_SET (integer_types[i]) = get_alias_set (integer_types[i], > > + true); > > > > /* Traverse the IL resetting language specific information for > > operands, expressions, etc. */ > > Index: cp/rtti.c > > =================================================================== > > --- cp/rtti.c (revision 231020) > > +++ cp/rtti.c (working copy) > > @@ -300,10 +300,10 @@ typeid_ok_p (void) > > /* Make sure abi::__type_info_pseudo has the same alias set > > as std::type_info. */ > > if (! TYPE_ALIAS_SET_KNOWN_P (pseudo_type_info)) > > - TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type); > > + TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type, > > true); > > else > > gcc_assert (TYPE_ALIAS_SET (pseudo_type_info) > > - == get_alias_set (type_info_type)); > > + == get_alias_set (type_info_type, true)); > > > > return true; > > } > > Index: cp/cp-objcp-common.c > > =================================================================== > > --- cp/cp-objcp-common.c (revision 231020) > > +++ cp/cp-objcp-common.c (working copy) > > @@ -32,7 +32,7 @@ cxx_get_alias_set (tree t) > > if (IS_FAKE_BASE_TYPE (t)) > > /* The base variant of a type must be in the same alias set as the > > complete type. */ > > - return get_alias_set (TYPE_CONTEXT (t)); > > + return get_alias_set (TYPE_CONTEXT (t), true); > > > > /* Punt on PMFs until we canonicalize functions properly. */ > > if (TYPE_PTRMEMFUNC_P (t) > > Index: tree-streamer-in.c > > =================================================================== > > --- tree-streamer-in.c (revision 231020) > > +++ 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); > > Index: tree-ssa-alias.c > > =================================================================== > > --- tree-ssa-alias.c (revision 231020) > > +++ tree-ssa-alias.c (working copy) > > @@ -563,7 +563,10 @@ ao_ref_base_alias_set (ao_ref *ref) > > base_ref = ref->ref; > > while (handled_component_p (base_ref)) > > base_ref = TREE_OPERAND (base_ref, 0); > > - ref->base_alias_set = get_alias_set (base_ref); > > + /* Do not return 0 in case of strict aliasing; this function is used at > > + IPA level by ipa-icf-gimple.c. It is job of caller to give up on > > + using TBAA oracle when asked to not do so. */ > > + ref->base_alias_set = get_alias_set (base_ref, true); > > return ref->base_alias_set; > > } > > > > @@ -574,7 +577,10 @@ ao_ref_alias_set (ao_ref *ref) > > { > > if (ref->ref_alias_set != -1) > > return ref->ref_alias_set; > > - ref->ref_alias_set = get_alias_set (ref->ref); > > + /* Do not return 0 in case of strict aliasing; this function is used at > > + IPA level by ipa-icf-gimple.c. It is job of caller to give up on > > + using TBAA oracle when asked to not do so. */ > > + ref->ref_alias_set = get_alias_set (ref->ref, true); > > return ref->ref_alias_set; > > } > > > > @@ -668,7 +674,7 @@ same_type_for_tbaa (tree type1, tree typ > > would mean that conversions between them are useless, whereas they are > > not (e.g. type and subtypes can have different modes). So, in the > > end, > > they are only guaranteed to have the same alias set. */ > > - if (get_alias_set (type1) == get_alias_set (type2)) > > + if (get_alias_set (type1, true) == get_alias_set (type2, true)) > > return -1; > > > > /* The types are known to be not equal. */ > > Index: alias.c > > =================================================================== > > --- alias.c (revision 231020) > > +++ alias.c (working copy) > > @@ -406,7 +406,7 @@ alias_set_subset_of (alias_set_type set1 > > alias_set_entry *ase2; > > > > /* Everything is a subset of the "aliases everything" set. */ > > - if (set2 == 0) > > + if (set2 == 0 || !flag_strict_aliasing) > > return true; > > > > /* Check if set1 is a subset of set2. */ > > @@ -467,7 +467,7 @@ alias_sets_conflict_p (alias_set_type se > > alias_set_entry *ase2; > > > > /* The easy case. */ > > - if (alias_sets_must_conflict_p (set1, set2)) > > + if (!flag_strict_aliasing || alias_sets_must_conflict_p (set1, set2)) > > return 1; > > > > /* See if the first alias set is a subset of the second. */ > > @@ -809,17 +809,21 @@ init_alias_set_entry (alias_set_type set > > } > > > > /* Return the alias set for T, which may be either a type or an > > - expression. Call language-specific routine for help, if needed. */ > > + expression. Call language-specific routine for help, if needed. > > + If STRICT is true, ignore value of flag_strict_aliasing. This is needed > > + in cases we are in -fno-strict-aliasing region but still need to compute > > + alias sets for some reason (this is used, for example, by rtti code to > > copy > > + alias set from type to type). */ > > > > alias_set_type > > -get_alias_set (tree t) > > +get_alias_set (tree t, bool strict) > > { > > alias_set_type set; > > > > /* If we're not doing any alias analysis, just assume everything > > aliases everything else. Also return 0 if this or its type is > > an error. */ > > - if (! flag_strict_aliasing || t == error_mark_node > > + if ((! flag_strict_aliasing && !strict)|| t == error_mark_node > > || (! TYPE_P (t) > > && (TREE_TYPE (t) == 0 || TREE_TYPE (t) == error_mark_node))) > > return 0; > > @@ -898,7 +902,7 @@ get_alias_set (tree t) > > /* For arrays with unknown size the conservative answer is the > > alias set of the element type. */ > > if (TREE_CODE (t) == ARRAY_TYPE) > > - return get_alias_set (TREE_TYPE (t)); > > + return get_alias_set (TREE_TYPE (t), true); > > > > /* But return zero as a conservative answer for incomplete types. */ > > return 0; > > @@ -920,7 +924,7 @@ get_alias_set (tree t) > > normal usage. And indeed lets vectors be treated more like an > > array slice. */ > > else if (TREE_CODE (t) == VECTOR_TYPE) > > - set = get_alias_set (TREE_TYPE (t)); > > + set = get_alias_set (TREE_TYPE (t), true); > > > > /* Unless the language specifies otherwise, treat array types the > > same as their components. This avoids the asymmetry we get > > @@ -933,7 +937,7 @@ get_alias_set (tree t) > > else if (TREE_CODE (t) == ARRAY_TYPE > > && (!TYPE_NONALIASED_COMPONENT (t) > > || TYPE_STRUCTURAL_EQUALITY_P (t))) > > - set = get_alias_set (TREE_TYPE (t)); > > + set = get_alias_set (TREE_TYPE (t), true); > > > > /* From the former common C and C++ langhook implementation: > > > > @@ -997,7 +1001,7 @@ get_alias_set (tree t) > > (see record_component_aliases) and thus it is safe it to use it for > > pointers to types with TYPE_STRUCTURAL_EQUALITY_P. */ > > if (TREE_CODE (p) == VOID_TYPE || TYPE_STRUCTURAL_EQUALITY_P (p)) > > - set = get_alias_set (ptr_type_node); > > + set = get_alias_set (ptr_type_node, true); > > else > > { > > /* Rebuild pointer type starting from canonical types using > > @@ -1085,15 +1089,10 @@ get_alias_set (tree t) > > alias_set_type > > new_alias_set (void) > > { > > - if (flag_strict_aliasing) > > - { > > - if (alias_sets == 0) > > - vec_safe_push (alias_sets, (alias_set_entry *) NULL); > > - vec_safe_push (alias_sets, (alias_set_entry *) NULL); > > - return alias_sets->length () - 1; > > - } > > - else > > - return 0; > > + if (alias_sets == 0) > > + vec_safe_push (alias_sets, (alias_set_entry *) NULL); > > + vec_safe_push (alias_sets, (alias_set_entry *) NULL); > > + return alias_sets->length () - 1; > > } > > > > /* Indicate that things in SUBSET can alias things in SUPERSET, but that > > @@ -1169,7 +1168,7 @@ record_alias_subset (alias_set_type supe > > void > > record_component_aliases (tree type) > > { > > - alias_set_type superset = get_alias_set (type); > > + alias_set_type superset = get_alias_set (type, true); > > tree field; > > > > if (superset == 0) > > @@ -1215,16 +1214,17 @@ record_component_aliases (tree type) > > if (POINTER_TYPE_P (t)) > > t = ptr_type_node; > > else if (flag_checking) > > - gcc_checking_assert (get_alias_set (t) > > - == get_alias_set (TREE_TYPE (field))); > > + gcc_checking_assert (get_alias_set (t, true) > > + == get_alias_set (TREE_TYPE (field), > > + true)); > > } > > > > - record_alias_subset (superset, get_alias_set (t)); > > + record_alias_subset (superset, get_alias_set (t, true)); > > } > > break; > > > > case COMPLEX_TYPE: > > - record_alias_subset (superset, get_alias_set (TREE_TYPE (type))); > > + record_alias_subset (superset, get_alias_set (TREE_TYPE (type), > > true)); > > break; > > > > /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their > > Index: alias.h > > =================================================================== > > --- alias.h (revision 231020) > > +++ alias.h (working copy) > > @@ -21,7 +21,7 @@ along with GCC; see the file COPYING3. > > #define GCC_ALIAS_H > > > > extern alias_set_type new_alias_set (void); > > -extern alias_set_type get_alias_set (tree); > > +extern alias_set_type get_alias_set (tree, bool strict = false); > > extern alias_set_type get_deref_alias_set (tree); > > extern alias_set_type get_varargs_alias_set (void); > > extern alias_set_type get_frame_alias_set (void); > > Index: lto/lto-symtab.c > > =================================================================== > > --- lto/lto-symtab.c (revision 231020) > > +++ lto/lto-symtab.c (working copy) > > @@ -276,8 +276,8 @@ warn_type_compatibility_p (tree prevaili > > we make ptr_type_node to TBAA compatible with every other type. */ > > if (type_with_alias_set_p (type) && type_with_alias_set_p > > (prevailing_type)) > > { > > - alias_set_type set1 = get_alias_set (type); > > - alias_set_type set2 = get_alias_set (prevailing_type); > > + alias_set_type set1 = get_alias_set (type, true); > > + alias_set_type set2 = get_alias_set (prevailing_type, true); > > > > if (set1 && set2 && set1 != set2 > > && (!POINTER_TYPE_P (type) || !POINTER_TYPE_P (prevailing_type) > > Index: lto/lto.c > > =================================================================== > > --- lto/lto.c (revision 231020) > > +++ 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: testsuite/gcc.c-torture/execute/alias-1.c > > =================================================================== > > --- testsuite/gcc.c-torture/execute/alias-1.c (revision 0) > > +++ testsuite/gcc.c-torture/execute/alias-1.c (revision 0) > > @@ -0,0 +1,19 @@ > > +int val; > > + > > +int *ptr = &val; > > +float *ptr2 = &val; > > + > > +__attribute__((optimize ("-fno-strict-aliasing"))) > > +typepun () > > +{ > > + *ptr2=0; > > +} > > + > > +main() > > +{ > > + *ptr=1; > > + typepun (); > > + if (*ptr) > > + __builtin_abort (); > > +} > > + > > Index: testsuite/gcc.dg/lto/alias-1_0.c > > =================================================================== > > --- testsuite/gcc.dg/lto/alias-1_0.c (revision 0) > > +++ testsuite/gcc.dg/lto/alias-1_0.c (revision 0) > > @@ -0,0 +1,22 @@ > > +/* { dg-lto-do run } */ > > +/* { dg-lto-options { { -O2 -flto } } } */ > > +int val; > > + > > +int *ptr = &val; > > +float *ptr2 = &val; > > + > > +extern void typefun(void); > > + > > +void link_error (void); > > + > > +int > > +main() > > +{ > > + *ptr=1; > > + typefun (); > > + if (*ptr) > > + /*link_error ();*/ > > + __builtin_abort (); > > + return 0; > > +} > > + > > Index: testsuite/gcc.dg/lto/alias-1_1.c > > =================================================================== > > --- testsuite/gcc.dg/lto/alias-1_1.c (revision 0) > > +++ testsuite/gcc.dg/lto/alias-1_1.c (revision 0) > > @@ -0,0 +1,8 @@ > > +/* { dg-options "-fno-strict-aliasing" } */ > > +extern float *ptr2; > > +void > > +__attribute__((optimize ("-fno-strict-aliasing"))) > > +typefun () > > +{ > > + *ptr2=0; > > +} > > Index: c-family/c-common.c > > =================================================================== > > --- c-family/c-common.c (revision 231048) > > +++ c-family/c-common.c (working copy) > > @@ -9988,7 +9988,6 @@ parse_optimize_options (tree args, bool > > bool ret = true; > > unsigned opt_argc; > > unsigned i; > > - int saved_flag_strict_aliasing; > > const char **opt_argv; > > struct cl_decoded_option *decoded_options; > > unsigned int decoded_options_count; > > @@ -10081,8 +10080,6 @@ parse_optimize_options (tree args, bool > > for (i = 1; i < opt_argc; i++) > > opt_argv[i] = (*optimize_args)[i]; > > > > - saved_flag_strict_aliasing = flag_strict_aliasing; > > - > > /* Now parse the options. */ > > decode_cmdline_options_to_array_default_mask (opt_argc, opt_argv, > > &decoded_options, > > @@ -10093,9 +10090,6 @@ parse_optimize_options (tree args, bool > > > > targetm.override_options_after_change(); > > > > - /* Don't allow changing -fstrict-aliasing. */ > > - flag_strict_aliasing = saved_flag_strict_aliasing; > > - > > optimize_args->truncate (0); > > return ret; > > } > > @@ -12930,8 +12924,8 @@ convert_vector_to_pointer_for_subscript > > /* If the original vector isn't declared may_alias and it > > isn't a bare vector look if the subscripting would > > alias the vector we subscript, and if not, force ref-all. */ > > - alias_set_type vecset = get_alias_set (*vecp); > > - alias_set_type sset = get_alias_set (type); > > + alias_set_type vecset = get_alias_set (*vecp, true); > > + alias_set_type sset = get_alias_set (type, true); > > if (!alias_sets_must_conflict_p (sset, vecset) > > && !alias_set_subset_of (sset, vecset)) > > ref_all = true; > > Index: lto-streamer-out.c > > =================================================================== > > --- lto-streamer-out.c (revision 231020) > > +++ 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: ipa-inline-transform.c > > =================================================================== > > --- ipa-inline-transform.c (revision 231020) > > +++ ipa-inline-transform.c (working copy) > > @@ -322,6 +322,23 @@ inline_call (struct cgraph_edge *e, bool > > if (DECL_FUNCTION_PERSONALITY (callee->decl)) > > DECL_FUNCTION_PERSONALITY (to->decl) > > = DECL_FUNCTION_PERSONALITY (callee->decl); > > + if (!opt_for_fn (callee->decl, flag_strict_aliasing) > > + && opt_for_fn (to->decl, flag_strict_aliasing) > > + && (!callee->merged > > + || lookup_attribute ("optimization", DECL_ATTRIBUTES > > (e->caller->decl)) > > + || lookup_attribute ("optimization", DECL_ATTRIBUTES (callee->decl)))) > > + { > > + struct gcc_options opts = global_options; > > + cl_optimization_restore (&opts, > > + TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl))); > > + opts.x_flag_strict_aliasing = false; > > + if (dump_file) > > + fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n", > > + to->name (), to->order); > > + build_optimization_node (&opts); > > + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl) > > + = build_optimization_node (&opts); > > + } > > > > /* If aliases are involved, redirect edge to the actual destination and > > possibly remove the aliases. */ > > Index: ipa-icf-gimple.c > > =================================================================== > > --- ipa-icf-gimple.c (revision 231020) > > +++ ipa-icf-gimple.c (working copy) > > @@ -241,7 +241,7 @@ func_checker::compatible_types_p (tree t > > For time being just avoid calling get_alias_set on types that are not > > having alias sets defined at all. */ > > if (type_with_alias_set_p (t1) && type_with_alias_set_p (t2) > > - && get_alias_set (t1) != get_alias_set (t2)) > > + && get_alias_set (t1, true) != get_alias_set (t2, true)) > > return return_false_with_msg ("alias sets are different"); > > > > return true; > > Index: tree-streamer-out.c > > =================================================================== > > --- tree-streamer-out.c (revision 231020) > > +++ tree-streamer-out.c (working copy) > > @@ -317,13 +321,18 @@ 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 type merging. > > + > > + Instead now double check that all aliaset set 0 types will be alias > > set > > + 0 in LTO world, too. */ > > + gcc_checking_assert (!type_with_alias_set_p (expr) > > + || !canonical_type_used_p (expr) > > + || TYPE_ALIAS_SET (expr) != 0 > > + || expr == char_type_node > > + || expr == signed_char_type_node > > + || expr == unsigned_char_type_node); > > if (RECORD_OR_UNION_TYPE_P (expr)) > > { > > bp_pack_value (bp, TYPE_TRANSPARENT_AGGR (expr), 1); > > Index: fold-const.c > > =================================================================== > > --- fold-const.c (revision 231020) > > +++ fold-const.c (working copy) > > @@ -2987,7 +2987,7 @@ operand_equal_p (const_tree arg0, const_ > > flags))) > > return 0; > > /* Verify that accesses are TBAA compatible. */ > > - if (flag_strict_aliasing > > + if ((flag_strict_aliasing || !cfun->after_inlining) > > && (!alias_ptr_types_compatible_p > > (TREE_TYPE (TREE_OPERAND (arg0, 1)), > > TREE_TYPE (TREE_OPERAND (arg1, 1))) > > Index: ada/gcc-interface/misc.c > > =================================================================== > > --- ada/gcc-interface/misc.c (revision 231020) > > +++ ada/gcc-interface/misc.c (working copy) > > @@ -592,13 +592,14 @@ gnat_get_alias_set (tree type) > > { > > /* If this is a padding type, use the type of the first field. */ > > if (TYPE_IS_PADDING_P (type)) > > - return get_alias_set (TREE_TYPE (TYPE_FIELDS (type))); > > + return get_alias_set (TREE_TYPE (TYPE_FIELDS (type)), true); > > > > /* If the type is an unconstrained array, use the type of the > > self-referential array we make. */ > > else if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE) > > return > > - get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE > > (type))))); > > + get_alias_set (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE > > (type)))), > > + true); > > > > /* If the type can alias any other types, return the alias set 0. */ > > else if (TYPE_P (type) && TYPE_UNIVERSAL_ALIASING_P (type)) > > Index: ada/gcc-interface/utils.c > > =================================================================== > > --- ada/gcc-interface/utils.c (revision 231020) > > +++ ada/gcc-interface/utils.c (working copy) > > @@ -1520,14 +1520,14 @@ relate_alias_sets (tree gnu_new_type, tr > > && TYPE_NONALIASED_COMPONENT (gnu_new_type) > > != TYPE_NONALIASED_COMPONENT (gnu_old_type))); > > > > - TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type); > > + TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type, true); > > break; > > > > case ALIAS_SET_SUBSET: > > case ALIAS_SET_SUPERSET: > > { > > - alias_set_type old_set = get_alias_set (gnu_old_type); > > - alias_set_type new_set = get_alias_set (gnu_new_type); > > + alias_set_type old_set = get_alias_set (gnu_old_type, true); > > + alias_set_type new_set = get_alias_set (gnu_new_type, true); > > > > /* Do nothing if the alias sets conflict. This ensures that we > > never call record_alias_subset several times for the same pair > > Index: ada/gcc-interface/trans.c > > =================================================================== > > --- ada/gcc-interface/trans.c (revision 231020) > > +++ ada/gcc-interface/trans.c (working copy) > > @@ -9702,11 +9702,13 @@ validate_unchecked_conversion (Node_Id g > > ? TREE_TYPE (gnu_source_type) > > : NULL_TREE; > > tree gnu_target_desig_type = TREE_TYPE (gnu_target_type); > > - alias_set_type target_alias_set = get_alias_set > > (gnu_target_desig_type); > > + alias_set_type target_alias_set = get_alias_set > > (gnu_target_desig_type, > > + true); > > > > if (target_alias_set != 0 > > && (!POINTER_TYPE_P (gnu_source_type) > > - || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type), > > + || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type, > > + true), > > target_alias_set))) > > { > > post_error_ne ("?possible aliasing problem for type&", > > @@ -9728,11 +9730,13 @@ validate_unchecked_conversion (Node_Id g > > : NULL_TREE; > > tree gnu_target_desig_type > > = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type))); > > - alias_set_type target_alias_set = get_alias_set > > (gnu_target_desig_type); > > + alias_set_type target_alias_set = get_alias_set > > (gnu_target_desig_type, > > + true); > > > > if (target_alias_set != 0 > > && (!TYPE_IS_FAT_POINTER_P (gnu_source_type) > > - || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type), > > + || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type, > > + true), > > target_alias_set))) > > { > > post_error_ne ("?possible aliasing problem for type&", > > Index: gimple.c > > =================================================================== > > --- gimple.c (revision 231020) > > +++ gimple.c (working copy) > > @@ -2408,7 +2408,7 @@ gimple_get_alias_set (tree t) > > > > /* t1 == t can happen for boolean nodes which are always unsigned. > > */ > > if (t1 != t) > > - return get_alias_set (t1); > > + return get_alias_set (t1, true); > > } > > > > return -1; > > > > > > -- > Richard Biener <rguent...@suse.de> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB > 21284 (AG Nuernberg)