On Thu, Jun 20, 2019 at 4:16 PM Jan Hubicka <hubi...@ucw.cz> wrote: > > Hi, > as discussed earlier this patch drops ref2_is_decl from > aliasing_component_refs. This parameter makes it to assume that all > access path may not continue by reference to DECL which is not true > because in gimple memory model we allow to store value of completely > unrealted type to it. I have also constructed an (invalid C IMO) > testcase (which fails on GCC for ages, but works for ICC) > > Bootstrapped/regtested x86_64-linux, will commit it shortly.
OK. Richard. > * tree-ssa-alias.c (aliasing_component_refs_p): Remove ref2_is_decl > parameter; it has no use in gimple memory model. > (indirect_ref_may_alias_decl_p): Update. > * gcc.c-torture/execute/alias-access-path-1.c: New testcase. > Index: tree-ssa-alias.c > =================================================================== > --- tree-ssa-alias.c (revision 272507) > +++ tree-ssa-alias.c (working copy) > @@ -850,8 +850,7 @@ type_has_components_p (tree type) > > /* Determine if the two component references REF1 and REF2 which are > based on access types TYPE1 and TYPE2 and of which at least one is based > - on an indirect reference may alias. REF2 is the only one that can > - be a decl in which case REF2_IS_DECL is true. > + on an indirect reference may alias. > REF1_ALIAS_SET, BASE1_ALIAS_SET, REF2_ALIAS_SET and BASE2_ALIAS_SET > are the respective alias sets. */ > > @@ -863,8 +862,7 @@ aliasing_component_refs_p (tree ref1, > tree ref2, > alias_set_type ref2_alias_set, > alias_set_type base2_alias_set, > - poly_int64 offset2, poly_int64 max_size2, > - bool ref2_is_decl) > + poly_int64 offset2, poly_int64 max_size2) > { > /* If one reference is a component references through pointers try to find > a > common base and apply offset based disambiguation. This handles > @@ -982,7 +980,7 @@ aliasing_component_refs_p (tree ref1, > if (TREE_CODE (TREE_TYPE (base1)) == ARRAY_TYPE > && (!TYPE_SIZE (TREE_TYPE (base1)) > || TREE_CODE (TYPE_SIZE (TREE_TYPE (base1))) != INTEGER_CST > - || (ref == base2 && !ref2_is_decl))) > + || ref == base2)) > { > ++alias_stats.aliasing_component_refs_p_may_alias; > return true; > @@ -1041,7 +1039,7 @@ aliasing_component_refs_p (tree ref1, > if (TREE_CODE (TREE_TYPE (base2)) == ARRAY_TYPE > && (!TYPE_SIZE (TREE_TYPE (base2)) > || TREE_CODE (TYPE_SIZE (TREE_TYPE (base2))) != INTEGER_CST > - || (ref == base1 && !ref2_is_decl))) > + || ref == base1)) > { > ++alias_stats.aliasing_component_refs_p_may_alias; > return true; > @@ -1089,8 +1087,7 @@ aliasing_component_refs_p (tree ref1, > return true; > } > /* If this is ptr vs. decl then we know there is no ptr ... decl path. */ > - if (!ref2_is_decl > - && compare_type_sizes (TREE_TYPE (ref1), type2) >= 0 > + if (compare_type_sizes (TREE_TYPE (ref1), type2) >= 0 > && (!end_struct_ref2 > || compare_type_sizes (TREE_TYPE (ref1), > TREE_TYPE (end_struct_ref2)) >= 0) > @@ -1554,13 +1551,7 @@ indirect_ref_may_alias_decl_p (tree ref1 > offset1, max_size1, > ref2, > ref2_alias_set, base2_alias_set, > - offset2, max_size2, > - /* Only if the other reference is actual > - decl we can safely check only > toplevel > - part of access path 1. */ > - same_type_for_tbaa (TREE_TYPE (dbase2), > - TREE_TYPE (base2)) > - == 1); > + offset2, max_size2); > > return true; > } > @@ -1675,7 +1666,7 @@ indirect_refs_may_alias_p (tree ref1 ATT > offset1, max_size1, > ref2, > ref2_alias_set, base2_alias_set, > - offset2, max_size2, false); > + offset2, max_size2); > > return true; > } > Index: testsuite/gcc.c-torture/execute/alias-access-path-1.c > =================================================================== > --- testsuite/gcc.c-torture/execute/alias-access-path-1.c (nonexistent) > +++ testsuite/gcc.c-torture/execute/alias-access-path-1.c (working copy) > @@ -0,0 +1,19 @@ > +/* Test that variable > + int val; > + may hold value of tyope "struct c" which has same size. > + This is valid in GIMPLE memory model. */ > + > +struct a {int val;} a={1},a2; > +struct b {struct a a;}; > +int val; > +struct c {struct b b;} *cptr=(void *)&val; > + > +int > +main(void) > +{ > + cptr->b.a=a; > + val = 2; > + a2=cptr->b.a; > + if (a2.val == a.val) > + __builtin_abort (); > +}