aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/omp-low.c41
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c8
-rw-r--r--gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c8
5 files changed, 55 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ea4e2d5..5c23836 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-05 Tom de Vries <tom@codesourcery.com>
+
+ * omp-low.c (check_omp_nesting_restrictions): Check for non-oacc
+ construct in oacc routine. Check for oacc region in oacc routine.
+
2016-03-04 Jakub Jelinek <jakub@redhat.com>
PR target/70062
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index ecbf74a..c69fe44 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -3236,19 +3236,26 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
/* No nesting of non-OpenACC STMT (that is, an OpenMP one, or a GOMP builtin)
inside an OpenACC CTX. */
if (!(is_gimple_omp (stmt)
- && is_gimple_omp_oacc (stmt)))
- {
- for (omp_context *octx = ctx; octx != NULL; octx = octx->outer)
- if (is_gimple_omp (octx->stmt)
- && is_gimple_omp_oacc (octx->stmt)
- /* Except for atomic codes that we share with OpenMP. */
- && ! (gimple_code (stmt) == GIMPLE_OMP_ATOMIC_LOAD
- || gimple_code (stmt) == GIMPLE_OMP_ATOMIC_STORE))
- {
- error_at (gimple_location (stmt),
- "non-OpenACC construct inside of OpenACC region");
- return false;
- }
+ && is_gimple_omp_oacc (stmt))
+ /* Except for atomic codes that we share with OpenMP. */
+ && !(gimple_code (stmt) == GIMPLE_OMP_ATOMIC_LOAD
+ || gimple_code (stmt) == GIMPLE_OMP_ATOMIC_STORE))
+ {
+ if (get_oacc_fn_attrib (cfun->decl) != NULL)
+ {
+ error_at (gimple_location (stmt),
+ "non-OpenACC construct inside of OpenACC routine");
+ return false;
+ }
+ else
+ for (omp_context *octx = ctx; octx != NULL; octx = octx->outer)
+ if (is_gimple_omp (octx->stmt)
+ && is_gimple_omp_oacc (octx->stmt))
+ {
+ error_at (gimple_location (stmt),
+ "non-OpenACC construct inside of OpenACC region");
+ return false;
+ }
}
if (ctx != NULL)
@@ -3715,6 +3722,14 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
kind == OMP_CLAUSE_DEPEND_SOURCE ? "source" : "sink");
return false;
}
+ if (is_gimple_omp_offloaded (stmt)
+ && get_oacc_fn_attrib (cfun->decl) != NULL)
+ {
+ error_at (gimple_location (stmt),
+ "OpenACC region inside of OpenACC routine, nested "
+ "parallelism not supported yet");
+ return false;
+ }
for (; ctx != NULL; ctx = ctx->outer)
{
if (gimple_code (ctx->stmt) != GIMPLE_OMP_TARGET)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ca65abf..51469ea 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-05 Tom de Vries <tom@codesourcery.com>
+
+ * c-c++-common/goacc/nesting-fail-1.c (f_acc_routine): New function.
+ * c-c++-common/goacc-gomp/nesting-fail-1.c (f_acc_routine): New
+ function.
+
2016-03-05 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/66786
diff --git a/gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c b/gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
index 1a44721..5e3f183 100644
--- a/gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
+++ b/gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
@@ -439,3 +439,11 @@ f_acc_loop (void)
#pragma omp target update to(i) /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
}
}
+
+#pragma acc routine
+void
+f_acc_routine (void)
+{
+#pragma omp target /* { dg-error "non-OpenACC construct inside of OpenACC routine" } */
+ ;
+}
diff --git a/gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c b/gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
index 7a36074..506a1ae 100644
--- a/gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
+++ b/gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c
@@ -37,3 +37,11 @@ f_acc_kernels (void)
#pragma acc exit data delete(i) /* { dg-error ".enter/exit data. construct inside of .kernels. region" } */
}
}
+
+#pragma acc routine
+void
+f_acc_routine (void)
+{
+#pragma acc parallel /* { dg-error "OpenACC region inside of OpenACC routine, nested parallelism not supported yet" } */
+ ;
+}