aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-09-28 11:38:03 +0200
committerJakub Jelinek <jakub@redhat.com>2021-09-28 11:38:03 +0200
commit4f07769057c45ec9e751ab1c23e0fe4750102840 (patch)
tree072fdbebc9cbf4b5dd17cd5630569e6504cf6b07
parentfb8b72ebb5b0bf40f7dfef9154c42320ce46f2a7 (diff)
downloadgcc-4f07769057c45ec9e751ab1c23e0fe4750102840.zip
gcc-4f07769057c45ec9e751ab1c23e0fe4750102840.tar.gz
gcc-4f07769057c45ec9e751ab1c23e0fe4750102840.tar.bz2
openmp: Don't call omp_finish_clause on implicitly added private clauses on simd [PR102492]
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.
-rw-r--r--gcc/gimplify.c8
-rw-r--r--gcc/testsuite/g++.dg/gomp/simd-3.C16
2 files changed, 22 insertions, 2 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 943c5cb..1067113 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -10917,8 +10917,12 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
*list_p = clause;
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
gimplify_omp_ctxp = ctx->outer_context;
- 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);
if (gimplify_omp_ctxp)
for (; clause != chain; clause = OMP_CLAUSE_CHAIN (clause))
if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
diff --git a/gcc/testsuite/g++.dg/gomp/simd-3.C b/gcc/testsuite/g++.dg/gomp/simd-3.C
new file mode 100644
index 0000000..db66c08
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/simd-3.C
@@ -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);
+ }
+}