Hi!

The Fortran omp_finish_clause langhook can add OMP_CLAUSE_MAP clauses with
VAR_DECL OMP_CLAUSE_SIZE (or change one with constant into non-constant
one), if that appears in another OpenMP region, we need to notice the
variables there so that they can be properly shared/firstprivatized etc.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2016-10-26  Jakub Jelinek  <ja...@redhat.com>
            Martin Liska  <mli...@suse.cz>

        PR fortran/77973
        * gimplify.c (gimplify_adjust_omp_clauses_1): For all added map
        clauses with OMP_CLAUSE_SIZE being a decl, call omp_notice_variable
        on outer context if any.

        * gfortran.dg/gomp/pr77973.f90: New test.

--- gcc/gimplify.c.jj   2016-10-21 17:09:19.000000000 +0200
+++ gcc/gimplify.c      2016-10-26 13:54:45.822854763 +0200
@@ -8421,9 +8421,10 @@ gimplify_adjust_omp_clauses_1 (splay_tre
       && omp_shared_to_firstprivate_optimizable_decl_p (decl))
     omp_mark_stores (gimplify_omp_ctxp->outer_context, decl);
 
+  tree chain = *list_p;
   clause = build_omp_clause (input_location, code);
   OMP_CLAUSE_DECL (clause) = decl;
-  OMP_CLAUSE_CHAIN (clause) = *list_p;
+  OMP_CLAUSE_CHAIN (clause) = chain;
   if (private_debug)
     OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
   else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
@@ -8450,7 +8451,7 @@ gimplify_adjust_omp_clauses_1 (splay_tre
       OMP_CLAUSE_SET_MAP_KIND (clause, GOMP_MAP_ALLOC);
       OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (clause) = 1;
       OMP_CLAUSE_SET_MAP_KIND (nc, GOMP_MAP_FIRSTPRIVATE_POINTER);
-      OMP_CLAUSE_CHAIN (nc) = *list_p;
+      OMP_CLAUSE_CHAIN (nc) = chain;
       OMP_CLAUSE_CHAIN (clause) = nc;
       struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
       gimplify_omp_ctxp = ctx->outer_context;
@@ -8520,7 +8521,7 @@ gimplify_adjust_omp_clauses_1 (splay_tre
       tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
       OMP_CLAUSE_DECL (nc) = decl;
       OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1;
-      OMP_CLAUSE_CHAIN (nc) = *list_p;
+      OMP_CLAUSE_CHAIN (nc) = chain;
       OMP_CLAUSE_CHAIN (clause) = nc;
       struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
       gimplify_omp_ctxp = ctx->outer_context;
@@ -8531,6 +8532,12 @@ gimplify_adjust_omp_clauses_1 (splay_tre
   struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
   gimplify_omp_ctxp = ctx->outer_context;
   lang_hooks.decls.omp_finish_clause (clause, pre_p);
+  if (gimplify_omp_ctxp)
+    for (; clause != chain; clause = OMP_CLAUSE_CHAIN (clause))
+      if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
+         && DECL_P (OMP_CLAUSE_SIZE (clause)))
+       omp_notice_variable (gimplify_omp_ctxp, OMP_CLAUSE_SIZE (clause),
+                            true);
   gimplify_omp_ctxp = ctx;
   return 0;
 }
--- gcc/testsuite/gfortran.dg/gomp/pr77973.f90.jj       2016-10-26 
13:59:47.817076712 +0200
+++ gcc/testsuite/gfortran.dg/gomp/pr77973.f90  2016-10-26 13:59:28.000000000 
+0200
@@ -0,0 +1,12 @@
+! PR fortran/77973
+! { dg-do compile }
+
+subroutine s(x)
+  integer :: x(:)
+  integer :: i
+!$omp parallel
+!$omp target
+  x(1) = 1
+!$omp end target
+!$omp end parallel
+end

        Jakub

Reply via email to