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.


Reply via email to