fold-const.c (fold_unary_loc): Don't optimize POINTER_PLUS_EXPR casted to TYPE_RESTRI...
authorJakub Jelinek <jakub@redhat.com>
Tue, 4 Oct 2011 12:34:06 +0000 (14:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 4 Oct 2011 12:34:06 +0000 (14:34 +0200)
* 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.

From-SVN: r179500

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 9ee1a18724269edc31419ec3e8dc464a49a3ccba..3b973a05e3f96ac6c24a09a1228bfcbb83cb9406 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-04  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.
+
 2011-10-04  Joseph Myers  <joseph@codesourcery.com>
 
        * config.gcc (i[34567]86-*-elf*, x86_64-*-elf*): Use
index 79ebd8b5701841eff8944b7d7a74f968d001a22d..c3871f1075a09e4733dc0ee5434b06f9c79c64ff 100644 (file)
@@ -7946,6 +7946,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
         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))
index 5e2965b88d0895657245fef4ded25d9f3ab0a904..b0d2d2cec40d1600aaad8578f1b955a1637fb0e1 100644 (file)
@@ -1,3 +1,7 @@
+2011-10-04  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/tree-ssa/restrict-4.c: New test.
+
 2011-10-04  Artem Shinkarov  <artyom.shinkaroff@gmail.com>
 
        * gcc.c-torture/execute/vector-compare-1.c: Fix trailing white
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c b/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
new file mode 100644 (file)
index 0000000..a307c89
--- /dev/null
@@ -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" } } */
index a8737dac933ada0d28dd71466bde645c3b04d033..c6b92cfe77fe616ac50a085186dfd7e63e876f16 100644 (file)
@@ -804,6 +804,11 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
       && ((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))
+         && !is_gimple_min_invariant (def_rhs))
+       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