Am Freitag, dem 03.05.2024 um 21:16 +0200 schrieb Jakub Jelinek:
> > On Fri, May 03, 2024 at 09:11:20PM +0200, Martin Uecker wrote:
> > > > > > TYPE_CANONICAL as used by the middle-end cannot express this but
> > > > 
> > > > Hm. so how does it work now for arrays?
> > 
> > Do you have a testcase which doesn't work correctly with the arrays?

I am mostly trying to understand better how this works. But
if I am not mistaken, the following example would indeed
indicate that we do incorrect aliasing decisions for types
derived from arrays:

https://godbolt.org/z/rTsE3PhKc

Martin

> > 
> > E.g. same_type_for_tbaa has
> >   type1 = TYPE_MAIN_VARIANT (type1);
> >   type2 = TYPE_MAIN_VARIANT (type2);
> > 
> >   /* Handle the most common case first.  */
> >   if (type1 == type2)
> >     return 1;
> > 
> >   /* If we would have to do structural comparison bail out.  */
> >   if (TYPE_STRUCTURAL_EQUALITY_P (type1)
> >       || TYPE_STRUCTURAL_EQUALITY_P (type2))
> >     return -1;
> > 
> >   /* Compare the canonical types.  */
> >   if (TYPE_CANONICAL (type1) == TYPE_CANONICAL (type2))
> >     return 1;
> > 
> >   /* ??? Array types are not properly unified in all cases as we have
> >      spurious changes in the index types for example.  Removing this
> >      causes all sorts of problems with the Fortran frontend.  */
> >   if (TREE_CODE (type1) == ARRAY_TYPE
> >       && TREE_CODE (type2) == ARRAY_TYPE)
> >     return -1;
> > ...
> > and later compares alias sets and the like.
> > So, even if int[] and int[0] have different TYPE_CANONICAL, they
> > will be considered maybe the same.  Also, guess get_alias_set
> > has some ARRAY_TYPE handling...
> > 
> > Anyway, I think we should just go with Richi's patch.
> > 
> >     Jakub
> > 


Reply via email to