diff mbox

[gom4,committed] Don't parallelize oacc kernels region with adjacent loops

Message ID 5606382B.9020505@mentor.com
State New
Headers show

Commit Message

Tom de Vries Sept. 26, 2015, 6:16 a.m. UTC
Hi,

this patch prevents adjacent loops in a kernels region to paralellized. 
This fixes an ICE in the test-case.

Committed to gomp-4_0-branch.

Thanks,
- Tom
diff mbox

Patch

Don't parallelize oacc kernels region with adjacent loops

2015-09-26  Tom de Vries  <tom@codesourcery.com>

	* omp-low.c (mark_loops_in_oacc_kernels_region): Don't parallelize the
	kernels region if it contains more than one outer loop.

	* gfortran.dg/goacc/kernels-loops-adjacent.f95: New test.
---
 gcc/omp-low.c                                         | 17 ++++++++++++++++-
 .../gfortran.dg/goacc/kernels-loops-adjacent.f95      | 19 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95

diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 99b3939..a5904eb 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -9392,9 +9392,24 @@  mark_loops_in_oacc_kernels_region (basic_block region_entry,
 	bitmap_set_bit (excludes_bitmap, bb->index);
     }
 
-  /* Mark the loops in the region.  */
+  /* Don't parallelize the kernels region if it contains more than one outer
+     loop.  */
+  unsigned int nr_outer_loops = 0;
   struct loop *loop;
   FOR_EACH_LOOP (loop, 0)
+    {
+      if (loop_outer (loop) != current_loops->tree_root)
+	continue;
+
+      if (bitmap_bit_p (dominated_bitmap, loop->header->index)
+	  && !bitmap_bit_p (excludes_bitmap, loop->header->index))
+	nr_outer_loops++;
+    }
+  if (nr_outer_loops != 1)
+    return;
+
+  /* Mark the loop nest to parallelize in the region.  */
+  FOR_EACH_LOOP (loop, 0)
     if (bitmap_bit_p (dominated_bitmap, loop->header->index)
 	&& !bitmap_bit_p (excludes_bitmap, loop->header->index))
       loop->in_oacc_kernels_region = true;
diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95
new file mode 100644
index 0000000..fef3d10
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95
@@ -0,0 +1,19 @@ 
+! { dg-additional-options "-O2" }
+! { dg-additional-options "-ftree-parallelize-loops=10" }
+
+program main
+   implicit none
+
+   integer :: a(10000), b(10000)
+   integer :: d
+
+   !$acc kernels
+   a = 1
+   b = 2
+   a = a + b
+   !$acc end kernels
+
+   d = sum(a)
+
+   print *,d
+end program main
-- 
1.9.1