Skip inner loops in oacc kernels region
2015-09-24 Tom de Vries <tom@codesourcery.com>
* tree-parloops.c (parallelize_loops): Skip inner loops in oacc kernels
region.
* gfortran.dg/goacc/kernels-loop-inner.f95: New test.
---
.../gfortran.dg/goacc/kernels-loop-inner.f95 | 23 ++++++++++++++++++++++
gcc/tree-parloops.c | 8 +++++++-
2 files changed, 30 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95
new file mode 100644
@@ -0,0 +1,23 @@
+! { dg-additional-options "-O2" }
+! { dg-additional-options "-ftree-parallelize-loops=32" }
+
+program main
+ implicit none
+
+ integer :: a(100,100), b(100,100)
+ integer :: i, j, d
+
+ !$acc kernels
+ do i=1,100
+ do j=1,100
+ a(i,j) = 1
+ b(i,j) = 2
+ a(i,j) = a(i,j) + b(i,j)
+ end do
+ end do
+ !$acc end kernels
+
+ d = sum(a)
+
+ print *,d
+end program main
@@ -2792,7 +2792,8 @@ parallelize_loops (bool oacc_kernels_p)
{
if (loop == skip_loop)
{
- if (dump_file && (dump_flags & TDF_DETAILS))
+ if (!loop->in_oacc_kernels_region
+ && dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"Skipping loop %d as inner loop of parallelized loop\n",
loop->num);
@@ -2810,6 +2811,10 @@ parallelize_loops (bool oacc_kernels_p)
if (!loop->in_oacc_kernels_region)
continue;
+ /* Don't try to parallelize inner loops in an oacc kernels region. */
+ if (loop->inner)
+ skip_loop = loop->inner;
+
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"Trying loop %d with header bb %d in oacc kernels region\n",
@@ -2892,6 +2897,7 @@ parallelize_loops (bool oacc_kernels_p)
}
changed = true;
+ /* Skip inner loop(s) of parallelized loop. */
skip_loop = loop->inner;
if (dump_file && (dump_flags & TDF_DETAILS))
{
--
1.9.1