This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Restrict fixes
On Thu, 29 Sep 2011, Jakub Jelinek wrote:
> Hi!
>
> On Mon, Sep 26, 2011 at 06:41:10PM +0200, Jakub Jelinek wrote:
> > which would be invalid to call with foo (a, 32); given the above, but
> > it isn't obvious to the compiler what value y has. With -DWORKAROUND
> > the PT decls in (restr) look correct, without that not (supposedly because
> > of the folding of the initializer), still, the vectorizer together
> > with the alias oracle don't figure out they can omit the non-overlap
> > tests before both loops.
>
> This patch fixes the folder that
> int *__restrict p2 = x + 32;
> for non-restrict x isn't gimplified as
> int *__restrict x.0 = (int *__restrict) x;
> int *__restrict p2 = x.0 + 32;
> and forwprop to avoid propagating what has a restrict pointer been
> initialized from, unless it was restrict too, because otherwise the
> restrict info is lost and aliasing can't disambiguate accesses based on
> that pointer.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Hmm, in fwprop can you limit your change to non-invariant addresses?
That is, we do want to propagate invariant addresses over
restrict casts, because that will give us _more_ precise alias info
than restrict.
Thanks,
Richard.
> 2011-09-29 Jakub Jelinek <jakub@redhat.com>
>
> * fold-const.c (fold_unary_loc): Don't optimize
> POINTER_PLUS_EXPR casted to TYPE_RESTRICT pointer by
> casting the inner pointer if it isn't TYPE_RESTRICT.
> * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't through
> casts from non-TYPE_RESTRICT pointer to TYPE_RESTRICT pointer.
>
> * gcc.dg/tree-ssa/restrict-4.c: New test.
>
> --- gcc/fold-const.c.jj 2011-09-29 14:25:46.000000000 +0200
> +++ gcc/fold-const.c 2011-09-29 18:20:04.000000000 +0200
> @@ -7929,6 +7929,7 @@ fold_unary_loc (location_t loc, enum tre
> that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
> if (POINTER_TYPE_P (type)
> && TREE_CODE (arg0) == POINTER_PLUS_EXPR
> + && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0)))
> && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
> || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
> || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
> --- gcc/tree-ssa-forwprop.c.jj 2011-09-15 12:18:54.000000000 +0200
> +++ gcc/tree-ssa-forwprop.c 2011-09-29 19:08:03.000000000 +0200
> @@ -804,6 +804,10 @@ forward_propagate_addr_expr_1 (tree name
> && ((rhs_code == SSA_NAME && rhs == name)
> || CONVERT_EXPR_CODE_P (rhs_code)))
> {
> + /* Don't propagate restrict pointer's RHS. */
> + if (TYPE_RESTRICT (TREE_TYPE (lhs))
> + && !TYPE_RESTRICT (TREE_TYPE (name)))
> + return false;
> /* Only recurse if we don't deal with a single use or we cannot
> do the propagation to the current statement. In particular
> we can end up with a conversion needed for a non-invariant
> --- gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c.jj 2011-09-29 20:21:00.000000000 +0200
> +++ gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c 2011-09-29 20:21:57.000000000 +0200
> @@ -0,0 +1,26 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int
> +foo (int *x, int y)
> +{
> + int *__restrict p1 = x;
> + int *__restrict p2 = x + 32;
> + p1[y] = 1;
> + p2[4] = 2;
> + return p1[y];
> +}
> +
> +int
> +bar (int *x, int y)
> +{
> + int *__restrict p1 = x;
> + int *p3 = x + 32;
> + int *__restrict p2 = p3;
> + p1[y] = 1;
> + p2[4] = 2;
> + return p1[y];
> +}
> +
> +/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */
> +/* { dg-final { cleanup-tree-dump "optimized" } } */
>
>
> Jakub
>
>
--
Richard Guenther <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer