On Thu, 8 Oct 2020, Jan Hubicka wrote:

> Hi,
> this is fix I am testing (it solved the testcase)

LGTM

> gcc/ChangeLog:
> 
> 2020-10-08  Jan Hubicka  <hubi...@ucw.cz>
> 
>       * ipa-modref.c (get_access): Fix handling of offsets.
>       * tree-ssa-alias.c (modref_may_conflict): Watch for overflows.
> 
> diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
> index a5fa33a35de..5868aa97484 100644
> --- a/gcc/ipa-modref.c
> +++ b/gcc/ipa-modref.c
> @@ -318,8 +318,7 @@ get_access (ao_ref *ref)
>                         0, -1, false};
>    if (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF)
>      {
> -      tree offset = TREE_CODE (base) == MEM_REF
> -                 ? TREE_OPERAND (base, 1) : NULL_TREE;
> +      tree memref = base;
>        base = TREE_OPERAND (base, 0);
>        if (TREE_CODE (base) == SSA_NAME
>         && SSA_NAME_IS_DEFAULT_DEF (base)
> @@ -336,8 +335,14 @@ get_access (ao_ref *ref)
>               }
>             a.parm_index++;
>           }
> -       a.parm_offset_known
> -         = offset && wi::to_poly_offset (offset).to_shwi (&a.parm_offset);
> +       if (TREE_CODE (memref) == MEM_REF)
> +         {
> +           a.parm_offset_known
> +              = wi::to_poly_wide (TREE_OPERAND
> +                                      (memref, 1)).to_shwi (&a.parm_offset);
> +         }
> +       else
> +         a.parm_offset_known = false;
>       }
>        else
>       a.parm_index = -1;
> diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
> index 97dc4ac8814..d885f7157c5 100644
> --- a/gcc/tree-ssa-alias.c
> +++ b/gcc/tree-ssa-alias.c
> @@ -2542,16 +2542,22 @@ modref_may_conflict (const gimple *stmt,
>             else
>               {
>                 ao_ref ref2;
> -
> -               ao_ref_init_from_ptr_and_range
> -                      (&ref2, arg, true,
> -                       access_node->offset
> -                       + (access_node->parm_offset
> -                          << LOG2_BITS_PER_UNIT), access_node->size,
> -                       access_node->max_size);
> -               ref2.ref_alias_set = ref_set;
> -               ref2.base_alias_set = base_set;
> -               if (refs_may_alias_p_1 (&ref2, ref, tbaa_p))
> +               poly_offset_int off = (poly_offset_int)access_node->offset
> +                     + ((poly_offset_int)access_node->parm_offset
> +                        << LOG2_BITS_PER_UNIT);
> +               poly_int64 off2;
> +               if (off.to_shwi (&off2))
> +                 {
> +                   ao_ref_init_from_ptr_and_range
> +                          (&ref2, arg, true, off2,
> +                           access_node->size,
> +                           access_node->max_size);
> +                   ref2.ref_alias_set = ref_set;
> +                   ref2.base_alias_set = base_set;
> +                   if (refs_may_alias_p_1 (&ref2, ref, tbaa_p))
> +                     return true;
> +                 }
> +               else if (ptr_deref_may_alias_ref_p_1 (arg, ref))
>                   return true;
>               }
>             num_tests++;
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to