On December 24, 2015 11:15:52 AM GMT+01:00, Jan Hubicka <hubi...@ucw.cz> wrote:
>> 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.
>
>Yep, I will look into it ASAP.
>comparing offsets of different decls is intended tohandle the case
>where one decl is foo and other bar.

... And they resolve to the same address.

For alpha we want to handle the case where an address based on decl A aliases 
decl B which do not resolve to the same address.  That's quite different and is 
generally _not_ allowed in the middle-end (apart from that pesky and-addresses).

 We do not know of foo is not alias
>of bar, but if offsets are different, we can still disambiguate
>This needs to be tought over WRT anchors anyway.
>
>Honza
>> 
>> 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.
>> 


Reply via email to