re PR middle-end/80809 (Multi-free error for variable size array used within OpenMP...
authorJakub Jelinek <jakub@redhat.com>
Mon, 22 May 2017 18:54:05 +0000 (20:54 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 22 May 2017 18:54:05 +0000 (20:54 +0200)
PR middle-end/80809
* gimplify.c (omp_add_variable): For GOVD_DEBUG_PRIVATE use
GOVD_SHARED rather than GOVD_PRIVATE with it.
(gimplify_adjust_omp_clauses_1, gimplify_adjust_omp_clauses): Expect
GOVD_SHARED rather than GOVD_PRIVATE with GOVD_DEBUG_PRIVATE.

* testsuite/libgomp.c/pr80809-1.c: New test.

From-SVN: r248345

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr80809-1.c [new file with mode: 0644]

index b69ffc0d527e444683bd02a7fdde4b6939343abf..cfa15c2a7e19bda87fef573157d920a494d3dd9c 100644 (file)
@@ -1,5 +1,11 @@
 2017-05-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/80809
+       * gimplify.c (omp_add_variable): For GOVD_DEBUG_PRIVATE use
+       GOVD_SHARED rather than GOVD_PRIVATE with it.
+       (gimplify_adjust_omp_clauses_1, gimplify_adjust_omp_clauses): Expect
+       GOVD_SHARED rather than GOVD_PRIVATE with GOVD_DEBUG_PRIVATE.
+
        PR middle-end/80853
        * omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE
        as last argument to build_outer_var_ref for pointer bases of array
index 810d9f4a3e1b659ff9019d6c6c965b80598db0f4..455a6993e15feda1fbb7a758341d22b5ed8cb70d 100644 (file)
@@ -6693,7 +6693,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
         of PRIVATE.  The sharing would take place via the pointer variable
         which we remapped above.  */
       if (flags & GOVD_SHARED)
-       flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
+       flags = GOVD_SHARED | GOVD_DEBUG_PRIVATE
                | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
 
       /* We're going to make use of the TYPE_SIZE_UNIT at least in the
@@ -8616,7 +8616,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
     return 0;
   if (flags & GOVD_DEBUG_PRIVATE)
     {
-      gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE);
+      gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_SHARED);
       private_debug = true;
     }
   else if (flags & GOVD_MAP)
@@ -8878,7 +8878,7 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p,
                {
                  gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
                              || ((n->value & GOVD_DATA_SHARE_CLASS)
-                                 == GOVD_PRIVATE));
+                                 == GOVD_SHARED));
                  OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
                  OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
                }
index d49420aa90e06567eec90e27175fb504eaba2aa4..c73683efff411c86928c0e409bf24bb52a06be2c 100644 (file)
@@ -1,5 +1,8 @@
 2017-05-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/80809
+       * testsuite/libgomp.c/pr80809-1.c: New test.
+
        PR middle-end/80853
        * testsuite/libgomp.c/pr80853.c: New test.
 
diff --git a/libgomp/testsuite/libgomp.c/pr80809-1.c b/libgomp/testsuite/libgomp.c/pr80809-1.c
new file mode 100644 (file)
index 0000000..07abb49
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR middle-end/80809 */
+/* { dg-do run } */
+
+__attribute__((noinline, noclone)) void
+foo (int x)
+{
+  int i, j, v[x], *w[16];
+  for (i = 0; i < x; i++)
+    v[i] = i;
+#pragma omp parallel
+#pragma omp single
+  for (i = 0; i < 16; i++)
+  /* Make sure v is implicitly determined shared in task, because it
+     is shared on the parallel.  */
+#pragma omp task private (j)
+    w[i] = v;
+  for (i = 0; i < 16; i++)
+    if (w[i] != v)
+      __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (4);
+  foo (27);
+  foo (196);
+  return 0;
+}