Re: [PATCH, PR66652] Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-30 Thread Tom de Vries

On 29/06/15 19:58, Jeff Law wrote:

On 06/29/2015 08:24 AM, Tom de Vries wrote:

Hi,

this patch fixes PR66652.

It uses max_loop_iterations in transform_to_exit_first_loop_alt to
ensure that the new loop bound nit + 1 doesn't overflow.

Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom

0001-Use-max_loop_iterations-in-transform_to_exit_first_l.patch


Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-29  Tom de Vriest...@codesourcery.com

PR tree-optimization/66652
* tree-parloops.c (try_transform_to_exit_first_loop_alt): Use
max_loop_iterations to determine if nit + 1 overflows.

* testsuite/libgomp.c/parloops-exit-first-loop-alt-3.c (f): Rewrite
using restrict pointers.
(main): Add arguments to calls to f.
* testsuite/libgomp.c/parloops-exit-first-loop-alt.c: Same.

* gcc.dg/parloops-exit-first-loop-alt-pr66652.c: New test.
* gcc.dg/parloops-exit-first-loop-alt-3.c (f):  Rewrite using
restrict
pointers.
* gcc.dg/parloops-exit-first-loop-alt.c: Same.

OK.

Make sure to put the PR marker in the testsuite/ChangeLog entry


True, I abbreviate it in the log, but my commit script ( 
https://github.com/vries/bin-scripts/blob/master/git-prepare-gnu-commit.sh 
) applies the PR line to all the ChangeLog hunks.



and drop
the testsuite/ prefix in the testsuite/ChangeLog entry.



The testsuite/ prefix is used because the it's for the ChangeLog in dir 
libgomp.


Committed as attached:
- fixed typo in comment
- updated test-case modifications to be applicable on trunk (given that
  there's no approval yet for the fix for PR66642, see
  https://gcc.gnu.org/ml/gcc-patches/2015-06/msg01768.html)
- included ChangeLog file changes, given the ChangeLog questions.

Thanks,
- Tom
Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-30  Tom de Vries  t...@codesourcery.com

	PR tree-optimization/66652
	* tree-parloops.c (try_transform_to_exit_first_loop_alt): Use
	max_loop_iterations to determine if nit + 1 overflows.

	* testsuite/libgomp.c/parloops-exit-first-loop-alt-3.c (f): Rewrite
	using restrict pointers.
	(main): Add arguments to calls to f.
	* testsuite/libgomp.c/parloops-exit-first-loop-alt.c: Same.

	* gcc.dg/parloops-exit-first-loop-alt-pr66652.c: New test.
	* gcc.dg/parloops-exit-first-loop-alt-3.c (f):  Rewrite using restrict
	pointers.
	* gcc.dg/parloops-exit-first-loop-alt.c: Same.
---
 gcc/ChangeLog  |  6 +
 gcc/testsuite/ChangeLog|  8 ++
 .../gcc.dg/parloops-exit-first-loop-alt-3.c|  2 +-
 .../gcc.dg/parloops-exit-first-loop-alt-pr66652.c  | 31 ++
 .../gcc.dg/parloops-exit-first-loop-alt.c  | 19 +
 gcc/tree-parloops.c| 31 ++
 libgomp/ChangeLog  |  8 ++
 .../libgomp.c/parloops-exit-first-loop-alt-3.c |  4 +--
 .../libgomp.c/parloops-exit-first-loop-alt.c   |  5 ++--
 9 files changed, 97 insertions(+), 17 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 96f4f8d..1940d04 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-30  Tom de Vries  t...@codesourcery.com
+
+	PR tree-optimization/66652
+	* tree-parloops.c (try_transform_to_exit_first_loop_alt): Use
+	max_loop_iterations to determine if nit + 1 overflows.
+
 2015-06-30  Bin Cheng  bin.ch...@arm.com
 
 	* tree-ssa-loop-ivopts.c (record_sub_use): Don't reset ssa_name
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9c2f20b..f249a7d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2015-06-30  Tom de Vries  t...@codesourcery.com
+
+	PR tree-optimization/66652
+	* gcc.dg/parloops-exit-first-loop-alt-pr66652.c: New test.
+	* gcc.dg/parloops-exit-first-loop-alt-3.c (f):  Rewrite using restrict
+	pointers.
+	* gcc.dg/parloops-exit-first-loop-alt.c: Same.
+
 2015-06-29  Paolo Carlini  paolo.carl...@oracle.com
 
 	PR c++/65977
diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
index b0fde37..fec53a1 100644
--- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
+++ b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
@@ -7,7 +7,7 @@
 unsigned int *a;
 
 unsigned int
-f (unsigned int n)
+f (unsigned int n, unsigned int *__restrict__ a)
 {
   int i;
   unsigned int sum = 1;
diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c
new file mode 100644
index 000..2ea097d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target pthread } */
+/* { dg-options -O2 -ftree-parallelize-loops=2 -fdump-tree-parloops } */
+
+#include stdio.h

[PATCH, PR66652] Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-29 Thread Tom de Vries

Hi,

this patch fixes PR66652.

It uses max_loop_iterations in transform_to_exit_first_loop_alt to 
ensure that the new loop bound nit + 1 doesn't overflow.


Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom
Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-29  Tom de Vries  t...@codesourcery.com

	PR tree-optimization/66652
	* tree-parloops.c (try_transform_to_exit_first_loop_alt): Use
	max_loop_iterations to determine if nit + 1 overflows.

	* testsuite/libgomp.c/parloops-exit-first-loop-alt-3.c (f): Rewrite
	using restrict pointers.
	(main): Add arguments to calls to f.
	* testsuite/libgomp.c/parloops-exit-first-loop-alt.c: Same.

	* gcc.dg/parloops-exit-first-loop-alt-pr66652.c: New test.
	* gcc.dg/parloops-exit-first-loop-alt-3.c (f):  Rewrite using restrict
	pointers.
	* gcc.dg/parloops-exit-first-loop-alt.c: Same.
---
 .../gcc.dg/parloops-exit-first-loop-alt-3.c|  2 +-
 .../gcc.dg/parloops-exit-first-loop-alt-pr66652.c  | 31 ++
 .../gcc.dg/parloops-exit-first-loop-alt.c  | 19 +
 gcc/tree-parloops.c| 31 ++
 .../libgomp.c/parloops-exit-first-loop-alt-3.c |  6 ++---
 .../libgomp.c/parloops-exit-first-loop-alt.c   |  7 ++---
 6 files changed, 77 insertions(+), 19 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c

diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
index b0fde37..fec53a1 100644
--- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
+++ b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c
@@ -7,7 +7,7 @@
 unsigned int *a;
 
 unsigned int
-f (unsigned int n)
+f (unsigned int n, unsigned int *__restrict__ a)
 {
   int i;
   unsigned int sum = 1;
diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c
new file mode 100644
index 000..2ea097d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target pthread } */
+/* { dg-options -O2 -ftree-parallelize-loops=2 -fdump-tree-parloops } */
+
+#include stdio.h
+#include stdlib.h
+#include limits.h
+
+unsigned int
+f (unsigned int n, unsigned int sum)
+{
+  unsigned int i;
+
+  i = UINT_MAX;
+  do
+{
+  sum += i % 13;
+  i++;
+}
+  while (i  n - 1);
+
+  return sum;
+}
+
+/* Four times % 13:
+   - once in f._loopfn.0
+   - once in the parallel
+   - once in the low iteration count loop
+   - once for a peeled off last iteration following the parallel.
+   In other words, we want try_transform_to_exit_first_loop_alt to fail.  */
+/* { dg-final { scan-tree-dump-times (?n)% 13 4 parloops } } */
diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c
index b36f01b..e088fa1 100644
--- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c
+++ b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c
@@ -4,14 +4,9 @@
 
 /* Variable bound, vector addition.  */
 
-#define N 1000
-
-unsigned int a[N];
-unsigned int b[N];
-unsigned int c[N];
-
 void
-f (unsigned int n)
+f (unsigned int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b,
+   unsigned int *__restrict__ c)
 {
   int i;
 
@@ -19,9 +14,9 @@ f (unsigned int n)
 c[i] = a[i] + b[i];
 }
 
-/* Three times three array accesses:
-   - three in f._loopfn.0
-   - three in the parallel
-   - three in the low iteration count loop
+/* Three times a store:
+   - one in f._loopfn.0
+   - one in the parallel
+   - one in the low iteration count loop
Crucially, none for a peeled off last iteration following the parallel.  */
-/* { dg-final { scan-tree-dump-times (?n)\\\[i 9 parloops } } */
+/* { dg-final { scan-tree-dump-times (?n)^  \\*_\[0-9\]* 3 parloops } } */
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index cb0ba54..32d059a 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -1795,8 +1795,39 @@ try_transform_to_exit_first_loop_alt (struct loop *loop,
 
   gcc_assert (TREE_CODE (nit) == SSA_NAME);
 
+  /* Variable nit is the loop bound as returned by canonicalize_loop_ivs, for an
+ iv with base 0 and step 1 that is incremented in the latch, like this:
+
+ bb header:
+ # iv_1 = PHI 0 (preheader), iv_2 (latch)
+ ...
+ if (iv_1  nit)
+   goto bb latch;
+ else
+   goto bb exit;
+
+ bb latch:
+ iv_2 = ivtmp_1 + 1;
+ goto bb header;
+
+ The range of iv_1 is [0, nit].  The latch edge is taken for
+ iv_1 == [0, nit - 1] and the exit edge is taken for iv_1 == nit.  So the
+ number of latch executions is equal to nit.
+
+ The function max_loop_iterations gives us the maximum number of latch
+ executions, so it gives us the maximum value of nit.  */
+  widest_int nit_max;
+  if (!max_loop_iterations 

Re: [PATCH, PR66652] Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-29 Thread Jeff Law

On 06/29/2015 08:24 AM, Tom de Vries wrote:

Hi,

this patch fixes PR66652.

It uses max_loop_iterations in transform_to_exit_first_loop_alt to
ensure that the new loop bound nit + 1 doesn't overflow.

Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom

0001-Use-max_loop_iterations-in-transform_to_exit_first_l.patch


Use max_loop_iterations in transform_to_exit_first_loop_alt

2015-06-29  Tom de Vriest...@codesourcery.com

PR tree-optimization/66652
* tree-parloops.c (try_transform_to_exit_first_loop_alt): Use
max_loop_iterations to determine if nit + 1 overflows.

* testsuite/libgomp.c/parloops-exit-first-loop-alt-3.c (f): Rewrite
using restrict pointers.
(main): Add arguments to calls to f.
* testsuite/libgomp.c/parloops-exit-first-loop-alt.c: Same.

* gcc.dg/parloops-exit-first-loop-alt-pr66652.c: New test.
* gcc.dg/parloops-exit-first-loop-alt-3.c (f):  Rewrite using restrict
pointers.
* gcc.dg/parloops-exit-first-loop-alt.c: Same.

OK.

Make sure to put the PR marker in the testsuite/ChangeLog entry and drop 
the testsuite/ prefix in the testsuite/ChangeLog entry.


jeff