> > But part of the expensiveness we want to avoid is this > (repeated) walking of the ref tree...
I was considering to pass contains_union_p down from one of earlier walks, but did not find suitable one for that... > > So... > > > + return !handled_component_p (ref2); > > +} > > + > > /* Return true if an indirect reference based on *PTR1 constrained > > to [OFFSET1, OFFSET1 + MAX_SIZE1) may alias a variable based on BASE2 > > constrained to [OFFSET2, OFFSET2 + MAX_SIZE2). *PTR1 and BASE2 have > > @@ -1533,7 +1563,12 @@ indirect_ref_may_alias_decl_p (tree ref1 > > && (TREE_CODE (TREE_TYPE (base1)) != ARRAY_TYPE > > || (TYPE_SIZE (TREE_TYPE (base1)) > > && TREE_CODE (TYPE_SIZE (TREE_TYPE (base1))) == INTEGER_CST))) > > - return ranges_maybe_overlap_p (doffset1, max_size1, doffset2, > > max_size2); > > + { > > + if (!ranges_maybe_overlap_p (doffset1, max_size1, doffset2, > > max_size2)) > > + return false; > > + if (same_access_paths_p (ref1, max_size1, ref2, max_size2)) > > + return true; > > how about a simpler test like > > if (known_size_p (max_size1) && known_size_p (max_size2)) > return true; > /* If there's an unconstrained variable access in the ref fall > through to access-path based disambiguation. */ If I have something like struct a {int a[10];int b;} and then aptr->a[i] in the access path, won't be max_size known (40) where type size is 4? In this case I want to contiue to access path. > > ? > > I'd certainly like to see testcases btw... There is a testcase for variable array access included in the patch, would you like to have one with union in it? > > A more stricter test would be > > if (!maybe_eq (max_size1, size1) && !maybe_eq (max_size2, size2)) > return true; > /* If there's a variable access in one of the refs fall through > to access-path based disambiguation. */ > > where you'd need to pass down ao_ref_size in addition to max_size as well. Proably || here? Honza