[PR middle-end/69921] Use "oacc kernels parallelized" attribute for parallelized OpenACC kernels
gcc/ PR middle-end/69921 * tree-parloops.c (create_parallel_loop): Set "oacc kernels parallelized" attribute for parallelized OpenACC kernels. * omp-offload.c (execute_oacc_device_lower): Use it. gcc/testsuite/ * c-c++-common/goacc/classify-kernels-unparallelized.c: Adjust. * c-c++-common/goacc/classify-kernels.c: Likewise. * c-c++-common/goacc/kernels-counter-vars-function-scope.c: Likewise. * c-c++-common/goacc/kernels-double-reduction-n.c: Likewise. * c-c++-common/goacc/kernels-double-reduction.c: Likewise. * c-c++-common/goacc/kernels-loop-2.c: Likewise. * c-c++-common/goacc/kernels-loop-3.c: Likewise. * c-c++-common/goacc/kernels-loop-g.c: Likewise. * c-c++-common/goacc/kernels-loop-mod-not-zero.c: Likewise. * c-c++-common/goacc/kernels-loop-n.c: Likewise. * c-c++-common/goacc/kernels-loop-nest.c: Likewise. * c-c++-common/goacc/kernels-loop.c: Likewise. * c-c++-common/goacc/kernels-one-counter-var.c: Likewise. * c-c++-common/goacc/kernels-reduction.c: Likewise. * gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise. * gfortran.dg/goacc/classify-kernels.f95: Likewise. * gfortran.dg/goacc/kernels-loop-2.f95: Likewise. * gfortran.dg/goacc/kernels-loop-data-2.f95: Likewise. * gfortran.dg/goacc/kernels-loop-data-enter-exit-2.f95: Likewise. * gfortran.dg/goacc/kernels-loop-data-enter-exit.f95: Likewise. * gfortran.dg/goacc/kernels-loop-data-update.f95: Likewise. * gfortran.dg/goacc/kernels-loop-data.f95: Likewise. * gfortran.dg/goacc/kernels-loop-n.f95: Likewise. * gfortran.dg/goacc/kernels-loop.f95: Likewise. From-SVN: r247957
This commit is contained in:
parent
2565163443
commit
b0f271ce56
28 changed files with 89 additions and 60 deletions
|
@ -1,5 +1,10 @@
|
|||
2017-05-12 Thomas Schwinge <thomas@codesourcery.com>
|
||||
|
||||
PR middle-end/69921
|
||||
* tree-parloops.c (create_parallel_loop): Set "oacc kernels
|
||||
parallelized" attribute for parallelized OpenACC kernels.
|
||||
* omp-offload.c (execute_oacc_device_lower): Use it.
|
||||
|
||||
* omp-expand.c (expand_omp_target) <GF_OMP_TARGET_KIND_OACC_KERNELS>:
|
||||
Set "oacc kernels" attribute.
|
||||
* omp-general.c (oacc_set_fn_attrib): Remove is_kernel formal
|
||||
|
|
|
@ -1444,6 +1444,13 @@ execute_oacc_device_lower ()
|
|||
flag_openacc_dims = (char *)&flag_openacc_dims;
|
||||
}
|
||||
|
||||
bool is_oacc_kernels
|
||||
= (lookup_attribute ("oacc kernels",
|
||||
DECL_ATTRIBUTES (current_function_decl)) != NULL);
|
||||
bool is_oacc_kernels_parallelized
|
||||
= (lookup_attribute ("oacc kernels parallelized",
|
||||
DECL_ATTRIBUTES (current_function_decl)) != NULL);
|
||||
|
||||
/* Discover, partition and process the loops. */
|
||||
oacc_loop *loops = oacc_loop_discovery ();
|
||||
int fn_level = oacc_fn_attrib_level (attrs);
|
||||
|
@ -1453,17 +1460,26 @@ execute_oacc_device_lower ()
|
|||
if (fn_level >= 0)
|
||||
fprintf (dump_file, "Function is OpenACC routine level %d\n",
|
||||
fn_level);
|
||||
else if (lookup_attribute ("oacc kernels",
|
||||
DECL_ATTRIBUTES (current_function_decl)))
|
||||
fprintf (dump_file, "Function is OpenACC kernels offload\n");
|
||||
else if (is_oacc_kernels)
|
||||
fprintf (dump_file, "Function is %s OpenACC kernels offload\n",
|
||||
(is_oacc_kernels_parallelized
|
||||
? "parallelized" : "unparallelized"));
|
||||
else
|
||||
fprintf (dump_file, "Function is OpenACC parallel offload\n");
|
||||
}
|
||||
|
||||
unsigned outer_mask = fn_level >= 0 ? GOMP_DIM_MASK (fn_level) - 1 : 0;
|
||||
unsigned used_mask = oacc_loop_partition (loops, outer_mask);
|
||||
int dims[GOMP_DIM_MAX];
|
||||
/* OpenACC kernels constructs are special: they currently don't use the
|
||||
generic oacc_loop infrastructure and attribute/dimension processing. */
|
||||
if (is_oacc_kernels && is_oacc_kernels_parallelized)
|
||||
{
|
||||
/* Parallelized OpenACC kernels constructs use gang parallelism. See
|
||||
also tree-parloops.c:create_parallel_loop. */
|
||||
used_mask |= GOMP_DIM_MASK (GOMP_DIM_GANG);
|
||||
}
|
||||
|
||||
int dims[GOMP_DIM_MAX];
|
||||
oacc_validate_dims (current_function_decl, attrs, dims, fn_level, used_mask);
|
||||
|
||||
if (dump_file)
|
||||
|
|
|
@ -1,5 +1,31 @@
|
|||
2017-05-12 Thomas Schwinge <thomas@codesourcery.com>
|
||||
|
||||
* c-c++-common/goacc/classify-kernels-unparallelized.c: Adjust.
|
||||
* c-c++-common/goacc/classify-kernels.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-counter-vars-function-scope.c:
|
||||
Likewise.
|
||||
* c-c++-common/goacc/kernels-double-reduction-n.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-double-reduction.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-2.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-3.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-g.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-mod-not-zero.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-n.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop-nest.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-loop.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-one-counter-var.c: Likewise.
|
||||
* c-c++-common/goacc/kernels-reduction.c: Likewise.
|
||||
* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise.
|
||||
* gfortran.dg/goacc/classify-kernels.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-2.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-data-2.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-data-enter-exit-2.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-data-enter-exit.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-data-update.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-data.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop-n.f95: Likewise.
|
||||
* gfortran.dg/goacc/kernels-loop.f95: Likewise.
|
||||
|
||||
* c-c++-common/goacc/classify-kernels-unparallelized.c: Adjust.
|
||||
* c-c++-common/goacc/classify-kernels.c: Likewise.
|
||||
* c-c++-common/goacc/classify-parallel.c: Likewise.
|
||||
|
|
|
@ -34,6 +34,6 @@ void KERNELS ()
|
|||
|
||||
/* Check the offloaded function's classification and compute dimensions (will
|
||||
always be 1 x 1 x 1 for non-offloading compilation).
|
||||
{ dg-final { scan-tree-dump-times "(?n)Function is OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)Function is unparallelized OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)Compute dimensions \\\[1, 1, 1\\\]" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } } */
|
||||
|
|
|
@ -25,11 +25,11 @@ void KERNELS ()
|
|||
/* Check that exactly one OpenACC kernels construct is analyzed, and that it
|
||||
can be parallelized.
|
||||
{ dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(0, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } }
|
||||
{ dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check the offloaded function's classification and compute dimensions (will
|
||||
always be 1 x 1 x 1 for non-offloading compilation).
|
||||
{ dg-final { scan-tree-dump-times "(?n)Function is OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)Function is parallelized OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)Compute dimensions \\\[1, 1, 1\\\]" 1 "oaccdevlow" } }
|
||||
{ dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } } */
|
||||
{ dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } } */
|
||||
|
|
|
@ -45,9 +45,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -27,10 +27,9 @@ foo (unsigned int n)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -27,10 +27,9 @@ foo (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -59,11 +59,10 @@ main (void)
|
|||
/* Check that only three loops are analyzed, and that all can be
|
||||
parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.1" 1 "optimized" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.2" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } } */
|
||||
|
|
|
@ -39,9 +39,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -7,9 +7,8 @@
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -43,9 +43,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -46,9 +46,8 @@ foo (COUNTERTYPE n)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -30,9 +30,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -46,9 +46,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -44,9 +44,8 @@ main (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -26,9 +26,8 @@ foo (void)
|
|||
|
||||
/* Check that only one loop is analyzed, and that it can be parallelized. */
|
||||
/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */
|
||||
|
||||
/* Check that the loop has been split off into a function. */
|
||||
/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } } */
|
||||
|
|
|
@ -36,6 +36,6 @@ end program main
|
|||
|
||||
! Check the offloaded function's classification and compute dimensions (will
|
||||
! always be 1 x 1 x 1 for non-offloading compilation).
|
||||
! { dg-final { scan-tree-dump-times "(?n)Function is OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)Function is unparallelized OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)Compute dimensions \\\[1, 1, 1\\\]" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } }
|
||||
|
|
|
@ -27,11 +27,11 @@ end program main
|
|||
! Check that exactly one OpenACC kernels construct is analyzed, and that it
|
||||
! can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(0, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check the offloaded function's classification and compute dimensions (will
|
||||
! always be 1 x 1 x 1 for non-offloading compilation).
|
||||
! { dg-final { scan-tree-dump-times "(?n)Function is OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)Function is parallelized OpenACC kernels offload" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)Compute dimensions \\\[1, 1, 1\\\]" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc function \\(1, 1, 1\\), oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "oaccdevlow" } }
|
||||
|
|
|
@ -34,11 +34,10 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.2 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } }
|
||||
|
|
|
@ -40,11 +40,10 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.2 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } }
|
||||
|
|
|
@ -40,11 +40,10 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.2 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } }
|
||||
|
|
|
@ -38,11 +38,10 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.2 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } }
|
||||
|
|
|
@ -38,10 +38,9 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 2 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 2 "parloops1" } }
|
||||
|
|
|
@ -38,11 +38,10 @@ end program main
|
|||
|
||||
! Check that only three loops are analyzed, and that all can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 3 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.1 " 1 "optimized" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.2 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 3 "parloops1" } }
|
||||
|
|
|
@ -32,10 +32,9 @@ end module test
|
|||
|
||||
! Check that only one loop is analyzed, and that it can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } }
|
||||
! TODO, PR70545.
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" { xfail *-*-* } } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function __test_MOD_foo._omp_fn.0 " 1 "optimized" } }
|
||||
|
||||
! TODO, PR70545.
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" { xfail *-*-* } } }
|
||||
|
|
|
@ -30,9 +30,8 @@ end program main
|
|||
|
||||
! Check that only one loop is analyzed, and that it can be parallelized.
|
||||
! { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-times "(?n)__attribute__\\(\\(oacc kernels parallelized, oacc function \\(, , \\), oacc kernels, omp target entrypoint\\)\\)" 1 "parloops1" } }
|
||||
! { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } }
|
||||
|
||||
! Check that the loop has been split off into a function.
|
||||
! { dg-final { scan-tree-dump-times "(?n);; Function MAIN__._omp_fn.0 " 1 "optimized" } }
|
||||
|
||||
! { dg-final { scan-tree-dump-times "(?n)oacc function \\(0," 1 "parloops1" } }
|
||||
|
|
|
@ -2040,19 +2040,20 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data,
|
|||
tree cvar, cvar_init, initvar, cvar_next, cvar_base, type;
|
||||
edge exit, nexit, guard, end, e;
|
||||
|
||||
/* Prepare the GIMPLE_OMP_PARALLEL statement. */
|
||||
if (oacc_kernels_p)
|
||||
{
|
||||
gcc_checking_assert (lookup_attribute ("oacc kernels",
|
||||
DECL_ATTRIBUTES (cfun->decl)));
|
||||
|
||||
tree clause = build_omp_clause (loc, OMP_CLAUSE_NUM_GANGS);
|
||||
OMP_CLAUSE_NUM_GANGS_EXPR (clause)
|
||||
= build_int_cst (integer_type_node, n_threads);
|
||||
oacc_set_fn_attrib (cfun->decl, clause, NULL);
|
||||
/* Indicate to later processing that this is a parallelized OpenACC
|
||||
kernels construct. */
|
||||
DECL_ATTRIBUTES (cfun->decl)
|
||||
= tree_cons (get_identifier ("oacc kernels parallelized"),
|
||||
NULL_TREE, DECL_ATTRIBUTES (cfun->decl));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Prepare the GIMPLE_OMP_PARALLEL statement. */
|
||||
|
||||
basic_block bb = loop_preheader_edge (loop)->src;
|
||||
basic_block paral_bb = single_pred (bb);
|
||||
gsi = gsi_last_bb (paral_bb);
|
||||
|
@ -2154,7 +2155,8 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data,
|
|||
|
||||
/* Emit GIMPLE_OMP_FOR. */
|
||||
if (oacc_kernels_p)
|
||||
/* In combination with the NUM_GANGS on the parallel. */
|
||||
/* Parallelized OpenACC kernels constructs use gang parallelism. See also
|
||||
omp-offload.c:execute_oacc_device_lower. */
|
||||
t = build_omp_clause (loc, OMP_CLAUSE_GANG);
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue