As flagged by Thomas, the GOMP_MAP_STRUCT mapping is not itself necessary
for OpenACC "exit data" directives, and is skipped over (now) in libgomp.
We might as well not emit it to start with, in line with the equivalent
OpenMP directive. We can keep the "no-op" handling in libgomp for the
reason of backward compatibility.

I've added a new scan test for the new behaviour. OK?

Julian

        gcc/
        * gimplify.c (gimplify_adjust_omp_clauses): Remove GOMP_MAP_STRUCT
        mapping from OpenACC exit data directives.
---
 gcc/gimplify.c                                |  3 +-
 .../goacc/struct-enter-exit-data-1.c          | 35 +++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/c-c++-common/goacc/struct-enter-exit-data-1.c

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index cb08b26dc65..e14932fafaf 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -10396,7 +10396,8 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, 
gimple_seq body, tree *list_p,
                }
            }
          else if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_STRUCT
-                  && code == OMP_TARGET_EXIT_DATA)
+                  && (code == OMP_TARGET_EXIT_DATA
+                      || code == OACC_EXIT_DATA))
            remove = true;
          else if (DECL_SIZE (decl)
                   && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST
diff --git a/gcc/testsuite/c-c++-common/goacc/struct-enter-exit-data-1.c 
b/gcc/testsuite/c-c++-common/goacc/struct-enter-exit-data-1.c
new file mode 100644
index 00000000000..4be5674b23e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/goacc/struct-enter-exit-data-1.c
@@ -0,0 +1,35 @@
+/* Check that extraneous GOMP_MAP_STRUCTs are removed from OpenACC exit data
+   directives.  */
+
+/* { dg-additional-options "-fdump-tree-omplower" } */
+
+#include <stdlib.h>
+
+struct str {
+  int a;
+  int *b;
+  int *c;
+  int d;
+};
+
+#define N 1024
+
+int
+main (int argc, char *argv[])
+{
+  struct str s;
+
+  s.b = (int *) malloc (sizeof (int) * N);
+  s.c = (int *) malloc (sizeof (int) * N);
+
+  #pragma acc enter data copyin(s.a, s.b[0:N], s.c[0:N], s.d)
+  /* { dg-final { scan-tree-dump {(?n)#pragma omp target oacc_enter_exit_data 
map\(struct:s \[len: 4\]\) map\(to:s.a \[len: [0-9]+\]\) map\(alloc:s.b \[len: 
[0-9]+\]\) map\(alloc:s.c \[len: [0-9]+\]\) map\(to:s.d \[len: [0-9]+\]\) 
map\(to:\*[_0-9]+ \[len: [0-9]+\]\) map\(attach:s.b \[bias: 0\]\) 
map\(to:\*[_0-9]+ \[len: [0-9]+\]\) map\(attach:s.c \[bias: 0\]\)} omplower } } 
*/
+
+  #pragma acc exit data copyout(s.a, s.b[0:N], s.c[0:N], s.d)
+  /* { dg-final { scan-tree-dump {(?n)#pragma omp target oacc_enter_exit_data 
map\(from:s.a \[len: [0-9]+\]\) map\(release:s.b \[len: [0-9]+\]\) 
map\(release:s.c \[len: [0-9]+\]\) map\(from:s.d \[len: [0-9]+\]\) 
map\(from:\*[_0-9]+ \[len: [0-9]+\]\) map\(detach:s.b \[bias: 0\]\) 
map\(from:\*[_0-9]+ \[len: [0-9]+\]\) map\(detach:s.c \[bias: 0\]\)} omplower } 
} */
+
+  free (s.b);
+  free (s.c);
+
+  return 0;
+}
-- 
2.23.0

Reply via email to