From 3ff2d74e9cfb4342f610b058eab400d3fde55f56 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sat, 29 Aug 2015 07:07:51 +0000 Subject: [PATCH] Handle mix/max pointer reductions in parloops 2015-08-29 Tom de Vries PR tree-optimization/46193 * omp-low.c (omp_reduction_init): Handle pointer type for min or max clause. * gcc.dg/autopar/pr46193.c: New test. * testsuite/libgomp.c/pr46193.c: New test. From-SVN: r227315 --- gcc/ChangeLog | 6 +++ gcc/omp-low.c | 12 +++++ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.dg/autopar/pr46193.c | 38 +++++++++++++++ libgomp/ChangeLog | 5 ++ libgomp/testsuite/libgomp.c/pr46193.c | 67 ++++++++++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/autopar/pr46193.c create mode 100644 libgomp/testsuite/libgomp.c/pr46193.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de7f36775ee..492ca7d05f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-08-29 Tom de Vries + + PR tree-optimization/46193 + * omp-low.c (omp_reduction_init): Handle pointer type for min or max + clause. + 2015-08-28 Jeff Law PR lto/66752 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 19f34ec4f07..aa2a598238d 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -3412,6 +3412,12 @@ omp_reduction_init (tree clause, tree type) real_maxval (&min, 1, TYPE_MODE (type)); return build_real (type, min); } + else if (POINTER_TYPE_P (type)) + { + wide_int min + = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type)); + return wide_int_to_tree (type, min); + } else { gcc_assert (INTEGRAL_TYPE_P (type)); @@ -3428,6 +3434,12 @@ omp_reduction_init (tree clause, tree type) real_maxval (&max, 0, TYPE_MODE (type)); return build_real (type, max); } + else if (POINTER_TYPE_P (type)) + { + wide_int max + = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type)); + return wide_int_to_tree (type, max); + } else { gcc_assert (INTEGRAL_TYPE_P (type)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 59bf25348e5..08e40831238 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-29 Tom de Vries + + PR tree-optimization/46193 + * gcc.dg/autopar/pr46193.c: New test. + 2015-08-28 Nathan Sidwell * gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c: Simply diff --git a/gcc/testsuite/gcc.dg/autopar/pr46193.c b/gcc/testsuite/gcc.dg/autopar/pr46193.c new file mode 100644 index 00000000000..544a5dabcec --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/pr46193.c @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ + +extern void abort (void); + +char * +foo (int count, char **list) +{ + char *minaddr = list[0]; + int i; + + for (i = 0; i < count; i++) + { + char *addr = list[i]; + if (addr < minaddr) + minaddr = addr; + } + + return minaddr; +} + +char * +foo2 (int count, char **list) +{ + char *maxaddr = list[0]; + int i; + + for (i = 0; i < count; i++) + { + char *addr = list[i]; + if (addr > maxaddr) + maxaddr = addr; + } + + return maxaddr; +} + +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 2 "parloops" } } */ diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 39c67aff423..71e1fbaae42 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2015-08-29 Tom de Vries + + PR tree-optimization/46193 + * testsuite/libgomp.c/pr46193.c: New test. + 2015-08-24 Nathan Sidwell libgomp/ diff --git a/libgomp/testsuite/libgomp.c/pr46193.c b/libgomp/testsuite/libgomp.c/pr46193.c new file mode 100644 index 00000000000..1e27faf8500 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr46193.c @@ -0,0 +1,67 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=2" } */ + +extern void abort (void); + +char * +foo (int count, char **list) +{ + char *minaddr = list[0]; + int i; + + for (i = 0; i < count; i++) + { + char *addr = list[i]; + if (addr < minaddr) + minaddr = addr; + } + + return minaddr; +} + +char * +foo2 (int count, char **list) +{ + char *maxaddr = list[0]; + int i; + + for (i = 0; i < count; i++) + { + char *addr = list[i]; + if (addr > maxaddr) + maxaddr = addr; + } + + return maxaddr; +} + +#define N 5 + +static void +init (char **list) +{ + int i; + for (i = 0; i < N; ++i) + list[i] = (char *)&list[i]; +} + +int +main (void) +{ + char *list[N]; + char * res; + + init (list); + + res = foo (N, list); + + if (res != (char *)&list[0]) + abort (); + + res = foo2 (N, list); + + if (res != (char *)&list[N-1]) + abort (); + + return 0; +}