On December 23, 2015 5:58:07 PM GMT+01:00, Uros Bizjak <ubiz...@gmail.com> wrote: >On Wed, Dec 23, 2015 at 2:39 PM, Richard Biener ><richard.guent...@gmail.com> wrote: >> On December 23, 2015 10:39:17 AM GMT+01:00, Uros Bizjak ><ubiz...@gmail.com> wrote: >>>Hello! >>> >>>There is a logic error in Honza's patch "Transparent alias suport >part >>>10" [1]. The part in memrefs_conflict_p should be changed to: >>> >>>- /* If decls are different or we know by offsets that there is >no >>>overlap, >>>- we win. */ >>>- if (!cmp || !offset_overlap_p (c, xsize, ysize)) >>>+ /* If decls are different and we know by offsets that >>>+ there is no overlap, we win. */ >>>+ if (!cmp && !offset_overlap_p (c, xsize, ysize)) >>> return 0; >>>- /* Decls may or may not be different and offsets overlap....*/ >>>+ /* Decls are different and offsets overlap....*/ >>> >>>Even if decls are different, their offsets shouldn't overlap! >> >> Comparing offsets of different decls does not make sense. > >Uh, yes, some more eyeballing was needed, but you are right. > >Is there a way to detect aliasing in case AND addresses are involved? > >Probably we need something like in base_alias_check, where:
Yeah, and in that case just give up. Richard. >--cut here-- >/* The base addresses are different expressions. If they are not >accessed > via AND, there is no conflict. We can bring knowledge of object > alignment into play here. For example, on alpha, "char a, b;" can > alias one another, though "char a; long b;" cannot. AND addesses may > implicitly alias surrounding objects; i.e. unaligned access in DImode > via AND address can alias all surrounding object types except those > with aligment 8 or higher. */ > if (GET_CODE (x) == AND && GET_CODE (y) == AND) > return 1; > if (GET_CODE (x) == AND > && (!CONST_INT_P (XEXP (x, 1)) > || (int) GET_MODE_UNIT_SIZE (y_mode) < -INTVAL (XEXP (x, 1)))) > return 1; > if (GET_CODE (y) == AND > && (!CONST_INT_P (XEXP (y, 1)) > || (int) GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1)))) > return 1; >--cut here- > >Uros.