openacc: GOMP_MAP_ATTACH handling in find_group_last
authorJulian Brown <julian@codesourcery.com>
Thu, 11 Jun 2020 13:43:59 +0000 (06:43 -0700)
committerJulian Brown <julian@codesourcery.com>
Thu, 9 Jul 2020 21:16:00 +0000 (14:16 -0700)
Arrange for GOMP_MAP_ATTACH to be grouped together with a preceding
GOMP_MAP_TO_PSET or other "to" data movement clause, except in cases
where an explicit "attach" clause is used.

2020-07-09  Julian Brown  <julian@codesourcery.com>

include/
* gomp-constants.h (gomp_map_kind): Update comment for GOMP_MAP_TO_PSET.

libgomp/
* oacc-mem.c (find_group_last): Group data-movement clauses
(GOMP_MAP_TO_PSET, GOMP_MAP_TO, etc.) together with a subsequent
GOMP_MAP_ATTACH.  Allow standalone GOMP_MAP_ATTACH also.

include/gomp-constants.h
libgomp/oacc-mem.c

index 1587e4d2ba2729b79df6a5b4aeb94f84a15c3b43..b42b41403aa634a8cd0dcf9aeceea3600a2a45b4 100644 (file)
@@ -65,7 +65,10 @@ enum gomp_map_kind
     /* Also internal, behaves like GOMP_MAP_TO, but additionally any
        GOMP_MAP_POINTER records consecutive after it which have addresses
        falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't
-       mapped already.  */
+       mapped already.
+       For OpenACC attach operations (e.g. copyin of struct members),
+       GOMP_MAP_TO_PSET is followed by a single GOMP_MAP_ATTACH mapping
+       instead.  */
     GOMP_MAP_TO_PSET =                 (GOMP_MAP_FLAG_SPECIAL_0 | 1),
     /* Must already be present.  */
     GOMP_MAP_FORCE_PRESENT =           (GOMP_MAP_FLAG_SPECIAL_0 | 2),
index 4fb78ee963487c5a1b642c03fd32daa723490a71..247ca1358043640d5e7e4303a76e2004bd1ff429 100644 (file)
@@ -985,9 +985,15 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
   switch (kind0)
     {
     case GOMP_MAP_TO_PSET:
-      while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
+      if (pos + 1 < mapnum
+         && (kinds[pos + 1] & 0xff) == GOMP_MAP_ATTACH)
+       return pos + 1;
+
+      while (pos + 1 < mapnum
+            && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
        pos++;
-      /* We expect at least one GOMP_MAP_POINTER after a GOMP_MAP_TO_PSET.  */
+      /* We expect at least one GOMP_MAP_POINTER (if not a single
+        GOMP_MAP_ATTACH) after a GOMP_MAP_TO_PSET.  */
       assert (pos > first_pos);
       break;
 
@@ -1002,6 +1008,9 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
       gomp_fatal ("unexpected mapping");
       break;
 
+    case GOMP_MAP_ATTACH:
+      break;
+
     default:
       /* GOMP_MAP_ALWAYS_POINTER can only appear directly after some other
         mapping.  */
@@ -1012,9 +1021,16 @@ find_group_last (int pos, size_t mapnum, size_t *sizes, unsigned short *kinds)
            return pos + 1;
        }
 
+      /* We can have a single GOMP_MAP_ATTACH mapping after a to/from
+        mapping.  */
+      if (pos + 1 < mapnum
+         && (kinds[pos + 1] & 0xff) == GOMP_MAP_ATTACH)
+       return pos + 1;
+
       /* We can have zero or more GOMP_MAP_POINTER mappings after a to/from
         (etc.) mapping.  */
-      while (pos + 1 < mapnum && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
+      while (pos + 1 < mapnum
+            && (kinds[pos + 1] & 0xff) == GOMP_MAP_POINTER)
        pos++;
     }