Hi! Applied in r208701 to gomp-4_0-branch:
commit 22dd36a31c433dcd8bcc890d245a9e4ac6ed9c7f
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu Mar 20 14:33:28 2014 +0000
Nesting of OpenACC constructs inside of OpenACC data constructs.
gcc/
* omp-low.c (check_omp_nesting_restrictions): Allow nesting of
OpenACC constructs inside of OpenACC data constructs.
gcc/testsuite/
* c-c++-common/goacc/nesting-1.c: New file.
* c-c++-common/goacc/nesting-data-1.c: Likewise.
* c-c++-common/goacc/nesting-fail-1.c: Update.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@208701
138bc75d-0d04-0410-961f-82ee72b054a4
diff --git gcc/ChangeLog.gomp gcc/ChangeLog.gomp
index 1aebc4d..f43452c 100644
--- gcc/ChangeLog.gomp
+++ gcc/ChangeLog.gomp
@@ -1,3 +1,8 @@
+2014-03-20 Thomas Schwinge <[email protected]>
+
+ * omp-low.c (check_omp_nesting_restrictions): Allow nesting of
+ OpenACC constructs inside of OpenACC data constructs.
+
2014-03-18 Ilmir Usmanov <[email protected]>
* tree.def (OACC_LOOP): New tree code.
diff --git gcc/omp-low.c gcc/omp-low.c
index f1b0fa5..23a0dda 100644
--- gcc/omp-low.c
+++ gcc/omp-low.c
@@ -2416,26 +2416,31 @@ scan_omp_teams (gimple stmt, omp_context *outer_ctx)
static bool
check_omp_nesting_restrictions (gimple stmt, omp_context *ctx)
{
- omp_context *ctx_;
-
/* TODO: While the OpenACC specification does allow for certain kinds of
- nesting, we don't support that yet. */
- /* No nesting of STMT (which is an OpenACC or OpenMP one, or a GOMP builtin)
- inside any OpenACC CTX. */
- for (ctx_ = ctx; ctx_ != NULL; ctx_ = ctx_->outer)
- if (is_gimple_omp (ctx_->stmt)
- && is_gimple_omp_oacc_specifically (ctx_->stmt))
- {
- error_at (gimple_location (stmt),
- "may not be nested");
- return false;
- }
- /* No nesting of OpenACC STMT inside any OpenACC or OpenMP CTX. */
+ nesting, we don't support many of these yet. */
if (is_gimple_omp (stmt)
&& is_gimple_omp_oacc_specifically (stmt))
{
- for (ctx_ = ctx; ctx_ != NULL; ctx_ = ctx_->outer)
- if (is_gimple_omp (ctx_->stmt))
+ /* No nesting of OpenACC STMT inside any OpenACC or OpenMP CTX different
+ from an OpenACC data construct. */
+ for (omp_context *ctx_ = ctx; ctx_ != NULL; ctx_ = ctx_->outer)
+ if (is_gimple_omp (ctx_->stmt)
+ && !(gimple_code (ctx_->stmt) == GIMPLE_OMP_TARGET
+ && (gimple_omp_target_kind (ctx_->stmt)
+ == GF_OMP_TARGET_KIND_OACC_DATA)))
+ {
+ error_at (gimple_location (stmt),
+ "may not be nested");
+ return false;
+ }
+ }
+ else
+ {
+ /* No nesting of non-OpenACC STMT (that is, an OpenMP one, or a GOMP
+ builtin) inside any OpenACC CTX. */
+ for (omp_context *ctx_ = ctx; ctx_ != NULL; ctx_ = ctx_->outer)
+ if (is_gimple_omp (ctx_->stmt)
+ && is_gimple_omp_oacc_specifically (ctx_->stmt))
{
error_at (gimple_location (stmt),
"may not be nested");
diff --git gcc/testsuite/ChangeLog.gomp gcc/testsuite/ChangeLog.gomp
index fd38d80..13e99d5 100644
--- gcc/testsuite/ChangeLog.gomp
+++ gcc/testsuite/ChangeLog.gomp
@@ -1,5 +1,9 @@
2014-03-20 Thomas Schwinge <[email protected]>
+ * c-c++-common/goacc/nesting-1.c: New file.
+ * c-c++-common/goacc/nesting-data-1.c: Likewise.
+ * c-c++-common/goacc/nesting-fail-1.c: Update.
+
* c-c++-common/goacc/nesting-fail-1.c (f_acc_kernels): Replace
OpenACC parallel with kernels directive.
diff --git gcc/testsuite/c-c++-common/goacc/nesting-1.c
gcc/testsuite/c-c++-common/goacc/nesting-1.c
new file mode 100644
index 0000000..3a22292
--- /dev/null
+++ gcc/testsuite/c-c++-common/goacc/nesting-1.c
@@ -0,0 +1,13 @@
+void
+f_acc_data (void)
+{
+#pragma acc data
+ {
+#pragma acc parallel
+ ;
+#pragma acc kernels
+ ;
+#pragma acc data
+ ;
+ }
+}
diff --git gcc/testsuite/c-c++-common/goacc/nesting-data-1.c
gcc/testsuite/c-c++-common/goacc/nesting-data-1.c
new file mode 100644
index 0000000..fefe6cd
--- /dev/null
+++ gcc/testsuite/c-c++-common/goacc/nesting-data-1.c
@@ -0,0 +1,61 @@
+void
+f (void)
+{
+ unsigned char c, ca[15], caa[20][30];
+
+#pragma acc data copyin(c)
+ {
+ c = 5;
+ ca[3] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+
+#pragma acc data copyin(ca[2:4])
+ {
+ c = 6;
+ ca[4] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+
+#pragma acc parallel copyout(ca[3:4])
+ {
+ c = 7;
+ ca[5] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+
+#pragma acc kernels copy(ca[4:4])
+ {
+ c = 8;
+ ca[6] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+
+#pragma acc data pcopy(ca[5:7])
+ {
+ c = 15;
+ ca[7] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+
+#pragma acc data pcopyin(caa[3:7][0:30])
+ {
+ c = 16;
+ ca[8] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+
+#pragma acc parallel pcopyout(caa[3:7][0:30])
+ {
+ c = 17;
+ ca[9] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+
+#pragma acc kernels pcopy(caa[3:7][0:30])
+ {
+ c = 18;
+ ca[10] = c;
+ caa[3][12] = ca[3] + caa[3][12];
+ }
+ }
+ }
+}
diff --git gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
index ca8921f..00dc602 100644
--- gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
+++ gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
@@ -1,5 +1,5 @@
/* TODO: While the OpenACC specification does allow for certain kinds of
- nesting, we don't support that yet. */
+ nesting, we don't support many of these yet. */
void
f_acc_parallel (void)
{
@@ -15,7 +15,7 @@ f_acc_parallel (void)
}
/* TODO: While the OpenACC specification does allow for certain kinds of
- nesting, we don't support that yet. */
+ nesting, we don't support many of these yet. */
void
f_acc_kernels (void)
{
@@ -29,19 +29,3 @@ f_acc_kernels (void)
;
}
}
-
-/* TODO: While the OpenACC specification does allow for certain kinds of
- nesting, we don't support that yet. */
-void
-f_acc_data (void)
-{
-#pragma acc data
- {
-#pragma acc parallel /* { dg-error "may not be nested" } */
- ;
-#pragma acc kernels /* { dg-error "may not be nested" } */
- ;
-#pragma acc data /* { dg-error "may not be nested" } */
- ;
- }
-}
Grüße,
Thomas
pgp9sHUE0nQyV.pgp
Description: PGP signature
