diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-04-20 03:42:24 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-04-20 03:42:24 +0200 |
commit | 843110834c557d7a68c11c9313d426301ca65dc1 (patch) | |
tree | dc9ea5ac797c8fd972ac87c8f46f262df1197ae8 | |
parent | 743af9719d3413ce7d8e9239d8e280f9b7082f9a (diff) | |
download | gcc-843110834c557d7a68c11c9313d426301ca65dc1.zip gcc-843110834c557d7a68c11c9313d426301ca65dc1.tar.gz gcc-843110834c557d7a68c11c9313d426301ca65dc1.tar.bz2 |
re PR middle-end/70680 (OpenMP SIMD linear variable privatized too eagerly)
PR middle-end/70680
* gimplify.c (gimplify_omp_for): Call omp_notice_variable for
implicitly linear or lastprivate iterator on the outer context.
* testsuite/libgomp.c/pr70680-1.c: New test.
* testsuite/libgomp.c/pr70680-2.c: New test.
From-SVN: r235232
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gimplify.c | 10 | ||||
-rw-r--r-- | libgomp/ChangeLog | 6 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr70680-1.c | 75 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr70680-2.c | 79 |
5 files changed, 174 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 306de52..30da178 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-04-19 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/70680 + * gimplify.c (gimplify_omp_for): Call omp_notice_variable for + implicitly linear or lastprivate iterator on the outer context. + 2016-04-19 H.J. Lu <hongjiu.lu@intel.com> * config/i386/i386.c (ix86_legitimate_combined_insn): Remove diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 99c9760..e223e59 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8785,7 +8785,10 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) decl, false)) ; else if (outer->region_type != ORT_COMBINED_PARALLEL) - outer = NULL; + { + omp_notice_variable (outer, decl, true); + outer = NULL; + } if (outer) { n = splay_tree_lookup (outer->variables, @@ -8868,7 +8871,10 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) decl, false)) ; else if (outer->region_type != ORT_COMBINED_PARALLEL) - outer = NULL; + { + omp_notice_variable (outer, decl, true); + outer = NULL; + } if (outer) { n = splay_tree_lookup (outer->variables, diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 1c82e5d..167374a 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,9 @@ +2016-04-19 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/70680 + * testsuite/libgomp.c/pr70680-1.c: New test. + * testsuite/libgomp.c/pr70680-2.c: New test. + 2016-04-14 Cesar Philippidis <cesar@codesourcery.com> * testsuite/libgomp.oacc-fortran/non-scalar-data.f90: Don't diff --git a/libgomp/testsuite/libgomp.c/pr70680-1.c b/libgomp/testsuite/libgomp.c/pr70680-1.c new file mode 100644 index 0000000..389fdd3 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr70680-1.c @@ -0,0 +1,75 @@ +/* PR middle-end/70680 */ + +int v; + +void +f1 (void) +{ + int i = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd + for (i = 0; i < 100; i++) + ; + v = i; + } + if (i != 100) + __builtin_abort (); +} + +void +f2 (void) +{ + int i = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd + for (i = 0; i < 100; i++) + ; + } + if (i != 100) + __builtin_abort (); +} + +void +f3 (void) +{ + int i = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd linear(i: 1) + for (i = 0; i < 100; i++) + ; + v = i; + } + if (i != 100) + __builtin_abort (); +} + +void +f4 (void) +{ + int i = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd linear(i: 1) + for (i = 0; i < 100; i++) + ; + } + if (i != 100) + __builtin_abort (); +} + +int +main () +{ + f1 (); + if (v++ != 100) + __builtin_abort (); + f2 (); + f3 (); + if (v++ != 100) + __builtin_abort (); + f4 (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr70680-2.c b/libgomp/testsuite/libgomp.c/pr70680-2.c new file mode 100644 index 0000000..0aada78 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr70680-2.c @@ -0,0 +1,79 @@ +/* PR middle-end/70680 */ + +int v; + +void +f1 (void) +{ + int i = 0, j = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd collapse(2) + for (i = 0; i < 10; i++) + for (j = 0; j < 10; j++) + ; + v = i + j; + } + if (i != 10 || j != 10) + __builtin_abort (); +} + +void +f2 (void) +{ + int i = 0, j = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd collapse(2) + for (i = 0; i < 10; i++) + for (j = 0; j < 10; j++) + ; + } + if (i != 10 || j != 10) + __builtin_abort (); +} + +void +f3 (void) +{ + int i = 0, j = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd collapse(2) lastprivate (i, j) + for (i = 0; i < 10; i++) + for (j = 0; j < 10; j++) + ; + v = i + j; + } + if (i != 10 || j != 10) + __builtin_abort (); +} + +void +f4 (void) +{ + int i = 0, j = 0; +#pragma omp task default(shared) if(0) + { +#pragma omp simd collapse(2) lastprivate (i, j) + for (i = 0; i < 10; i++) + for (j = 0; j < 10; j++) + ; + } + if (i != 10 || j != 10) + __builtin_abort (); +} + +int +main () +{ + f1 (); + if (v++ != 20) + __builtin_abort (); + f2 (); + f3 (); + if (v++ != 20) + __builtin_abort (); + f4 (); + return 0; +} |