OpenACC 2.5 default (present) clause
authorThomas Schwinge <thomas@codesourcery.com>
Fri, 19 May 2017 13:32:48 +0000 (15:32 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Fri, 19 May 2017 13:32:48 +0000 (15:32 +0200)
gcc/c/
* c-parser.c (c_parser_omp_clause_default): Handle
"OMP_CLAUSE_DEFAULT_PRESENT".
gcc/cp/
* parser.c (cp_parser_omp_clause_default): Handle
"OMP_CLAUSE_DEFAULT_PRESENT".
gcc/fortran/
* gfortran.h (enum gfc_omp_default_sharing): Add
"OMP_DEFAULT_PRESENT".
* dump-parse-tree.c (show_omp_clauses): Handle it.
* openmp.c (gfc_match_omp_clauses): Likewise.
* trans-openmp.c (gfc_trans_omp_clauses): Likewise.
gcc/
* tree-core.h (enum omp_clause_default_kind): Add
"OMP_CLAUSE_DEFAULT_PRESENT".
* tree-pretty-print.c (dump_omp_clause): Handle it.
* gimplify.c (enum gimplify_omp_var_data): Add
"GOVD_MAP_FORCE_PRESENT".
(gimplify_adjust_omp_clauses_1): Map it to
"GOMP_MAP_FORCE_PRESENT".
(oacc_default_clause): Handle "OMP_CLAUSE_DEFAULT_PRESENT".
gcc/testsuite/
* c-c++-common/goacc/default-1.c: Update.
* c-c++-common/goacc/default-2.c: Likewise.
* c-c++-common/goacc/default-4.c: Likewise.
* gfortran.dg/goacc/default-1.f95: Likewise.
* gfortran.dg/goacc/default-4.f: Likewise.
* c-c++-common/goacc/default-5.c: New file.
* gfortran.dg/goacc/default-5.f: Likewise.
libgomp/
* testsuite/libgomp.oacc-c++/template-reduction.C: Update.
* testsuite/libgomp.oacc-c-c++-common/nested-2.c: Update.
* testsuite/libgomp.oacc-fortran/data-4-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/default-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/non-scalar-data.f90: Likewise.

From-SVN: r248280

27 files changed:
gcc/ChangeLog
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/fortran/ChangeLog
gcc/fortran/dump-parse-tree.c
gcc/fortran/gfortran.h
gcc/fortran/openmp.c
gcc/fortran/trans-openmp.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/default-1.c
gcc/testsuite/c-c++-common/goacc/default-2.c
gcc/testsuite/c-c++-common/goacc/default-4.c
gcc/testsuite/c-c++-common/goacc/default-5.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/default-1.f95
gcc/testsuite/gfortran.dg/goacc/default-4.f
gcc/testsuite/gfortran.dg/goacc/default-5.f [new file with mode: 0644]
gcc/tree-core.h
gcc/tree-pretty-print.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
libgomp/testsuite/libgomp.oacc-c-c++-common/nested-2.c
libgomp/testsuite/libgomp.oacc-fortran/data-4-2.f90
libgomp/testsuite/libgomp.oacc-fortran/default-1.f90
libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90

index 8f63902d064c6dfcea74d06b33543472e3bd83a3..c40af474ea396b10e4205010b1dba8950b888579 100644 (file)
@@ -1,5 +1,14 @@
 2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
 
+       * tree-core.h (enum omp_clause_default_kind): Add
+       "OMP_CLAUSE_DEFAULT_PRESENT".
+       * tree-pretty-print.c (dump_omp_clause): Handle it.
+       * gimplify.c (enum gimplify_omp_var_data): Add
+       "GOVD_MAP_FORCE_PRESENT".
+       (gimplify_adjust_omp_clauses_1): Map it to
+       "GOMP_MAP_FORCE_PRESENT".
+       (oacc_default_clause): Handle "OMP_CLAUSE_DEFAULT_PRESENT".
+
        * gimplify.c (oacc_default_clause): Clarify.
 
 2017-05-19  Nathan Sidwell  <nathan@acm.org>
index 79643cc1b3b0083443ff5cedc3c5671474c74d87..a70eaf910b097ad4f5b23ab5fec1bea4e9427344 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-parser.c (c_parser_omp_clause_default): Handle
+       "OMP_CLAUSE_DEFAULT_PRESENT".
+
 2017-05-18  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * config-lang.in (gtfiles): Add c-family/c-format.c.
index 96c074961da4cf500126ea40eb14f43d415ae44a..2e013161a9af457a026bbbcb147792a9c99c23b1 100644 (file)
@@ -11057,10 +11057,10 @@ c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
 }
 
 /* OpenMP 2.5:
-   default ( shared | none )
+   default ( none | shared )
 
-   OpenACC 2.0:
-   default (none) */
+   OpenACC:
+   default ( none | present ) */
 
 static tree
 c_parser_omp_clause_default (c_parser *parser, tree list, bool is_oacc)
@@ -11083,6 +11083,12 @@ c_parser_omp_clause_default (c_parser *parser, tree list, bool is_oacc)
          kind = OMP_CLAUSE_DEFAULT_NONE;
          break;
 
+       case 'p':
+         if (strcmp ("present", p) != 0 || !is_oacc)
+           goto invalid_kind;
+         kind = OMP_CLAUSE_DEFAULT_PRESENT;
+         break;
+
        case 's':
          if (strcmp ("shared", p) != 0 || is_oacc)
            goto invalid_kind;
@@ -11099,7 +11105,7 @@ c_parser_omp_clause_default (c_parser *parser, tree list, bool is_oacc)
     {
     invalid_kind:
       if (is_oacc)
-       c_parser_error (parser, "expected %<none%>");
+       c_parser_error (parser, "expected %<none%> or %<present%>");
       else
        c_parser_error (parser, "expected %<none%> or %<shared%>");
     }
index c89f71981e35b22c591f89329502a611a6683fc3..f2dced41ddb169b6b65ad5810a60f1a383743a79 100644 (file)
@@ -1,5 +1,8 @@
 2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
 
+       * parser.c (cp_parser_omp_clause_default): Handle
+       "OMP_CLAUSE_DEFAULT_PRESENT".
+
        * parser.c (cp_parser_omp_clause_default): Avoid printing more
        than one syntax error message.
 
index 6453397b530790efd60528617747557e3be61a74..b345110fbc4e733282a4a51efaaba97f15a2d6e1 100644 (file)
@@ -31456,10 +31456,10 @@ cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location
 }
 
 /* OpenMP 2.5:
-   default ( shared | none )
+   default ( none | shared )
 
-   OpenACC 2.0
-   default (none) */
+   OpenACC:
+   default ( none | present ) */
 
 static tree
 cp_parser_omp_clause_default (cp_parser *parser, tree list,
@@ -31483,6 +31483,12 @@ cp_parser_omp_clause_default (cp_parser *parser, tree list,
          kind = OMP_CLAUSE_DEFAULT_NONE;
          break;
 
+       case 'p':
+         if (strcmp ("present", p) != 0 || !is_oacc)
+           goto invalid_kind;
+         kind = OMP_CLAUSE_DEFAULT_PRESENT;
+         break;
+
        case 's':
          if (strcmp ("shared", p) != 0 || is_oacc)
            goto invalid_kind;
@@ -31499,7 +31505,7 @@ cp_parser_omp_clause_default (cp_parser *parser, tree list,
     {
     invalid_kind:
       if (is_oacc)
-       cp_parser_error (parser, "expected %<none%>");
+       cp_parser_error (parser, "expected %<none%> or %<present%>");
       else
        cp_parser_error (parser, "expected %<none%> or %<shared%>");
     }
index 9a8b3e1c396298fca5581f1449fe3aee9891ccd9..4b7f1f4e4bfd2ecae73505bf6f8f4c142304f819 100644 (file)
@@ -1,3 +1,11 @@
+2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * gfortran.h (enum gfc_omp_default_sharing): Add
+       "OMP_DEFAULT_PRESENT".
+       * dump-parse-tree.c (show_omp_clauses): Handle it.
+       * openmp.c (gfc_match_omp_clauses): Likewise.
+       * trans-openmp.c (gfc_trans_omp_clauses): Likewise.
+
 2017-05-18  Fritz Reese <fritzoreese@gmail.com>
 
        PR fortran/79968
index 87a530458f9927eeb7860dcd9c7aab587575db77..49b23d8697e849e737e1d2088cd650f416f36011 100644 (file)
@@ -1283,6 +1283,7 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses)
        case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
        case OMP_DEFAULT_SHARED: type = "SHARED"; break;
        case OMP_DEFAULT_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
+       case OMP_DEFAULT_PRESENT: type = "PRESENT"; break;
        default:
          gcc_unreachable ();
        }
index 293655078a4869c34f660089c1763917671e29c0..26b89bee98ec6cbbc5eb1bbc8afae3d494fabcc0 100644 (file)
@@ -1241,7 +1241,8 @@ enum gfc_omp_default_sharing
   OMP_DEFAULT_NONE,
   OMP_DEFAULT_PRIVATE,
   OMP_DEFAULT_SHARED,
-  OMP_DEFAULT_FIRSTPRIVATE
+  OMP_DEFAULT_FIRSTPRIVATE,
+  OMP_DEFAULT_PRESENT
 };
 
 enum gfc_omp_proc_bind_kind
index 89eecfa2ed17d9bc2a3ce7e007f5b930b320554a..80146e2f1dc96177c9ec2468e6652545ed55570e 100644 (file)
@@ -1080,13 +1080,19 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
              if (gfc_match ("default ( none )") == MATCH_YES)
                c->default_sharing = OMP_DEFAULT_NONE;
              else if (openacc)
-               /* c->default_sharing = OMP_DEFAULT_UNKNOWN */;
-             else if (gfc_match ("default ( shared )") == MATCH_YES)
-               c->default_sharing = OMP_DEFAULT_SHARED;
-             else if (gfc_match ("default ( private )") == MATCH_YES)
-               c->default_sharing = OMP_DEFAULT_PRIVATE;
-             else if (gfc_match ("default ( firstprivate )") == MATCH_YES)
-               c->default_sharing = OMP_DEFAULT_FIRSTPRIVATE;
+               {
+                 if (gfc_match ("default ( present )") == MATCH_YES)
+                   c->default_sharing = OMP_DEFAULT_PRESENT;
+               }
+             else
+               {
+                 if (gfc_match ("default ( firstprivate )") == MATCH_YES)
+                   c->default_sharing = OMP_DEFAULT_FIRSTPRIVATE;
+                 else if (gfc_match ("default ( private )") == MATCH_YES)
+                   c->default_sharing = OMP_DEFAULT_PRIVATE;
+                 else if (gfc_match ("default ( shared )") == MATCH_YES)
+                   c->default_sharing = OMP_DEFAULT_SHARED;
+               }
              if (c->default_sharing != OMP_DEFAULT_UNKNOWN)
                continue;
            }
index 662036f514db105c685deacc1a4da19b88b037d9..1d254c6904daedd74677f9058fe790e048cbc226 100644 (file)
@@ -2564,6 +2564,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
        case OMP_DEFAULT_FIRSTPRIVATE:
          OMP_CLAUSE_DEFAULT_KIND (c) = OMP_CLAUSE_DEFAULT_FIRSTPRIVATE;
          break;
+       case OMP_DEFAULT_PRESENT:
+         OMP_CLAUSE_DEFAULT_KIND (c) = OMP_CLAUSE_DEFAULT_PRESENT;
+         break;
        default:
          gcc_unreachable ();
        }
index 0c02ee4371ec904cde56264ba4feb7eb876a07f2..810d9f4a3e1b659ff9019d6c6c965b80598db0f4 100644 (file)
@@ -99,6 +99,9 @@ enum gimplify_omp_var_data
   /* Flag for GOVD_MAP, if it is a forced mapping.  */
   GOVD_MAP_FORCE = 262144,
 
+  /* Flag for GOVD_MAP: must be present already.  */
+  GOVD_MAP_FORCE_PRESENT = 524288,
+
   GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE
                           | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR
                           | GOVD_LOCAL)
@@ -6956,8 +6959,13 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
       rkind = "kernels";
 
       if (AGGREGATE_TYPE_P (type))
-       /* Aggregates default to 'present_or_copy'.  */
-       flags |= GOVD_MAP;
+       {
+         /* Aggregates default to 'present_or_copy', or 'present'.  */
+         if (ctx->default_kind != OMP_CLAUSE_DEFAULT_PRESENT)
+           flags |= GOVD_MAP;
+         else
+           flags |= GOVD_MAP | GOVD_MAP_FORCE_PRESENT;
+       }
       else
        /* Scalars default to 'copy'.  */
        flags |= GOVD_MAP | GOVD_MAP_FORCE;
@@ -6970,8 +6978,13 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
       if (on_device || declared)
        flags |= GOVD_MAP;
       else if (AGGREGATE_TYPE_P (type))
-       /* Aggregates default to 'present_or_copy'.  */
-       flags |= GOVD_MAP;
+       {
+         /* Aggregates default to 'present_or_copy', or 'present'.  */
+         if (ctx->default_kind != OMP_CLAUSE_DEFAULT_PRESENT)
+           flags |= GOVD_MAP;
+         else
+           flags |= GOVD_MAP | GOVD_MAP_FORCE_PRESENT;
+       }
       else
        /* Scalars default to 'firstprivate'.  */
        flags |= GOVD_FIRSTPRIVATE;
@@ -6991,6 +7004,8 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
             DECL_NAME (lang_hooks.decls.omp_report_decl (decl)), rkind);
       inform (ctx->location, "enclosing OpenACC %qs construct", rkind);
     }
+  else if (ctx->default_kind == OMP_CLAUSE_DEFAULT_PRESENT)
+    ; /* Handled above.  */
   else
     gcc_checking_assert (ctx->default_kind == OMP_CLAUSE_DEFAULT_SHARED);
 
@@ -8708,11 +8723,30 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
     }
   else if (code == OMP_CLAUSE_MAP)
     {
-      int kind = (flags & GOVD_MAP_TO_ONLY
-                 ? GOMP_MAP_TO
-                 : GOMP_MAP_TOFROM);
-      if (flags & GOVD_MAP_FORCE)
-       kind |= GOMP_MAP_FLAG_FORCE;
+      int kind;
+      /* Not all combinations of these GOVD_MAP flags are actually valid.  */
+      switch (flags & (GOVD_MAP_TO_ONLY
+                      | GOVD_MAP_FORCE
+                      | GOVD_MAP_FORCE_PRESENT))
+       {
+       case 0:
+         kind = GOMP_MAP_TOFROM;
+         break;
+       case GOVD_MAP_FORCE:
+         kind = GOMP_MAP_TOFROM | GOMP_MAP_FLAG_FORCE;
+         break;
+       case GOVD_MAP_TO_ONLY:
+         kind = GOMP_MAP_TO;
+         break;
+       case GOVD_MAP_TO_ONLY | GOVD_MAP_FORCE:
+         kind = GOMP_MAP_TO | GOMP_MAP_FLAG_FORCE;
+         break;
+       case GOVD_MAP_FORCE_PRESENT:
+         kind = GOMP_MAP_FORCE_PRESENT;
+         break;
+       default:
+         gcc_unreachable ();
+       }
       OMP_CLAUSE_SET_MAP_KIND (clause, kind);
       if (DECL_SIZE (decl)
          && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
index ca901c29a665f3b2feb72fbdb7ddd4afe5fadde2..e8e2df5c9a9550375ba96b98e30ec1540102089a 100644 (file)
@@ -1,5 +1,13 @@
 2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
 
+       * c-c++-common/goacc/default-1.c: Update.
+       * c-c++-common/goacc/default-2.c: Likewise.
+       * c-c++-common/goacc/default-4.c: Likewise.
+       * gfortran.dg/goacc/default-1.f95: Likewise.
+       * gfortran.dg/goacc/default-4.f: Likewise.
+       * c-c++-common/goacc/default-5.c: New file.
+       * gfortran.dg/goacc/default-5.f: Likewise.
+
        * c-c++-common/goacc/default-1.c: New file.
        * c-c++-common/goacc/default-2.c: Likewise.
        * c-c++-common/goacc/data-default-1.c: Remove file, including its
index 4d31dbc981b84144ca028c2a5bf27d06d19d02ee..23c25ab45a9e017684f8772e23248c245f495d05 100644 (file)
@@ -6,4 +6,9 @@ void f1 ()
   ;
 #pragma acc parallel default (none)
   ;
+
+#pragma acc kernels default (present)
+  ;
+#pragma acc parallel default (present)
+  ;
 }
index d6b6cdce4d7d4e7b867040d50a1194320dee1f8b..c0cdd1263bd112c5f6e5a6cfafb11fa8bc4da724 100644 (file)
@@ -7,39 +7,39 @@ void f1 ()
 #pragma acc parallel default /* { dg-error "expected .\\(. before end of line" } */
   ;
 
-#pragma acc kernels default ( /* { dg-error "expected .none. before end of line" } */
+#pragma acc kernels default ( /* { dg-error "expected .none. or .present. before end of line" } */
   ;
-#pragma acc parallel default ( /* { dg-error "expected .none. before end of line" } */
+#pragma acc parallel default ( /* { dg-error "expected .none. or .present. before end of line" } */
   ;
 
-#pragma acc kernels default (, /* { dg-error "expected .none. before .,. token" } */
+#pragma acc kernels default (, /* { dg-error "expected .none. or .present. before .,. token" } */
   ;
-#pragma acc parallel default (, /* { dg-error "expected .none. before .,. token" } */
+#pragma acc parallel default (, /* { dg-error "expected .none. or .present. before .,. token" } */
   ;
 
-#pragma acc kernels default () /* { dg-error "expected .none. before .\\). token" } */
+#pragma acc kernels default () /* { dg-error "expected .none. or .present. before .\\). token" } */
   ;
-#pragma acc parallel default () /* { dg-error "expected .none. before .\\). token" } */
+#pragma acc parallel default () /* { dg-error "expected .none. or .present. before .\\). token" } */
   ;
 
-#pragma acc kernels default (,) /* { dg-error "expected .none. before .,. token" } */
+#pragma acc kernels default (,) /* { dg-error "expected .none. or .present. before .,. token" } */
   ;
-#pragma acc parallel default (,) /* { dg-error "expected .none. before .,. token" } */
+#pragma acc parallel default (,) /* { dg-error "expected .none. or .present. before .,. token" } */
   ;
 
-#pragma acc kernels default (firstprivate) /* { dg-error "expected .none. before .firstprivate." } */
+#pragma acc kernels default (firstprivate) /* { dg-error "expected .none. or .present. before .firstprivate." } */
   ;
-#pragma acc parallel default (firstprivate) /* { dg-error "expected .none. before .firstprivate." } */
+#pragma acc parallel default (firstprivate) /* { dg-error "expected .none. or .present. before .firstprivate." } */
   ;
 
-#pragma acc kernels default (private) /* { dg-error "expected .none. before .private." } */
+#pragma acc kernels default (private) /* { dg-error "expected .none. or .present. before .private." } */
   ;
-#pragma acc parallel default (private) /* { dg-error "expected .none. before .private." } */
+#pragma acc parallel default (private) /* { dg-error "expected .none. or .present. before .private." } */
   ;
 
-#pragma acc kernels default (shared) /* { dg-error "expected .none. before .shared." } */
+#pragma acc kernels default (shared) /* { dg-error "expected .none. or .present. before .shared." } */
   ;
-#pragma acc parallel default (shared) /* { dg-error "expected .none. before .shared." } */
+#pragma acc parallel default (shared) /* { dg-error "expected .none. or .present. before .shared." } */
   ;
 
 #pragma acc kernels default (none /* { dg-error "expected .\\). before end of line" } */
index 787b35256dbe65465657a869bbf74e34fc636658..dfa79bbbe6ef0e50e68945e8a6812d7e8c71e149 100644 (file)
@@ -43,3 +43,24 @@ void f2 ()
     }
   }
 }
+
+void f3 ()
+{
+  int f3_a = 2;
+  float f3_b[2];
+
+#pragma acc data copyin (f3_a) copyout (f3_b)
+  /* { dg-final { scan-tree-dump-times "omp target oacc_data map\\(force_from:f3_b \[^\\)\]+\\) map\\(force_to:f3_a" 1 "gimple" } } */
+  {
+#pragma acc kernels default (present)
+    /* { dg-final { scan-tree-dump-times "omp target oacc_kernels default\\(present\\) map\\(tofrom:f3_b \[^\\)\]+\\) map\\(tofrom:f3_a" 1 "gimple" } } */
+    {
+      f3_b[0] = f3_a;
+    }
+#pragma acc parallel default (present)
+    /* { dg-final { scan-tree-dump-times "omp target oacc_parallel default\\(present\\) map\\(tofrom:f3_b \[^\\)\]+\\) map\\(tofrom:f3_a" 1 "gimple" } } */
+    {
+      f3_b[0] = f3_a;
+    }
+  }
+}
diff --git a/gcc/testsuite/c-c++-common/goacc/default-5.c b/gcc/testsuite/c-c++-common/goacc/default-5.c
new file mode 100644 (file)
index 0000000..37e3c35
--- /dev/null
@@ -0,0 +1,20 @@
+/* OpenACC default (present) clause.  */
+
+/* { dg-additional-options "-fdump-tree-gimple" } */
+
+void f1 ()
+{
+  int f1_a = 2;
+  float f1_b[2];
+
+#pragma acc kernels default (present)
+  /* { dg-final { scan-tree-dump-times "omp target oacc_kernels default\\(present\\) map\\(force_present:f1_b \[^\\)\]+\\) map\\(force_tofrom:f1_a" 1 "gimple" } } */
+  {
+    f1_b[0] = f1_a;
+  }
+#pragma acc parallel default (present)
+  /* { dg-final { scan-tree-dump-times "omp target oacc_parallel default\\(present\\) map\\(force_present:f1_b \[^\\)\]+\\) firstprivate\\(f1_a\\)" 1 "gimple" } } */
+  {
+    f1_b[0] = f1_a;
+  }
+}
index a79b444f6f488724801561df17c56bb9b21f8a90..41fa9446b91081f63b5823215980c26b1ef49d07 100644 (file)
@@ -7,4 +7,9 @@ subroutine f1
   !$acc end kernels
   !$acc parallel default (none)
   !$acc end parallel
+
+  !$acc kernels default (present)
+  !$acc end kernels
+  !$acc parallel default (present)
+  !$acc end parallel
 end subroutine f1
index b2f73c3bcfb728ccf4318c42341d18e9ba58eb5d..77291f43effd24497433ad49c80003bc8f6764b1 100644 (file)
 !$ACC END PARALLEL
 !$ACC END DATA
       END SUBROUTINE F2
+
+      SUBROUTINE F3
+      IMPLICIT NONE
+      INTEGER :: F3_A = 2
+      REAL, DIMENSION (2) :: F3_B
+
+!$ACC DATA COPYIN (F3_A) COPYOUT (F3_B)
+! { dg-final { scan-tree-dump-times "omp target oacc_data map\\(force_to:f3_a \[^\\)\]+\\) map\\(force_from:f3_b" 1 "gimple" } }
+!$ACC KERNELS DEFAULT (PRESENT)
+! { dg-final { scan-tree-dump-times "omp target oacc_kernels default\\(present\\) map\\(tofrom:f3_b \[^\\)\]+\\) map\\(tofrom:f3_a" 1 "gimple" } }
+      F3_B(1) = F3_A;
+!$ACC END KERNELS
+!$ACC PARALLEL DEFAULT (PRESENT)
+! { dg-final { scan-tree-dump-times "omp target oacc_parallel default\\(present\\) map\\(tofrom:f3_b \[^\\)\]+\\) map\\(tofrom:f3_a" 1 "gimple" } }
+      F3_B(1) = F3_A;
+!$ACC END PARALLEL
+!$ACC END DATA
+      END SUBROUTINE F3
diff --git a/gcc/testsuite/gfortran.dg/goacc/default-5.f b/gcc/testsuite/gfortran.dg/goacc/default-5.f
new file mode 100644 (file)
index 0000000..9dc83cb
--- /dev/null
@@ -0,0 +1,18 @@
+! OpenACC default (present) clause.
+
+! { dg-additional-options "-fdump-tree-gimple" } 
+
+      SUBROUTINE F1
+      IMPLICIT NONE
+      INTEGER :: F1_A = 2
+      REAL, DIMENSION (2) :: F1_B
+
+!$ACC KERNELS DEFAULT (PRESENT)
+! { dg-final { scan-tree-dump-times "omp target oacc_kernels default\\(present\\) map\\(force_present:f1_b \[^\\)\]+\\) map\\(force_tofrom:f1_a" 1 "gimple" } }
+      F1_B(1) = F1_A;
+!$ACC END KERNELS
+!$ACC PARALLEL DEFAULT (PRESENT)
+! { dg-final { scan-tree-dump-times "omp target oacc_parallel default\\(present\\) map\\(force_present:f1_b \[^\\)\]+\\) firstprivate\\(f1_a\\)" 1 "gimple" } }
+      F1_B(1) = F1_A;
+!$ACC END PARALLEL
+      END SUBROUTINE F1
index c76fc7bc8efe58dc70e32ed4dd82e591a061afe2..ea73477163d835b98e37b55a38f25d59087a4be3 100644 (file)
@@ -357,7 +357,7 @@ enum omp_clause_code {
   /* OpenMP clause: ordered [(constant-integer-expression)].  */
   OMP_CLAUSE_ORDERED,
 
-  /* OpenMP clause: default.  */
+  /* OpenACC/OpenMP clause: default.  */
   OMP_CLAUSE_DEFAULT,
 
   /* OpenACC/OpenMP clause: collapse (constant-integer-expression).  */
@@ -499,6 +499,7 @@ enum omp_clause_default_kind {
   OMP_CLAUSE_DEFAULT_NONE,
   OMP_CLAUSE_DEFAULT_PRIVATE,
   OMP_CLAUSE_DEFAULT_FIRSTPRIVATE,
+  OMP_CLAUSE_DEFAULT_PRESENT,
   OMP_CLAUSE_DEFAULT_LAST
 };
 
index ec28b1e3c952559aa7c7698f98580c24d54978cb..b70e32573eecfb993839985ef3c89698c394faaa 100644 (file)
@@ -502,6 +502,9 @@ dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
        case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
          pp_string (pp, "firstprivate");
          break;
+       case OMP_CLAUSE_DEFAULT_PRESENT:
+         pp_string (pp, "present");
+         break;
        default:
          gcc_unreachable ();
        }
index 84d1c839d70285ebf0792102cec6746372e12016..460605b1b8aee24da41e4028268d0e0dbd9dd4ba 100644 (file)
@@ -1,5 +1,11 @@
 2017-05-19  Thomas Schwinge  <thomas@codesourcery.com>
 
+       * testsuite/libgomp.oacc-c++/template-reduction.C: Update.
+       * testsuite/libgomp.oacc-c-c++-common/nested-2.c: Update.
+       * testsuite/libgomp.oacc-fortran/data-4-2.f90: Likewise.
+       * testsuite/libgomp.oacc-fortran/default-1.f90: Likewise.
+       * testsuite/libgomp.oacc-fortran/non-scalar-data.f90: Likewise.
+
        * plugin/plugin-hsa.c (DLSYM_FN, init_hsa_runtime_functions):
        Debug output for failure.
 
index 6c85fba7a92ddbfd4fb2e3c171b4e7fb35da9a2a..ede0aae14c62ea5c87b0d75b5b993a3ec0f2a6a0 100644 (file)
@@ -32,6 +32,28 @@ sum ()
   return s;
 }
 
+// Check template with default (present)
+
+template<typename T> T
+sum_default_present ()
+{
+  T s = 0;
+  T array[n];
+
+  for (int i = 0; i < n; i++)
+    array[i] = i+1;
+
+#pragma acc enter data copyin (array)
+
+#pragma acc parallel loop num_gangs (10) gang reduction (+:s) default (present)
+  for (int i = 0; i < n; i++)
+    s += array[i];
+
+#pragma acc exit data delete (array)
+
+  return s;
+}
+
 // Check present and async
 
 template<typename T> T
@@ -86,6 +108,9 @@ main()
   if (sum<int> () != result)
     __builtin_abort ();
 
+  if (sum_default_present<int> () != result)
+    __builtin_abort ();
+
 #pragma acc enter data copyin (a)
   if (async_sum (a) != result)
     __builtin_abort ();
index c16459826af5f598e0702347e85f3fceb44284e6..51b3b18ad666cd4a79d6c177b4b86763f5514a7e 100644 (file)
@@ -137,5 +137,36 @@ main (int argc, char *argv[])
             abort ();
     }
 
+
+#pragma acc enter data create (a)
+
+#pragma acc parallel default (present)
+    {
+      for (int j = 0; j < N; ++j)
+       a[j] = j + 1;
+    }
+
+#pragma acc update host (a)
+
+    for (i = 0; i < N; ++i)
+      {
+        if (a[i] != i + 1)
+         abort ();
+      }
+
+#pragma acc kernels default (present)
+    {
+      for (int j = 0; j < N; ++j)
+       a[j] = j + 2;
+    }
+
+#pragma acc exit data copyout (a)
+
+    for (i = 0; i < N; ++i)
+      {
+        if (a[i] != i + 2)
+         abort ();
+      }
+
     return 0;
 }
index 16a85980b4d9b710f3d091a6038683ab30a20bbe..df4aca06a704fb0a5fb1bf8eff9dc13533846a3a 100644 (file)
@@ -1,4 +1,5 @@
-! Copy of data-4.f90 with self exchanged with host for !acc update.
+! Copy of data-4.f90 with self exchanged with host for !acc update, and with
+! default (present) clauses added.
 
 ! { dg-do run }
 
@@ -19,7 +20,7 @@ program asyncwait
 
   !$acc enter data copyin (a(1:N)) copyin (b(1:N)) copyin (N) async
 
-  !$acc parallel async wait
+  !$acc parallel default (present) async wait
   !$acc loop
   do i = 1, N
      b(i) = a(i)
@@ -39,7 +40,7 @@ program asyncwait
 
   !$acc update device (a(1:N), b(1:N)) async (1)
 
-  !$acc parallel async (1) wait (1)
+  !$acc parallel default (present) async (1) wait (1)
   !$acc loop
   do i = 1, N
      b(i) = a(i)
@@ -62,19 +63,19 @@ program asyncwait
   !$acc enter data copyin (c(1:N), d(1:N)) async (1)
   !$acc update device (a(1:N), b(1:N)) async (1)
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      b(i) = (a(i) * a(i) * a(i)) / a(i)
   end do
   !$acc end parallel
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      c(i) = (a(i) * 4) / a(i)
   end do
   !$acc end parallel
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      d(i) = ((a(i) * a(i)  + a(i)) / a(i)) - a(i)
   end do
@@ -100,25 +101,25 @@ program asyncwait
   !$acc enter data copyin (e(1:N)) async (1)
   !$acc update device (a(1:N), b(1:N), c(1:N), d(1:N)) async (1)
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      b(i) = (a(i) * a(i) * a(i)) / a(i)
   end do
   !$acc end parallel
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      c(i) = (a(i) * 4) / a(i)
   end do
   !$acc end parallel
 
-  !$acc parallel async (1)
+  !$acc parallel default (present) async (1)
   do i = 1, N
      d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
   end do
   !$acc end parallel
 
-  !$acc parallel wait (1) async (1)
+  !$acc parallel default (present) wait (1) async (1)
   do i = 1, N
      e(i) = a(i) + b(i) + c(i) + d(i)
   end do
index 10590892458bc22f5349340f83f5ef6e5ee8866b..d8ceb60b4930fa60dac9a136297ee788cf1f74bb 100644 (file)
@@ -51,4 +51,14 @@ program main
 
   if (a .ne. 7.0) call abort
 
+  ! The default (present) clause doesn't affect scalar variables; these will
+  ! still get an implicit copy clause added.
+  !$acc kernels default (present)
+    c = a
+    a = 1.0
+    a = a + c
+  !$acc end kernels
+
+  if (a .ne. 8.0) call abort
+
 end program main
index 94e4228e7a974bbe8dcd09320167025ac8344527..53b2cd060f27e7a911dca956c239c1e041c1125e 100644 (file)
@@ -1,5 +1,6 @@
 ! Ensure that a non-scalar dummy arguments which are implicitly used inside
-! offloaded regions are properly mapped using present_or_copy.
+! offloaded regions are properly mapped using present_or_copy, or (default)
+! present.
 
 ! { dg-do run }
 
@@ -12,6 +13,7 @@ program main
   n = size
 
   !$acc data copy(array)
+
   call kernels(array, n)
 
   !$acc update host(array)
@@ -20,12 +22,29 @@ program main
      if (array(i) .ne. i) call abort
   end do
 
+  call kernels_default_present(array, n)
+
+  !$acc update host(array)
+
+  do i = 1, n
+     if (array(i) .ne. i+1) call abort
+  end do
+
   call parallel(array, n)
-  !$acc end data
+
+  !$acc update host(array)
 
   do i = 1, n
      if (array(i) .ne. i+i) call abort
   end do
+
+  call parallel_default_present(array, n)
+
+  !$acc end data
+
+  do i = 1, n
+     if (array(i) .ne. i+i+1) call abort
+  end do
 end program main
 
 subroutine kernels (array, n)
@@ -39,6 +58,16 @@ subroutine kernels (array, n)
   !$acc end kernels
 end subroutine kernels
 
+subroutine kernels_default_present (array, n)
+  integer, dimension (n) :: array
+  integer :: n, i
+
+  !$acc kernels default(present)
+  do i = 1, n
+     array(i) = i+1
+  end do
+  !$acc end kernels
+end subroutine kernels_default_present
 
 subroutine parallel (array, n)
   integer, dimension (n) :: array
@@ -50,3 +79,14 @@ subroutine parallel (array, n)
   end do
   !$acc end parallel
 end subroutine parallel
+
+subroutine parallel_default_present (array, n)
+  integer, dimension (n) :: array
+  integer :: n, i
+
+  !$acc parallel default(present)
+  do i = 1, n
+     array(i) = i+i+1
+  end do
+  !$acc end parallel
+end subroutine parallel_default_present