The PR complains that with TYPE_TYPELESS_STORAGE in C++ now too much TBAA aliasing happens (not that this was unexpected). The reason for this with the testcase is the alias-set zero case in component_uses_parent_alias_set_from which history tells me was added for attribute((may_alias)) purposes - but that case is now handled in the caller via ref_all_alias_ptr_type_p. The TYPE_TYPELESS_STORAGE case is also not needed given the flag is propagated in the type hierarchy so if T is TYPE_TYPELESS_STORAGE then all bases are so as well.
Bootstrapped and tested on x86_64-unknown-linux-gnu for all languages. Eric, do you know of any cases in Ada where a alias-set zero base has non-alias-set zero children? The testsuite seems to be clean but you never know... Richard. 2018-11-19 Richard Biener <rguent...@suse.de> PR middle-end/83215 * alias.c (component_uses_parent_alias_set_from): Remove alias-set zero and TYPE_TYPELESS_STORAGE case both already handled in other ways. * g++.dg/tree-ssa/pr83215.C: New testcase. Index: gcc/alias.c =================================================================== --- gcc/alias.c (revision 266278) +++ gcc/alias.c (working copy) @@ -601,8 +601,7 @@ objects_must_conflict_p (tree t1, tree t /* Return the outermost parent of component present in the chain of component references handled by get_inner_reference in T with the following property: - - the component is non-addressable, or - - the parent has alias set zero, + - the component is non-addressable or NULL_TREE if no such parent exists. In the former cases, the alias set of this parent is the alias set that must be used for T itself. */ @@ -611,10 +610,6 @@ component_uses_parent_alias_set_from (co { const_tree found = NULL_TREE; - if (AGGREGATE_TYPE_P (TREE_TYPE (t)) - && TYPE_TYPELESS_STORAGE (TREE_TYPE (t))) - return const_cast <tree> (t); - while (handled_component_p (t)) { switch (TREE_CODE (t)) @@ -652,9 +647,6 @@ component_uses_parent_alias_set_from (co gcc_unreachable (); } - if (get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) == 0) - found = t; - t = TREE_OPERAND (t, 0); } Index: gcc/testsuite/g++.dg/tree-ssa/pr83215.C =================================================================== --- gcc/testsuite/g++.dg/tree-ssa/pr83215.C (nonexistent) +++ gcc/testsuite/g++.dg/tree-ssa/pr83215.C (working copy) @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-O2 -fdump-tree-fre1" } + +struct mytest +{ + float a; + char buf[256]; +}; + +int foo(mytest *m, int *i) +{ + int tmp = *i; + m->a = 10.0f; + return tmp + *i; +} + +// we should be able to CSE *i despite mytest having a cbar[] buffer +// and thus being subject to TYPE_TYPELESS_STORAGE +// { dg-final { scan-tree-dump-times "\\*i" 1 "fre1" } }