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
Don't parallelize oacc kernels region with adjacent loops
2015-09-26 Tom de Vries <t...@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