[PATCH] Restrict fixes

Jakub Jelinek jakub@redhat.com
Thu Sep 29 23:01:00 GMT 2011


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?

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



More information about the Gcc-patches mailing list