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 > >