re PR middle-end/87610 (wrong-code with restrict)
authorRichard Biener <rguenther@suse.de>
Mon, 15 Oct 2018 10:58:28 +0000 (10:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 15 Oct 2018 10:58:28 +0000 (10:58 +0000)
2018-10-15  Richard Biener  <rguenther@suse.de>

PR middle-end/87610
* tree-ssa-structalias.c (struct vls_data): Add escaped_p member.
(visit_loadstore): When a used restrict tag escaped verify that
the points-to solution of "other" pointers do not include
escaped.
(compute_dependence_clique): If a used restrict tag escaped
communicated that down to visit_loadstore.

* gcc.dg/torture/restrict-6.c: New testcase.

From-SVN: r265160

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

index 4f33576..742f5cf 100644 (file)
@@ -1,3 +1,13 @@
+2018-10-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/87610
+       * tree-ssa-structalias.c (struct vls_data): Add escaped_p member.
+       (visit_loadstore): When a used restrict tag escaped verify that
+       the points-to solution of "other" pointers do not include
+       escaped.
+       (compute_dependence_clique): If a used restrict tag escaped
+       communicated that down to visit_loadstore.
+
 2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>
 
        * config/s390/s390.c (s390_expand_vec_init): Force vector element
index f12a743..e189162 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/87610
+       * gcc.dg/torture/restrict-6.c: New testcase.
+
 2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>
 
        * g++.dg/vec-init-1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/restrict-6.c b/gcc/testsuite/gcc.dg/torture/restrict-6.c
new file mode 100644 (file)
index 0000000..9fe12a6
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+void __attribute__((noinline)) g(int **a, int *b)
+{
+  *a = b;
+}
+
+int foo(int * restrict p, int *q)
+{
+  g(&q, p);
+  *p = 1;
+  *q = 2;
+  return *p + *q;
+}
+
+int main()
+{
+  int x, y;
+  if (foo(&x, &y) != 4)
+    abort ();
+  return 0;
+}
index 06ac001..7751803 100644 (file)
@@ -7397,6 +7397,7 @@ delete_points_to_sets (void)
 struct vls_data
 {
   unsigned short clique;
+  bool escaped_p;
   bitmap rvars;
 };
 
@@ -7408,6 +7409,7 @@ visit_loadstore (gimple *, tree base, tree ref, void *data)
 {
   unsigned short clique = ((vls_data *) data)->clique;
   bitmap rvars = ((vls_data *) data)->rvars;
+  bool escaped_p = ((vls_data *) data)->escaped_p;
   if (TREE_CODE (base) == MEM_REF
       || TREE_CODE (base) == TARGET_MEM_REF)
     {
@@ -7428,7 +7430,8 @@ visit_loadstore (gimple *, tree base, tree ref, void *data)
            return false;
 
          vi = get_varinfo (find (vi->id));
-         if (bitmap_intersect_p (rvars, vi->solution))
+         if (bitmap_intersect_p (rvars, vi->solution)
+             || (escaped_p && bitmap_bit_p (vi->solution, escaped_id)))
            return false;
        }
 
@@ -7505,6 +7508,7 @@ compute_dependence_clique (void)
   unsigned short clique = 0;
   unsigned short last_ruid = 0;
   bitmap rvars = BITMAP_ALLOC (NULL);
+  bool escaped_p = false;
   for (unsigned i = 0; i < num_ssa_names; ++i)
     {
       tree ptr = ssa_name (i);
@@ -7574,7 +7578,12 @@ compute_dependence_clique (void)
                                                 last_ruid);
            }
          if (used)
-           bitmap_set_bit (rvars, restrict_var->id);
+           {
+             bitmap_set_bit (rvars, restrict_var->id);
+             varinfo_t escaped = get_varinfo (find (escaped_id));
+             if (bitmap_bit_p (escaped->solution, restrict_var->id))
+               escaped_p = true;
+           }
        }
     }
 
@@ -7587,7 +7596,7 @@ compute_dependence_clique (void)
         parameters) we can't restrict scoping properly thus the following
         is too aggressive there.  For now we have excluded those globals from
         getting into the MR_DEPENDENCE machinery.  */
-      vls_data data = { clique, rvars };
+      vls_data data = { clique, escaped_p, rvars };
       basic_block bb;
       FOR_EACH_BB_FN (bb, cfun)
        for (gimple_stmt_iterator gsi = gsi_start_bb (bb);