]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: Don't call omp_finish_clause on implicitly added private clauses on simd...
authorJakub Jelinek <jakub@redhat.com>
Tue, 28 Sep 2021 09:58:47 +0000 (11:58 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Tue, 28 Sep 2021 10:04:12 +0000 (12:04 +0200)
The gimplifier adds implicit private clauses on SIMD constructs for local
variables in the SIMD body if they are addressable to make sure they use
the magic arrays with "omp simd array" attribute (such that each SIMD lane
has its own copy), but we actually don't need to default privatize etc. those,
the construction for them is done in the SIMD body and so is destruction.
omp_finish_clause for C++ now requires default constructor (and dtor) for private,
so that OpenMP 5.1 default(private) works, but that will never be needed on
SIMD.  So, this patch just doesn't call omp_finish_clause for private on simd.
The C and Fortran langhooks don't do anything for private.

2021-09-28  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/102492
* gimplify.c (gimplify_adjust_omp_clauses_1): Don't call the
omp_finish_clause langhook on implicitly added OMP_CLAUSE_PRIVATE
clauses on SIMD constructs.

* g++.dg/gomp/simd-3.C: New test.

(cherry picked from commit 4f07769057c45ec9e751ab1c23e0fe4750102840)

gcc/ChangeLog.omp
gcc/gimplify.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/g++.dg/gomp/simd-3.C [new file with mode: 0644]

index 467bf8139ef1d0082478a6b79b016f0cb70d303b..e519764cd73d9aefe81b929ff70f5ef6ab719ae3 100644 (file)
@@ -1,3 +1,14 @@
+2021-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-09-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/102492
+       * gimplify.c (gimplify_adjust_omp_clauses_1): Don't call the
+       omp_finish_clause langhook on implicitly added OMP_CLAUSE_PRIVATE
+       clauses on SIMD constructs.
+       * g++.dg/gomp/simd-3.C: New test.
+
 2021-09-24  Marcel Vollweiler  <marcel@codesourcery.com>
 
        This patch removes the expectation that 'requires reverse_offload' is
index c25387ab657f78b3bd6509b87a37d6a9c07c277c..8a324f6081b88a13a070ecdfc78de7fadadfed71 100644 (file)
@@ -11626,8 +11626,12 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
   gimplify_omp_ctxp = ctx->outer_context;
   gomp_map_kind kind = (code == OMP_CLAUSE_MAP) ? OMP_CLAUSE_MAP_KIND (clause)
                                                : (gomp_map_kind) GOMP_MAP_LAST;
-  lang_hooks.decls.omp_finish_clause (clause, pre_p,
-                                     (ctx->region_type & ORT_ACC) != 0);
+  /* Don't call omp_finish_clause on implicitly added OMP_CLAUSE_PRIVATE
+     in simd.  Those are only added for the local vars inside of simd body
+     and they don't need to be e.g. default constructible.  */
+  if (code != OMP_CLAUSE_PRIVATE || ctx->region_type != ORT_SIMD) 
+    lang_hooks.decls.omp_finish_clause (clause, pre_p,
+                                       (ctx->region_type & ORT_ACC) != 0);
   /* Allow OpenACC to have implicit assumed-size arrays via FORCE_PRESENT,
      which should work as long as the array has previously been mapped
      explicitly on the target (e.g. by "enter data").  Raise an error for
index c8518c6261ecbb8fe5944a257e39d53aa688536e..fa93577b0ed396e8d6889e2df45717fc677de984 100644 (file)
@@ -1,3 +1,11 @@
+2021-09-28  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-09-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/102492
+       * g++.dg/gomp/simd-3.C: New test.
+
 2021-09-27  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
diff --git a/gcc/testsuite/g++.dg/gomp/simd-3.C b/gcc/testsuite/g++.dg/gomp/simd-3.C
new file mode 100644 (file)
index 0000000..db66c08
--- /dev/null
@@ -0,0 +1,16 @@
+// PR middle-end/102492
+// { dg-do compile }
+
+struct S { S (int); };
+void bar (S &);
+
+void
+foo ()
+{
+  #pragma omp simd
+  for (int i = 0; i < 64; i++)
+    {
+      S s = 26;
+      bar (s);
+    }
+}