> On Mon, 17 Jun 2019, Jan Hubicka wrote: > > > Hi, > > this is patch for aliasing_component_refs_p and VCE. > > I also turned the refp to ref, but there are no changes relative > > to that. > > Bootstrapped/regtested x86_64-linux, OK? > > OK. > > Bonus points for wrong-code testcases involving these... like > the following which doesn't fail for some reason:
We punt on same_type_for_tbaa on arrays so the aliasing_component_refs_p thinks that int and int[2] possibly match and gives up :) Honza > > struct S { int i; int j[2]; }; > > __GIMPLE(startwith("fre1")) int foo(struct S *x, struct S *y) > { > int _1; > x->j[0] = 1; > __VIEW_CONVERT <struct S> (__MEM <int[2]> ((int(*)[2])y + 4)).i = 0; > _1 = x->j[0]; > return _1; > } > > int main() > { > struct S s; > if (foo (&s, &s) != 0) > __builtin_abort (); > return 0; > } > > Thanks, > Richard. > > > Honza > > > > * tree-ssa-alias.c (aliasing_component_refs_p): Consider only > > the access path from base to first VIEW_CONVERT_EXPR or > > BIT_FIELD_REF. > > Index: tree-ssa-alias.c > > =================================================================== > > --- tree-ssa-alias.c (revision 272381) > > +++ tree-ssa-alias.c (working copy) > > @@ -874,7 +874,6 @@ aliasing_component_refs_p (tree ref1, > > disambiguating q->i and p->a.j. */ > > tree base1, base2; > > tree type1, type2; > > - tree *refp; > > int same_p1 = 0, same_p2 = 0; > > bool maybe_match = false; > > tree end_struct_ref1 = NULL, end_struct_ref2 = NULL; > > @@ -903,6 +902,9 @@ aliasing_component_refs_p (tree ref1, > > gcc_checking_assert (!end_struct_ref1); > > end_struct_ref1 = base1; > > } > > + if (TREE_CODE (base1) == VIEW_CONVERT_EXPR > > + || TREE_CODE (base1) == BIT_FIELD_REF) > > + ref1 = TREE_OPERAND (base1, 0); > > base1 = TREE_OPERAND (base1, 0); > > } > > type1 = TREE_TYPE (base1); > > @@ -918,6 +920,9 @@ aliasing_component_refs_p (tree ref1, > > gcc_checking_assert (!end_struct_ref2); > > end_struct_ref2 = base2; > > } > > + if (TREE_CODE (base2) == VIEW_CONVERT_EXPR > > + || TREE_CODE (base2) == BIT_FIELD_REF) > > + ref2 = TREE_OPERAND (base2, 0); > > base2 = TREE_OPERAND (base2, 0); > > } > > type2 = TREE_TYPE (base2); > > @@ -934,23 +939,23 @@ aliasing_component_refs_p (tree ref1, > > || (end_struct_ref2 > > && compare_type_sizes (TREE_TYPE (end_struct_ref2), type1) >= 0)) > > { > > - refp = &ref2; > > + tree ref = ref2; > > while (true) > > { > > /* We walk from inner type to the outer types. If type we see is > > already too large to be part of type1, terminate the search. */ > > - int cmp = compare_type_sizes (type1, TREE_TYPE (*refp)); > > + int cmp = compare_type_sizes (type1, TREE_TYPE (ref)); > > > > if (cmp < 0 > > && (!end_struct_ref1 > > || compare_type_sizes (TREE_TYPE (end_struct_ref1), > > - TREE_TYPE (*refp)) < 0)) > > + TREE_TYPE (ref)) < 0)) > > break; > > /* If types may be of same size, see if we can decide about their > > equality. */ > > if (cmp == 0) > > { > > - same_p2 = same_type_for_tbaa (TREE_TYPE (*refp), type1); > > + same_p2 = same_type_for_tbaa (TREE_TYPE (ref), type1); > > if (same_p2 == 1) > > break; > > /* In case we can't decide whether types are same try to > > @@ -960,9 +965,9 @@ aliasing_component_refs_p (tree ref1, > > if (same_p2 == -1) > > maybe_match = true; > > } > > - if (!handled_component_p (*refp)) > > + if (!handled_component_p (ref)) > > break; > > - refp = &TREE_OPERAND (*refp, 0); > > + ref = TREE_OPERAND (ref, 0); > > } > > if (same_p2 == 1) > > { > > @@ -977,13 +982,13 @@ 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 > > - || (*refp == base2 && !ref2_is_decl))) > > + || (ref == base2 && !ref2_is_decl))) > > { > > ++alias_stats.aliasing_component_refs_p_may_alias; > > return true; > > } > > > > - get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp, &reverse); > > + get_ref_base_and_extent (ref, &offadj, &sztmp, &msztmp, &reverse); > > offset2 -= offadj; > > get_ref_base_and_extent (base1, &offadj, &sztmp, &msztmp, &reverse); > > offset1 -= offadj; > > @@ -1005,28 +1010,28 @@ aliasing_component_refs_p (tree ref1, > > || (end_struct_ref1 > > && compare_type_sizes (TREE_TYPE (end_struct_ref1), type1) <= 0)) > > { > > - refp = &ref1; > > + tree ref = ref1; > > while (true) > > { > > - int cmp = compare_type_sizes (type2, TREE_TYPE (*refp)); > > + int cmp = compare_type_sizes (type2, TREE_TYPE (ref)); > > if (cmp < 0 > > && (!end_struct_ref2 > > || compare_type_sizes (TREE_TYPE (end_struct_ref2), > > - TREE_TYPE (*refp)) < 0)) > > + TREE_TYPE (ref)) < 0)) > > break; > > /* If types may be of same size, see if we can decide about their > > equality. */ > > if (cmp == 0) > > { > > - same_p1 = same_type_for_tbaa (TREE_TYPE (*refp), type2); > > + same_p1 = same_type_for_tbaa (TREE_TYPE (ref), type2); > > if (same_p1 == 1) > > break; > > if (same_p1 == -1) > > maybe_match = true; > > } > > - if (!handled_component_p (*refp)) > > + if (!handled_component_p (ref)) > > break; > > - refp = &TREE_OPERAND (*refp, 0); > > + ref = TREE_OPERAND (ref, 0); > > } > > if (same_p1 == 1) > > { > > @@ -1036,13 +1041,13 @@ 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 > > - || (*refp == base1 && !ref2_is_decl))) > > + || (ref == base1 && !ref2_is_decl))) > > { > > ++alias_stats.aliasing_component_refs_p_may_alias; > > return true; > > } > > > > - get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp, &reverse); > > + get_ref_base_and_extent (ref, &offadj, &sztmp, &msztmp, &reverse); > > offset1 -= offadj; > > get_ref_base_and_extent (base2, &offadj, &sztmp, &msztmp, &reverse); > > offset2 -= offadj; > > > > -- > Richard Biener <rguent...@suse.de> > SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; > GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)