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
@@ -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;
new file mode 100644
@@ -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