On Thu, 9 Jul 2015, Tom de Vries wrote: > On 29/06/15 16:30, Tom de Vries wrote: > > Hi, > > > > this patch allows try_transform_to_exit_first_loop_alt to handle the > > case that the new loop bound nit + 1 is not available as ssa-name n in > > the assignment nit = n - 1, by inserting the new loop bound. > > > > Bootstrapped and reg-tested on x86_64. > > > > OK for trunk? > > > > Ping. > > Thanks, > - Tom > > > 0002-Insert-new-bound-in-try_transform_to_exit_first_loop.patch > > > > > > Insert new bound in try_transform_to_exit_first_loop_alt > > > > 2015-06-29 Tom de Vries<t...@codesourcery.com> > > > > * tree-parloops.c (try_transform_to_exit_first_loop_alt): If not > > found, > > insert nit + 1 bound. > > > > * testsuite/libgomp.fortran/parloops-exit-first-loop-alt-2.f95: New > > test. > > * testsuite/libgomp.fortran/parloops-exit-first-loop-alt.f95: New > > test. > > > > * gfortran.dg/parloops-exit-first-loop-alt-2.f95: New test. > > * gfortran.dg/parloops-exit-first-loop-alt.f95: New test. > > --- > > .../gfortran.dg/parloops-exit-first-loop-alt-2.f95 | 24 +++++++++++++ > > .../gfortran.dg/parloops-exit-first-loop-alt.f95 | 25 +++++++++++++ > > gcc/tree-parloops.c | 18 +++++++++- > > .../parloops-exit-first-loop-alt-2.f95 | 40 > > +++++++++++++++++++++ > > .../parloops-exit-first-loop-alt.f95 | 41 > > ++++++++++++++++++++++ > > 5 files changed, 147 insertions(+), 1 deletion(-) > > create mode 100644 > > gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 > > create mode 100644 > > gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 > > create mode 100644 > > libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt-2.f95 > > create mode 100644 > > libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt.f95 > > > > diff --git a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 > > b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 > > new file mode 100644 > > index 0000000..f26a6e3 > > --- /dev/null > > +++ b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 > > @@ -0,0 +1,24 @@ > > +! { dg-additional-options "-O2" } > > +! { dg-require-effective-target pthread } > > +! { dg-additional-options "-ftree-parallelize-loops=2" } > > +! { dg-additional-options "-fdump-tree-parloops" } > > + > > +! Constant bound, vector addition. > > + > > +subroutine foo () > > + integer, parameter :: n = 1000 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: ii > > + > > + do ii = 0, n - 1 > > + c(ii) = a(ii) + b(ii) + 25 > > + end do > > +end subroutine foo > > + > > +! Three times plus 25: > > +! - once in f._loopfn.0 > > +! - once in the parallel > > +! - once in the low iteration count loop > > +! Crucially, none for a peeled off last iteration following the parallel. > > +! { dg-final { scan-tree-dump-times "(?n) \\+ 25;" 3 "parloops" } } > > diff --git a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 > > b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 > > new file mode 100644 > > index 0000000..6dc8a38 > > --- /dev/null > > +++ b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 > > @@ -0,0 +1,25 @@ > > +! { dg-additional-options "-O2" } > > +! { dg-require-effective-target pthread } > > +! { dg-additional-options "-ftree-parallelize-loops=2" } > > +! { dg-additional-options "-fdump-tree-parloops" } > > + > > +! Variable bound, vector addition. > > + > > +subroutine foo (nr) > > + integer, intent(in) :: nr > > + integer, parameter :: n = 1000 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: ii > > + > > + do ii = 0, nr - 1 > > + c(ii) = a(ii) + b(ii) + 25 > > + end do > > +end subroutine foo > > + > > +! Three times plus 25: > > +! - once in f._loopfn.0 > > +! - once in the parallel > > +! - once in the low iteration count loop > > +! Crucially, none for a peeled off last iteration following the parallel. > > +! { dg-final { scan-tree-dump-times "(?n) \\+ 25;" 3 "parloops" } } > > diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c > > index 32d059a..7a07c7d 100644 > > --- a/gcc/tree-parloops.c > > +++ b/gcc/tree-parloops.c > > @@ -1840,8 +1840,24 @@ try_transform_to_exit_first_loop_alt (struct loop > > *loop, > > alt_bound = op1; > > } > > > > + /* If not found, insert nit + 1. */ > > if (alt_bound == NULL_TREE) > > - return false; > > + { > > + alt_bound = fold_build2 (PLUS_EXPR, nit_type, nit, > > + build_int_cst_type (nit_type, 1)); > > + > > + gimple_seq pre = NULL, post = NULL; > > + push_gimplify_context (true); > > + gimplify_expr (&alt_bound, &pre, &post, is_gimple_reg, > > + fb_rvalue); > > + pop_gimplify_context (NULL); > > + > > + gimple_seq_add_seq (&pre, post); > > > > + gimple_stmt_iterator gsi > > + = gsi_last_bb (loop_preheader_edge (loop)->src); > > + gsi_insert_seq_after (&gsi, pre, GSI_CONTINUE_LINKING);
Please use force_gimple_operand_gsi () for all this. Ok with that change. Richard. > > + } > > > > transform_to_exit_first_loop_alt (loop, reduction_list, alt_bound); > > return true; > > diff --git > > a/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt-2.f95 > > b/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt-2.f95 > > new file mode 100644 > > index 0000000..56add65 > > --- /dev/null > > +++ b/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt-2.f95 > > @@ -0,0 +1,40 @@ > > +! { dg-do run } > > +! { dg-additional-options "-O2" } > > +! { dg-additional-options "-ftree-parallelize-loops=2" } > > + > > +! Constant bound, vector addition. > > + > > +subroutine foo () > > + integer, parameter :: n = 1000 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: ii > > + > > + do ii = 0, n - 1 > > + c(ii) = a(ii) + b(ii) > > + end do > > +end subroutine foo > > + > > +program main > > + integer, parameter :: n = 1000 > > + integer, parameter :: distrib = 10 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: i, j, k > > + > > + do j = 0, ((n / distrib) -1) > > + do i = 0, distrib - 1 > > + k = i + (distrib * j) > > + a(k) = k > > + b(k) = MODULO ((k * 3), 7) > > + c(k) = k * 2; > > + end do > > + end do > > + > > + call foo () > > + > > + do i = 0, n - 1 > > + if (c(i) .ne. (i + MODULO ((i * 3), 7))) call abort > > + end do > > + > > +end program > > diff --git > > a/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt.f95 > > b/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt.f95 > > new file mode 100644 > > index 0000000..72b3c8d > > --- /dev/null > > +++ b/libgomp/testsuite/libgomp.fortran/parloops-exit-first-loop-alt.f95 > > @@ -0,0 +1,41 @@ > > +! { dg-do run } > > +! { dg-additional-options "-O2" } > > +! { dg-additional-options "-ftree-parallelize-loops=2" } > > + > > +! Variable bound, vector addition. > > + > > +subroutine foo (nr) > > + integer, intent(in) :: nr > > + integer, parameter :: n = 1000 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: ii > > + > > + do ii = 0, nr - 1 > > + c(ii) = a(ii) + b(ii) > > + end do > > +end subroutine foo > > + > > +program main > > + integer, parameter :: n = 1000 > > + integer, parameter :: distrib = 10 > > + integer, dimension (0:n-1) :: a, b, c > > + common a, b, c > > + integer :: i, j, k > > + > > + do j = 0, ((n / distrib) -1) > > + do i = 0, distrib - 1 > > + k = i + (distrib * j) > > + a(k) = k > > + b(k) = MODULO ((k * 3), 7) > > + c(k) = k * 2; > > + end do > > + end do > > + > > + call foo (n) > > + > > + do i = 0, n - 1 > > + if (c(i) .ne. (i + MODULO ((i * 3), 7))) call abort > > + end do > > + > > +end program > > -- 1.9.1 > > > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, Graham Norton, HRB 21284 (AG Nuernberg)