]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Annotate inner loops in "acc kernels loop" directives (C/C++).
authorSandra Loosemore <sandra@codesourcery.com>
Thu, 20 Aug 2020 02:18:57 +0000 (19:18 -0700)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Thu, 22 Apr 2021 17:14:28 +0000 (10:14 -0700)
Normally explicit loop directives in a kernels region inhibit
automatic annotation of other loops in the same nest, on the theory
that users have indicated they want manual control over that section
of code.  However there seems to be an expectation in user code that
the combined "kernels loop" directive should still allow annotation of
inner loops.  This patch implements this behavior for C and C++.

2020-08-19  Sandra Loosemore  <sandra@codesourcery.com>

gcc/c-family/
* c-omp.c (annotate_loops_in_kernels_regions): Process inner
loops in combined "acc kernels loop" directives.

gcc/testsuite/
* c-c++-common/goacc/kernels-loop-annotation-18.c: New.
* c-c++-common/goacc/kernels-loop-annotation-19.c: New.
* c-c++-common/goacc/combined-directives.c: Adjust expected
patterns.

gcc/c-family/ChangeLog.omp
gcc/c-family/c-omp.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/c-c++-common/goacc/combined-directives.c
gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-18.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-19.c [new file with mode: 0644]

index 17247b205f829cf0a775dbcc1a35b69af450a822..90aa0e6a17d065fe5e274cf67be3804bf1286b94 100644 (file)
@@ -1,3 +1,10 @@
+2020-08-19  Sandra Loosemore  <sandra@codesourcery.com>
+
+       Annotate inner loops in "acc kernels loop" directives (C/C++).
+
+       * c-omp.c (annotate_loops_in_kernels_regions): Process inner
+       loops in combined "acc kernels loop" directives.
+
 2020-03-27  Sandra Loosemore  <sandra@codesourcery.com>
 
        * c-common.h (c_oacc_annotate_loops_in_kernels_regions): Declare.
index ef01cdc83468cfc722d254353747c946be5e1a00..71875efff557524e49c36839a60077e0496e1530 100644 (file)
@@ -3249,18 +3249,30 @@ annotate_loops_in_kernels_regions (tree *nodeptr, int *walk_subtrees,
       /* Do not try to add automatic OpenACC annotations inside manually
         annotated loops.  Presumably, the user avoided doing it on
         purpose; for example, all available levels of parallelism may
-        have been used up.  */
-      {
-       struct annotation_info nested_info
-         = { NULL_TREE, NULL_TREE, false, as_explicit_annotation,
-             node, info };
-       if (info->state >= as_in_kernels_region)
-         do_not_annotate_loop_nest (info, as_explicit_annotation,
-                                    node);
-       walk_tree (&OMP_BODY (node), annotate_loops_in_kernels_regions,
-                  (void *) &nested_info, NULL);
-       *walk_subtrees = 0;
-      }
+        have been used up.  However, assume that the combined construct
+        "#pragma acc kernels loop" means to try to process the whole
+        loop nest.
+        Note that a single OACC_LOOP construct represents an entire set
+        of collapsed loops so we do not have to deal explicitly with the
+        collapse clause here, as the Fortran front end does.  */
+      if (info->state == as_in_kernels_region && OACC_LOOP_COMBINED (node))
+       {
+         walk_tree (&OMP_BODY (node), annotate_loops_in_kernels_regions,
+                    (void *) info, NULL);
+         *walk_subtrees = 0;
+       }
+      else
+       {
+         struct annotation_info nested_info
+           = { NULL_TREE, NULL_TREE, false, as_explicit_annotation,
+               node, info };
+         if (info->state >= as_in_kernels_region)
+           do_not_annotate_loop_nest (info, as_explicit_annotation,
+                                      node);
+         walk_tree (&OMP_BODY (node), annotate_loops_in_kernels_regions,
+                    (void *) &nested_info, NULL);
+         *walk_subtrees = 0;
+       }
       break;
 
     case FOR_STMT:
index 95f3e0d954c8477f85a74f995f38450047e87558..405e7bb24ad32845374bcb32e8d2f6c6224d6049 100644 (file)
@@ -1,3 +1,12 @@
+2020-08-19   Sandra Loosemore  <sandra@codesourcery.com>
+
+       Annotate inner loops in "acc kernels loop" directives (C/C++).
+
+       * c-c++-common/goacc/kernels-loop-annotation-18.c: New.
+       * c-c++-common/goacc/kernels-loop-annotation-19.c: New.
+       * c-c++-common/goacc/combined-directives.c: Adjust expected
+       patterns.
+
 2020-08-19  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * gfortran.dg/goacc/pr70828.f90: Update expected output in Gimple
index c2a3c57b48b83432c1bf000d279a2d09a8f2f57a..2519f23d49f0b3de2faf25acf830d85737ac8754 100644 (file)
@@ -110,7 +110,7 @@ test ()
 // { dg-final { scan-tree-dump-times "acc loop worker" 2 "gimple" } }
 // { dg-final { scan-tree-dump-times "acc loop vector" 2 "gimple" } }
 // { dg-final { scan-tree-dump-times "acc loop seq" 2 "gimple" } }
-// { dg-final { scan-tree-dump-times "acc loop auto" 2 "gimple" } }
+// { dg-final { scan-tree-dump-times "acc loop auto" 6 "gimple" } }
 // { dg-final { scan-tree-dump-times "acc loop tile.2, 3" 2 "gimple" } }
 // { dg-final { scan-tree-dump-times "acc loop independent private.i" 2 "gimple" } }
 // { dg-final { scan-tree-dump-times "private.z" 2 "gimple" } }
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-18.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-18.c
new file mode 100644 (file)
index 0000000..89ec644
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-additional-options "-fopenacc -fopenacc-kernels-annotate-loops" } */
+/* { dg-additional-options "-Wopenacc-kernels-annotate-loops" } */
+/* { dg-additional-options "-fdump-tree-original" } */
+/* { dg-do compile } */
+
+/* Test that "acc kernels loop" directive causes annotation of the entire
+   loop nest.  */
+
+void f (float *a, float *b)
+{
+#pragma acc kernels loop
+  for (int k = 0; k < 20; k++)
+    for (int l = 0; l < 20; l++)
+      for (int m = 0; m < 20; m++)
+       b[m] = a[m];
+}
+
+/* { dg-final { scan-tree-dump-times "acc loop auto" 2 "original" } } */
diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-19.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-19.c
new file mode 100644 (file)
index 0000000..77a3b7a
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-additional-options "-fopenacc -fopenacc-kernels-annotate-loops" } */
+/* { dg-additional-options "-Wopenacc-kernels-annotate-loops" } */
+/* { dg-additional-options "-fdump-tree-original" } */
+/* { dg-do compile } */
+
+/* Test that "acc kernels loop" directive causes annotation of the entire
+   loop nest in the presence of a collapse clause.  */
+
+void f (float *a, float *b)
+{
+#pragma acc kernels loop collapse(2)
+  for (int k = 0; k < 20; k++)
+    for (int l = 0; l < 20; l++)
+      for (int m = 0; m < 20; m++)
+       b[m] = a[m];
+}
+
+/* { dg-final { scan-tree-dump-times "acc loop collapse.2." 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "acc loop auto" 1 "original" } } */