re PR c++/80029 (valgrind error in new_omp_context(omp_region_type) (gimplify.c:400))
authorCesar Philippidis <cesar@gcc.gnu.org>
Wed, 22 Mar 2017 13:52:10 +0000 (06:52 -0700)
committerCesar Philippidis <cesar@gcc.gnu.org>
Wed, 22 Mar 2017 13:52:10 +0000 (06:52 -0700)
PR c++/80029

gcc/
* gimplify.c (is_oacc_declared): New function.
(oacc_default_clause): Use it to set default flags for acc declared
variables inside parallel regions.
(gimplify_scan_omp_clauses): Strip firstprivate pointers for acc
declared variables.
(gimplify_oacc_declare): Gimplify the declare clauses.  Add the
declare attribute to any decl as necessary.

libgomp/
* testsuite/libgomp.oacc-c-c++-common/declare-vla.c: New test.

From-SVN: r246381

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla.c [new file with mode: 0644]

index 18d00c29fba75ef4b97deb32e404078501711a1c..f7202cf0b9017e9ac88b9290e866043b115b18b1 100644 (file)
@@ -1,4 +1,15 @@
-t2017-03-22  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+2017-03-22  Cesar Philippidis  <cesar@codesourcery.com>
+
+       PR c++/80029
+       * gimplify.c (is_oacc_declared): New function.
+       (oacc_default_clause): Use it to set default flags for acc declared
+       variables inside parallel regions.
+       (gimplify_scan_omp_clauses): Strip firstprivate pointers for acc
+       declared variables.
+       (gimplify_oacc_declare): Gimplify the declare clauses.  Add the
+       declare attribute to any decl as necessary.
+
+2017-03-22  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        PR target/80082
        * config/arm/arm-isa.h (isa_bit_lpae): New feature bit.
index 06f984cec01eebd8c469baf593ad91df03ee8dc2..5658d0a2f0bbec0c33ba0b8a0259855e698e190a 100644 (file)
@@ -6786,6 +6786,16 @@ device_resident_p (tree decl)
   return false;
 }
 
+/* Return true if DECL has an ACC DECLARE attribute.  */
+
+static bool
+is_oacc_declared (tree decl)
+{
+  tree t = TREE_CODE (decl) == MEM_REF ? TREE_OPERAND (decl, 0) : decl;
+  tree declared = lookup_attribute ("oacc declare target", DECL_ATTRIBUTES (t));
+  return declared != NULL_TREE;
+}
+
 /* Determine outer default flags for DECL mentioned in an OMP region
    but not declared in an enclosing clause.
 
@@ -6886,6 +6896,7 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
 {
   const char *rkind;
   bool on_device = false;
+  bool declared = is_oacc_declared (decl);
   tree type = TREE_TYPE (decl);
 
   if (lang_hooks.decls.omp_privatize_by_reference (decl))
@@ -6916,7 +6927,7 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
 
     case ORT_ACC_PARALLEL:
       {
-       if (on_device || AGGREGATE_TYPE_P (type))
+       if (on_device || AGGREGATE_TYPE_P (type) || declared)
          /* Aggregates default to 'present_or_copy'.  */
          flags |= GOVD_MAP;
        else
@@ -7345,6 +7356,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
       case OMP_TARGET_DATA:
       case OMP_TARGET_ENTER_DATA:
       case OMP_TARGET_EXIT_DATA:
+      case OACC_DECLARE:
       case OACC_HOST_DATA:
        ctx->target_firstprivatize_array_bases = true;
       default:
@@ -9230,18 +9242,26 @@ gimplify_oacc_declare (tree *expr_p, gimple_seq *pre_p)
 {
   tree expr = *expr_p;
   gomp_target *stmt;
-  tree clauses, t;
+  tree clauses, t, decl;
 
   clauses = OACC_DECLARE_CLAUSES (expr);
 
   gimplify_scan_omp_clauses (&clauses, pre_p, ORT_TARGET_DATA, OACC_DECLARE);
+  gimplify_adjust_omp_clauses (pre_p, NULL, &clauses, OACC_DECLARE);
 
   for (t = clauses; t; t = OMP_CLAUSE_CHAIN (t))
     {
-      tree decl = OMP_CLAUSE_DECL (t);
+      decl = OMP_CLAUSE_DECL (t);
 
       if (TREE_CODE (decl) == MEM_REF)
-       continue;
+       decl = TREE_OPERAND (decl, 0);
+
+      if (VAR_P (decl) && !is_oacc_declared (decl))
+       {
+         tree attr = get_identifier ("oacc declare target");
+         DECL_ATTRIBUTES (decl) = tree_cons (attr, NULL_TREE,
+                                             DECL_ATTRIBUTES (decl));
+       }
 
       if (VAR_P (decl)
          && !is_global_var (decl)
@@ -9257,7 +9277,8 @@ gimplify_oacc_declare (tree *expr_p, gimple_seq *pre_p)
            }
        }
 
-      omp_add_variable (gimplify_omp_ctxp, decl, GOVD_SEEN);
+      if (gimplify_omp_ctxp)
+       omp_add_variable (gimplify_omp_ctxp, decl, GOVD_SEEN);
     }
 
   stmt = gimple_build_omp_target (NULL, GF_OMP_TARGET_KIND_OACC_DECLARE,
index f63f028d3e5e1fda438fb7be6140dc2d5a4c4114..74f50e0f32f240945500a283e6cf50054a4080d1 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-22  Cesar Philippidis  <cesar@codesourcery.com>
+
+       PR c++/80029
+       * testsuite/libgomp.oacc-c-c++-common/declare-vla.c: New test.
+
 2017-03-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/79940
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla.c
new file mode 100644 (file)
index 0000000..3ea148e
--- /dev/null
@@ -0,0 +1,25 @@
+/* Verify that acc declare accept VLA variables.  */
+
+#include <assert.h>
+
+int
+main ()
+{
+  int N = 1000;
+  int i, A[N];
+#pragma acc declare copy(A)
+
+  for (i = 0; i < N; i++)
+    A[i] = -i;
+
+#pragma acc kernels
+  for (i = 0; i < N; i++)
+    A[i] = i;
+
+#pragma acc update host(A)
+
+  for (i = 0; i < N; i++)
+    assert (A[i] == i);
+
+  return 0;
+}