From 7b436e90a4e03fdce5b0c6a8c452d3f23f1e136b Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Wed, 19 Aug 2020 19:18:57 -0700 Subject: [PATCH] Annotate inner loops in "acc kernels loop" directives (C/C++). 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 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 | 7 ++++ gcc/c-family/c-omp.c | 36 ++++++++++++------- gcc/testsuite/ChangeLog.omp | 9 +++++ .../c-c++-common/goacc/combined-directives.c | 2 +- .../goacc/kernels-loop-annotation-18.c | 18 ++++++++++ .../goacc/kernels-loop-annotation-19.c | 19 ++++++++++ 6 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-18.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-19.c diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp index 92ffa851d448..51a3b9e47665 100644 --- a/gcc/c-family/ChangeLog.omp +++ b/gcc/c-family/ChangeLog.omp @@ -1,3 +1,10 @@ +2020-08-19 Sandra Loosemore + + 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-08-18 Kwok Cheung Yeung Backport from mainline diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index c1d6afa2ca7c..24f2448b235e 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -2782,18 +2782,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: diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index ffc8f634f96f..970345bcad90 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,12 @@ +2020-08-19 Sandra Loosemore + + 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 * gfortran.dg/goacc/pr70828.f90: Update expected output in Gimple diff --git a/gcc/testsuite/c-c++-common/goacc/combined-directives.c b/gcc/testsuite/c-c++-common/goacc/combined-directives.c index c2a3c57b48b8..2519f23d49f0 100644 --- a/gcc/testsuite/c-c++-common/goacc/combined-directives.c +++ b/gcc/testsuite/c-c++-common/goacc/combined-directives.c @@ -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 index 000000000000..89ec6447625f --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-18.c @@ -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 index 000000000000..77a3b7a9136d --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-annotation-19.c @@ -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" } } */ -- 2.47.2