This patch unifies and simplifies the handling of OpenACC default mapping clauses for parallel, serial, and kernels regions.

OK for openacc-gcc-8-branch?

Thanks,
Gergö


    gcc/
    * gimplify.c (oacc_default_clause): Refactor and unify computation of
    default mapping clauses.
>From 32a38daf2084bb266aa3a0c61c9176098d2d4bdb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gerg=C3=B6=20Barany?= <ge...@codesourcery.com>
Date: Mon, 21 Jan 2019 03:01:02 -0800
Subject: [PATCH] Rework computation of default OpenACC mapping clauses

    gcc/
    * gimplify.c (oacc_default_clause): Refactor and unify computation of
    default mapping clauses.
---
 gcc/ChangeLog.openacc |  5 ++++
 gcc/gimplify.c        | 75 +++++++++++++++++++++++++--------------------------
 2 files changed, 41 insertions(+), 39 deletions(-)

diff --git a/gcc/ChangeLog.openacc b/gcc/ChangeLog.openacc
index 22cdb5b..932fb37 100644
--- a/gcc/ChangeLog.openacc
+++ b/gcc/ChangeLog.openacc
@@ -1,3 +1,8 @@
+2019-01-24  Gergö Barany  <ge...@codesourcery.com>
+
+	* gimplify.c (oacc_default_clause): Refactor and unify computation of
+	default mapping clauses.
+
 2019-01-09  Julian Brown  <jul...@codesourcery.com>
 
 	* doc/invoke.texi: Update mention of OpenACC version to 2.6.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index a60e395..a6a4d2a 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -7191,58 +7191,55 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
       flags |= GOVD_MAP_TO_ONLY;
     }
 
+  unsigned private_mapping_flag = 0;
+  unsigned default_scalar_flags = 0;
+  /* Aggregates default to 'present_or_copy', or 'present'.  */
+  unsigned aggregate_flags
+    = (ctx->default_kind != OMP_CLAUSE_DEFAULT_PRESENT
+        ? GOVD_MAP
+        : GOVD_MAP | GOVD_MAP_FORCE_PRESENT);
+
   switch (ctx->region_type)
     {
     case ORT_ACC_KERNELS:
       rkind = "kernels";
-
-      if (is_private)
-	flags |= GOVD_MAP;
-      else if (AGGREGATE_TYPE_P (type))
-	{
-	  /* 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;
-
+      /* Scalars default to 'copy'.  */
+      default_scalar_flags = GOVD_MAP | GOVD_MAP_FORCE;
+      /* There are no private mappings on kernels regions.  */
+      gcc_assert (!is_private);
       break;
-
     case ORT_ACC_PARALLEL:
+      rkind = "parallel";
+      /* Scalars default to 'firstprivate'.  */
+      default_scalar_flags = GOVD_FIRSTPRIVATE;
+      private_mapping_flag = GOVD_FIRSTPRIVATE;
+      break;
     case ORT_ACC_SERIAL:
-      rkind = ctx->region_type == ORT_ACC_PARALLEL ? "parallel" : "serial";
-
-      if (TREE_CODE (type) == REFERENCE_TYPE
-	  && TREE_CODE (TREE_TYPE (type)) == POINTER_TYPE)
-	flags |= GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
-      else if (!lang_GNU_Fortran () && TREE_CODE (type) == POINTER_TYPE)
-	flags |= GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
-      else if (is_private)
-	flags |= GOVD_FIRSTPRIVATE;
-      else if (on_device || declared)
-	flags |= GOVD_MAP;
-      else if (AGGREGATE_TYPE_P (type))
-	{
-	  /* 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;
-
+      rkind = "serial";
+      /* Scalars default to 'firstprivate'.  */
+      default_scalar_flags = GOVD_FIRSTPRIVATE;
+      private_mapping_flag = GOVD_FIRSTPRIVATE;
       break;
 
     default:
       gcc_unreachable ();
     }
 
+  if (TREE_CODE (type) == REFERENCE_TYPE
+      && TREE_CODE (TREE_TYPE (type)) == POINTER_TYPE)
+    flags |= GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
+  else if (!lang_GNU_Fortran () && TREE_CODE (type) == POINTER_TYPE)
+    flags |= GOVD_MAP | GOVD_MAP_0LEN_ARRAY;
+  else if (is_private)
+    flags |= private_mapping_flag;
+  else if (on_device || declared)
+    flags |= GOVD_MAP;
+  else if (AGGREGATE_TYPE_P (type))
+    flags |= aggregate_flags;
+  else
+    /* This is a scalar getting the default mapping.  */
+    flags |= default_scalar_flags;
+
   if (DECL_ARTIFICIAL (decl))
     ; /* We can get compiler-generated decls, and should not complain
 	 about them.  */
-- 
2.8.1

Reply via email to