This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gomp4, committed] Skip inner loops in oacc kernels region
- From: Tom de Vries <Tom_deVries at mentor dot com>
- To: "gcc-patches at gnu dot org" <gcc-patches at gnu dot org>
- Date: Fri, 25 Sep 2015 10:19:57 +0200
- Subject: [gomp4, committed] Skip inner loops in oacc kernels region
- Authentication-results: sourceware.org; auth=none
Hi,
this patch fixes an ICE when trying to parallelize inner loops in an
oacc kernels region.
The patch fixes it by not trying to parallelize those inner loops.
Committed to gomp-4_0-branch.
Thanks,
- Tom
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
diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95
new file mode 100644
index 0000000..4db3a50
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95
@@ -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
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index 04ec254..5d93bc2 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -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