re PR tree-optimization/49279 (Optimization incorrectly presuming constant variable...
authorJakub Jelinek <jakub@redhat.com>
Thu, 6 Oct 2011 16:38:29 +0000 (18:38 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 6 Oct 2011 16:38:29 +0000 (18:38 +0200)
PR tree-optimization/49279
* tree-ssa-structalias.c (find_func_aliases): Don't handle
CAST_RESTRICT.
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Allow
restrict propagation.
* tree-ssa.c (useless_type_conversion_p): Don't return false
if TYPE_RESTRICT differs.

* gcc.dg/tree-ssa/restrict-4.c: XFAIL.
* gcc.c-torture/execute/pr49279.c: New test.

From-SVN: r179620

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr49279.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
gcc/tree-ssa-forwprop.c
gcc/tree-ssa-structalias.c
gcc/tree-ssa.c

index ae8c6c9..aec77e9 100644 (file)
@@ -1,3 +1,13 @@
+2011-10-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/49279
+       * tree-ssa-structalias.c (find_func_aliases): Don't handle
+       CAST_RESTRICT.
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Allow
+       restrict propagation.
+       * tree-ssa.c (useless_type_conversion_p): Don't return false
+       if TYPE_RESTRICT differs.
+
 2011-10-06  Bernd Schmidt  <bernds@codesourcery.com>
 
        * function.c (thread_prologue_and_epilogue_insns): Build a vector
index b5ad3a4..cac88e9 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/49279
+       * gcc.dg/tree-ssa/restrict-4.c: XFAIL.
+       * gcc.c-torture/execute/pr49279.c: New test.
+
 2011-10-06  Bernd Schmidt  <bernds@codesourcery.com>
 
        PR target/49049
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49279.c b/gcc/testsuite/gcc.c-torture/execute/pr49279.c
new file mode 100644 (file)
index 0000000..7f2c0d2
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR tree-optimization/49279 */
+extern void abort (void);
+
+struct S { int a; int *__restrict p; };
+
+__attribute__((noinline, noclone))
+struct S *bar (struct S *p)
+{
+  struct S *r;
+  asm volatile ("" : "=r" (r) : "0" (p) : "memory");
+  return r;
+}
+
+__attribute__((noinline, noclone))
+int
+foo (int *p, int *q)
+{
+  struct S s, *t;
+  s.a = 1;
+  s.p = p;
+  t = bar (&s);
+  t->p = q;
+  s.p[0] = 0;
+  t->p[0] = 1;
+  return s.p[0];
+}
+
+int
+main ()
+{
+  int a, b;
+  if (foo (&a, &b) != 1)
+    abort ();
+  return 0;
+}
index a307c89..7bcdcdd 100644 (file)
@@ -22,5 +22,5 @@ bar (int *x, int y)
   return p1[y];
 }
 
-/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "return 1;" 2 "optimized" { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "optimized" } } */
index c6b92cf..a8737da 100644 (file)
@@ -804,11 +804,6 @@ 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
index 821fc7d..7de22aa 100644 (file)
@@ -4494,15 +4494,6 @@ find_func_aliases (gimple origt)
          && (!in_ipa_mode
              || DECL_EXTERNAL (lhsop) || TREE_PUBLIC (lhsop)))
        make_escape_constraint (rhsop);
-      /* If this is a conversion of a non-restrict pointer to a
-        restrict pointer track it with a new heapvar.  */
-      else if (gimple_assign_cast_p (t)
-              && POINTER_TYPE_P (TREE_TYPE (rhsop))
-              && POINTER_TYPE_P (TREE_TYPE (lhsop))
-              && !TYPE_RESTRICT (TREE_TYPE (rhsop))
-              && TYPE_RESTRICT (TREE_TYPE (lhsop)))
-       make_constraint_from_restrict (get_vi_for_tree (lhsop),
-                                      "CAST_RESTRICT");
     }
   /* Handle escapes through return.  */
   else if (gimple_code (t) == GIMPLE_RETURN
index a011593..258a744 100644 (file)
@@ -1270,12 +1270,6 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
          != TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))
        return false;
 
-      /* Do not lose casts to restrict qualified pointers.  */
-      if ((TYPE_RESTRICT (outer_type)
-          != TYPE_RESTRICT (inner_type))
-         && TYPE_RESTRICT (outer_type))
-       return false;
-
       /* If the outer type is (void *), the conversion is not necessary.  */
       if (VOID_TYPE_P (TREE_TYPE (outer_type)))
        return true;