diff mbox

Insert new bound in try_transform_to_exit_first_loop_alt

Message ID 55915693.4090300@mentor.com
State New
Headers show

Commit Message

Tom de Vries June 29, 2015, 2:30 p.m. UTC
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?

Thanks,
- Tom

Comments

Tom de Vries July 9, 2015, 11:55 a.m. UTC | #1
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<tom@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);
> +    }
>
>     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 July 9, 2015, 12:15 p.m. UTC | #2
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<tom@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
> > 
> 
>
diff mbox

Patch

Insert new bound in try_transform_to_exit_first_loop_alt

2015-06-29  Tom de Vries  <tom@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);
+    }
 
   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