omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop nesting.
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 21 Oct 2015 16:14:01 +0000 (16:14 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 21 Oct 2015 16:14:01 +0000 (16:14 +0000)
gcc/
* omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop
nesting.

testsuite/
* c-c++-common/goacc/clauses-fail.c: Adjust errors.
* c-c++-common/goacc/sb-1.c: Adjust errors.
* c-c++-common/goacc/sb-3.c: Adjust errors.
* c-c++-common/goacc/loop-1.c: Adjust errors.
* c-c++-common/goacc/nesting-1.c: Adjust errors.
* c-c++-common/goacc-gomp/nesting-fail-1.c: Adjust errors.
* c-c++-common/goacc-gomp/nesting-1.c: Adjust errors.

From-SVN: r229129

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc-gomp/nesting-1.c
gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c
gcc/testsuite/c-c++-common/goacc/clauses-fail.c
gcc/testsuite/c-c++-common/goacc/loop-1.c
gcc/testsuite/c-c++-common/goacc/nesting-1.c
gcc/testsuite/c-c++-common/goacc/sb-1.c
gcc/testsuite/c-c++-common/goacc/sb-3.c

index d5296ae5db451a8a1ed9adcc676bb47652e11b94..21164b13ca3073c3eceba52f9b8bbe86184b4ee4 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-21  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * omp-low.c (check_omp_nesting_restrictions): Check OpenACC loop
+       nesting.
+
 2015-10-21  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        * doc/tm.texi: Regenerated.
index b71609b76a4598830d7d9889d463a3289d6d8a6e..ad7c017affbb51d65f44c642fd129ea79c14afa6 100644 (file)
@@ -3178,6 +3178,43 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
       /* We split taskloop into task and nested taskloop in it.  */
       if (gimple_omp_for_kind (stmt) == GF_OMP_FOR_KIND_TASKLOOP)
        return true;
+      if (gimple_omp_for_kind (stmt) == GF_OMP_FOR_KIND_OACC_LOOP)
+       {
+         bool ok = false;
+         
+         if (ctx)
+           switch (gimple_code (ctx->stmt))
+             {
+             case GIMPLE_OMP_FOR:
+               ok = (gimple_omp_for_kind (ctx->stmt)
+                     == GF_OMP_FOR_KIND_OACC_LOOP);
+               break;
+
+             case GIMPLE_OMP_TARGET:
+               switch (gimple_omp_target_kind (ctx->stmt))
+                 {
+                 case GF_OMP_TARGET_KIND_OACC_PARALLEL:
+                 case GF_OMP_TARGET_KIND_OACC_KERNELS:
+                   ok = true;
+                   break;
+
+                 default:
+                   break;
+                 }
+
+             default:
+               break;
+             }
+         else if (get_oacc_fn_attrib (current_function_decl))
+           ok = true;
+         if (!ok)
+           {
+             error_at (gimple_location (stmt),
+                       "OpenACC loop directive must be associated with"
+                       " an OpenACC compute region");
+             return false;
+           }
+       }
       /* FALLTHRU */
     case GIMPLE_CALL:
       if (is_gimple_call (stmt)
index 3f325b9ad3c8ef08f03c131461c21df284d5dc22..db0f89665a29c0ed8cd0c730e58508ec8c3d956e 100644 (file)
@@ -1,3 +1,13 @@
+2015-10-21  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * c-c++-common/goacc/clauses-fail.c: Adjust errors.
+       * c-c++-common/goacc/sb-1.c: Adjust errors.
+       * c-c++-common/goacc/sb-3.c: Adjust errors.
+       * c-c++-common/goacc/loop-1.c: Adjust errors.
+       * c-c++-common/goacc/nesting-1.c: Adjust errors.
+       * c-c++-common/goacc-gomp/nesting-fail-1.c: Adjust errors.
+       * c-c++-common/goacc-gomp/nesting-1.c: Adjust errors.
+
 2015-10-21  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        * g++.dg/ext/vector22.C: Allow VEC_COND_EXPR.
index df45bcf05fcb373f3eeea5dff68335eb72ecd150..1c17818e41514eb6aa1819b4b6975d66b28b88fd 100644 (file)
@@ -5,7 +5,7 @@ f_omp_parallel (void)
   {
     int i;
 
-#pragma acc loop
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
index ac614e7d646f61f109a9f7bec93cad11af668c88..0c8ea54d53d3a50c8d6f30333e81e0ff340dcd0b 100644 (file)
@@ -28,7 +28,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
       for (i = 0; i < 2; ++i)
        ;
     }
@@ -63,7 +63,7 @@ f_omp (void)
     }
 #pragma omp section
     {
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
       for (i = 0; i < 2; ++i)
        ;
     }
@@ -80,7 +80,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -96,7 +96,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -112,7 +112,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -128,7 +128,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -144,7 +144,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC construct inside of non-OpenACC region" } */
-#pragma acc loop /* { dg-error "may not be closely nested" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -160,7 +160,7 @@ f_omp (void)
 #pragma acc update host(i) /* { dg-error "OpenACC update construct inside of OpenMP target region" } */
 #pragma acc enter data copyin(i) /* { dg-error "OpenACC enter/exit data construct inside of OpenMP target region" } */
 #pragma acc exit data delete(i) /* { dg-error "OpenACC enter/exit data construct inside of OpenMP target region" } */
-#pragma acc loop
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
   }
@@ -379,6 +379,7 @@ f_acc_data (void)
 void
 f_acc_loop (void)
 {
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -386,6 +387,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -394,6 +396,7 @@ f_acc_loop (void)
        ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -403,6 +406,7 @@ f_acc_loop (void)
       }
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -410,6 +414,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -417,6 +422,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -424,6 +430,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -431,6 +438,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -438,6 +446,7 @@ f_acc_loop (void)
       i = 0; /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
@@ -445,6 +454,7 @@ f_acc_loop (void)
       ;
     }
 
+#pragma acc parallel
 #pragma acc loop
   for (i = 0; i < 2; ++i)
     {
index 899018026d31b05a96af9fee7b10a71aabe7da65..661d364f06642436bf6f931bb72da7e1d0451749 100644 (file)
@@ -12,6 +12,7 @@ f (void)
 #pragma acc data two /* { dg-error "expected '#pragma acc' clause before 'two'" } */
   ;
 
+#pragma acc parallel
 #pragma acc loop deux /* { dg-error "expected '#pragma acc' clause before 'deux'" } */
   for (i = 0; i < 2; ++i)
     ;
index fea40e0ab61cb94b9e20c6bcdbebcd192ed16ece..2d8f4d5a8d3147d962bc60264c13c02911ecb0e2 100644 (file)
@@ -38,16 +38,16 @@ int test1()
       i = d;
       a[i] = 1;
     }
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
   for (i = 1; i < 30; i++ )
     if (i == 16) break; /* { dg-error "break statement used" } */
 
 /* different types of for loop are allowed */
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
   for (i = 1; i < 10; i++)
     {
     }
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
   for (i = 1; i < 10; i+=2)
     {
       a[i] = i;
index b4b863fb86073410203662b7263d3d71b7efa078..3a8f838906c6221c36c0d3e49f2766a2e1c2543a 100644 (file)
@@ -58,7 +58,7 @@ f_acc_data (void)
 
 #pragma acc exit data delete(i)
 
-#pragma acc loop
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (i = 0; i < 2; ++i)
       ;
 
@@ -93,7 +93,7 @@ f_acc_data (void)
 
 #pragma acc exit data delete(i)
 
-#pragma acc loop
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
       for (i = 0; i < 2; ++i)
        ;
     }
index 5e55c9516f21928e5176f7bcaeefd7ad41a1a58d..1ce41df0c0969a33a4d4a69b5483ef58d132f6c2 100644 (file)
@@ -11,7 +11,7 @@ void foo()
     goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
   #pragma acc data
     goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (l = 0; l < 2; ++l)
       goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
 
@@ -34,7 +34,7 @@ void foo()
     }
 
   goto bad2_loop; // { dg-error "invalid entry to OpenACC structured block" }
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
   for (l = 0; l < 2; ++l)
     {
       bad2_loop: ;
@@ -64,7 +64,7 @@ void foo()
        { ok1_data: break; }
     }
 
-  #pragma acc loop
+  #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
     for (l = 0; l < 2; ++l)
       {
        int i;
index 147b7b0e8455bd1cc37aa33cebde8d60d9ca9d72..620498ecd629fd6101de9703f5a8e12ec4278199 100644 (file)
@@ -3,11 +3,11 @@
 void f (void)
 {
   int i, j;
-#pragma acc loop
+#pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */
   for(i = 1; i < 30; i++)
     {
       if (i == 7) goto out; // { dg-error "invalid branch to/from OpenACC structured block" }
-#pragma acc loop // { dg-error "work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region" }
+#pragma acc loop
       for(j = 5; j < 10; j++)
        {
          if (i == 6 && j == 7) goto out; // { dg-error "invalid branch to/from OpenACC structured block" }