From 2514265077f4260ae10377791317c6754b3292df Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 29 Jul 2011 19:45:42 +0200 Subject: [PATCH] re PR middle-end/49897 (nesting lastprivate gives incorrect result) PR middle-end/49897 PR middle-end/49898 * omp-low.c (use_pointer_for_field): If disallowing copy-in/out in nested parallel and outer is a gimple_reg, mark it as addressable and set its bit in task_shared_vars bitmap too. * testsuite/libgomp.c/pr49897-1.c: New test. * testsuite/libgomp.c/pr49897-2.c: New test. * testsuite/libgomp.c/pr49898-1.c: New test. * testsuite/libgomp.c/pr49898-2.c: New test. From-SVN: r176945 --- gcc/ChangeLog | 8 +++++++ gcc/omp-low.c | 6 +++-- libgomp/ChangeLog | 9 +++++++ libgomp/testsuite/libgomp.c/pr49897-1.c | 31 +++++++++++++++++++++++++ libgomp/testsuite/libgomp.c/pr49897-2.c | 25 ++++++++++++++++++++ libgomp/testsuite/libgomp.c/pr49898-1.c | 26 +++++++++++++++++++++ libgomp/testsuite/libgomp.c/pr49898-2.c | 18 ++++++++++++++ 7 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/pr49897-1.c create mode 100644 libgomp/testsuite/libgomp.c/pr49897-2.c create mode 100644 libgomp/testsuite/libgomp.c/pr49898-1.c create mode 100644 libgomp/testsuite/libgomp.c/pr49898-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 738144dac20..de9803404ed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-07-29 Jakub Jelinek + + PR middle-end/49897 + PR middle-end/49898 + * omp-low.c (use_pointer_for_field): If disallowing copy-in/out + in nested parallel and outer is a gimple_reg, mark it as addressable + and set its bit in task_shared_vars bitmap too. + 2011-07-29 Uros Bizjak * config/i386/predicates.md (tp_or_register_operand): Remove predicate. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index ccd248c9fe8..0376d927f02 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -781,7 +781,7 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) break; if (c) - return true; + goto maybe_mark_addressable_and_ret; } } @@ -791,7 +791,9 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) returns, the task hasn't necessarily terminated. */ if (!TREE_READONLY (decl) && is_task_ctx (shared_ctx)) { - tree outer = maybe_lookup_decl_in_outer_ctx (decl, shared_ctx); + tree outer; + maybe_mark_addressable_and_ret: + outer = maybe_lookup_decl_in_outer_ctx (decl, shared_ctx); if (is_gimple_reg (outer)) { /* Taking address of OUTER in lower_send_shared_vars diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 19c88fbb8fb..292d58a570b 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,12 @@ +2011-07-29 Jakub Jelinek + + PR middle-end/49897 + PR middle-end/49898 + * testsuite/libgomp.c/pr49897-1.c: New test. + * testsuite/libgomp.c/pr49897-2.c: New test. + * testsuite/libgomp.c/pr49898-1.c: New test. + * testsuite/libgomp.c/pr49898-2.c: New test. + 2011-07-28 H.J. Lu * testsuite/lib/libgomp.exp (libgomp_init): Add -march=i486 diff --git a/libgomp/testsuite/libgomp.c/pr49897-1.c b/libgomp/testsuite/libgomp.c/pr49897-1.c new file mode 100644 index 00000000000..d21a26252b9 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr49897-1.c @@ -0,0 +1,31 @@ +/* PR middle-end/49897 */ +/* { dg-do run } */ + +extern void abort (void); + +int +main () +{ + int i, j, x = 0, y, sum = 0; +#pragma omp parallel reduction(+:sum) + { + #pragma omp for firstprivate(x) lastprivate(x, y) + for (i = 0; i < 10; i++) + { + x = i; + y = 0; + #pragma omp parallel reduction(+:sum) + { + #pragma omp for firstprivate(y) lastprivate(y) + for (j = 0; j < 10; j++) + { + y = j; + sum += y; + } + } + } + } + if (x != 9 || y != 9 || sum != 450) + abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr49897-2.c b/libgomp/testsuite/libgomp.c/pr49897-2.c new file mode 100644 index 00000000000..c9ea5eced86 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr49897-2.c @@ -0,0 +1,25 @@ +/* PR middle-end/49897 */ +/* { dg-do run } */ + +extern void abort (void); + +int +main () +{ + int i, j, x = 0, y, sum = 0; +#pragma omp parallel for reduction(+:sum) firstprivate(x) lastprivate(x, y) + for (i = 0; i < 10; i++) + { + x = i; + y = 0; + #pragma omp parallel for reduction(+:sum) firstprivate(y) lastprivate(y) + for (j = 0; j < 10; j++) + { + y = j; + sum += y; + } + } + if (x != 9 || y != 9 || sum != 450) + abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr49898-1.c b/libgomp/testsuite/libgomp.c/pr49898-1.c new file mode 100644 index 00000000000..175426d4000 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr49898-1.c @@ -0,0 +1,26 @@ +/* PR middle-end/49898 */ +/* { dg-do run } */ + +extern void abort (void); + +int +main () +{ + int i, j, sum = 0; +#pragma omp parallel + { + #pragma omp for reduction(+:sum) + for (i = 0; i < 10; i++) + { + #pragma omp parallel + { + #pragma omp for reduction(+:sum) + for (j = 0; j < 10; j++) + sum += j; + } + } + } + if (sum != 450) + abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr49898-2.c b/libgomp/testsuite/libgomp.c/pr49898-2.c new file mode 100644 index 00000000000..03ba0f8ffa0 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr49898-2.c @@ -0,0 +1,18 @@ +/* PR middle-end/49898 */ +/* { dg-do run } */ + +extern void abort (void); + +int +main () +{ + int i, j, sum = 0; +#pragma omp parallel for reduction(+:sum) + for (i = 0; i < 10; i++) + #pragma omp parallel for reduction(+:sum) + for (j = 0; j < 10; j++) + sum += j; + if (sum != 450) + abort (); + return 0; +} -- 2.30.2