https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64365

--- Comment #14 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 30 Jan 2015, brooks at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64365
> 
> --- Comment #13 from Brooks Moses <brooks at gcc dot gnu.org> ---
> FWIW, if you haven't done the 4.9 backport yet, this is what I ended up with. 
> I'm not sure it's optimal, but it seems to work.

Looks optimal to me - so if you bootstrapped and tested this it is ok
to apply to the branch (with the testcase also backported of course).

> Index: gcc/tree-data-ref.c
> ===================================================================
> --- gcc/tree-data-ref.c (revision 220259)
> +++ gcc/tree-data-ref.c (working copy)
> @@ -973,6 +973,24 @@
>                                 fold_convert (ssizetype, memoff));
>               memoff = build_int_cst (TREE_TYPE (memoff), 0);
>             }
> +         /* Adjust the offset so it is a multiple of the access type
> +            size and thus we separate bases that can possibly be used
> +            to produce partial overlaps (which the access_fn machinery
> +            cannot handle).  */
> +         double_int rem;
> +         if (TYPE_SIZE_UNIT (TREE_TYPE (ref))
> +             && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (ref))) == INTEGER_CST
> +             && !integer_zerop (TYPE_SIZE_UNIT (TREE_TYPE (ref))))
> +           rem = tree_to_double_int (off).mod
> +                (tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (ref))), 
> false,
> +                 TRUNC_MOD_EXPR);
> +         else
> +           /* If we can't compute the remainder simply force the initial
> +              condition to zero.  */
> +           rem = tree_to_double_int (off);
> +         off = double_int_to_tree (ssizetype, tree_to_double_int (off) - 
> rem);
> +         memoff = double_int_to_tree (TREE_TYPE (memoff), rem);
> +         /* And finally replace the initial condition.  */
>           access_fn = chrec_replace_initial_condition
>               (access_fn, fold_convert (orig_type, off));
>           /* ???  This is still not a suitable base object for
> 
>

Reply via email to