diff mbox

[gomp4,committed] Skip inner loops in oacc kernels region

Message ID 560503AD.4080005@mentor.com
State New
Headers show

Commit Message

Tom de Vries Sept. 25, 2015, 8:19 a.m. UTC
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
diff mbox

Patch

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