From ca2b131143a3195e603493aadd0a0b4a18ad737f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 27 Jun 2008 21:45:14 +0200 Subject: [PATCH] gimplify.c (omp_is_private): Don't return true if decl is not already private on #pragma omp for or #pragma... * gimplify.c (omp_is_private): Don't return true if decl is not already private on #pragma omp for or #pragma omp parallel for. * gcc.dg/gomp/pr27388-3.c: Adjust dg-final. * testsuite/libgomp.c/loop-10.c: New test. * libgomp.c/loop-3.c (main): Add lastprivate clause. * libgomp.c++/loop-6.C (main): Likewise. From-SVN: r137199 --- gcc/ChangeLog | 3 +++ gcc/gimplify.c | 7 +++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/gomp/pr27388-3.c | 2 +- libgomp/ChangeLog | 4 ++++ libgomp/testsuite/libgomp.c++/loop-6.C | 5 +++-- libgomp/testsuite/libgomp.c/loop-10.c | 30 ++++++++++++++++++++++++++ libgomp/testsuite/libgomp.c/loop-3.c | 5 +++-- 8 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/loop-10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38ce1cff594..ef3bf5fb4fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2008-06-27 Jakub Jelinek + * gimplify.c (omp_is_private): Don't return true if decl + is not already private on #pragma omp for or #pragma omp parallel for. + PR debug/36617 * tree-cfg.c (struct move_stmt_d): Replace block field with orig_block and new_block fields. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 799ccbee52c..c3af34bf27e 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5060,15 +5060,16 @@ omp_is_private (struct gimplify_omp_ctx *ctx, tree decl) error ("iteration variable %qs should not be reduction", IDENTIFIER_POINTER (DECL_NAME (decl))); } - return true; + return (ctx == gimplify_omp_ctxp + || (ctx->region_type == ORT_COMBINED_PARALLEL + && gimplify_omp_ctxp->outer_context == ctx)); } if (ctx->region_type != ORT_WORKSHARE) return false; else if (ctx->outer_context) return omp_is_private (ctx->outer_context, decl); - else - return !is_global_var (decl); + return false; } /* Return true if DECL is private within a parallel region diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 086345b87ca..4ede6dafed7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-06-27 Jakub Jelinek + + * gcc.dg/gomp/pr27388-3.c: Adjust dg-final. + 2008-06-27 Richard Guenther PR tree-optimization/36400 diff --git a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c index a6f4647aa5f..2cddb23c7d8 100644 --- a/gcc/testsuite/gcc.dg/gomp/pr27388-3.c +++ b/gcc/testsuite/gcc.dg/gomp/pr27388-3.c @@ -19,5 +19,5 @@ foo (void) } } -/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 0 "omplower" } } */ +/* { dg-final { scan-tree-dump-times "omp for\[^\\n\]*private" 2 "omplower" } } */ /* { dg-final { cleanup-tree-dump "omplower" } } */ diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 18e1bf7c43a..ad550e8fa33 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,5 +1,9 @@ 2008-06-27 Jakub Jelinek + * testsuite/libgomp.c/loop-10.c: New test. + * libgomp.c/loop-3.c (main): Add lastprivate clause. + * libgomp.c++/loop-6.C (main): Likewise. + PR debug/36617 * testsuite/libgomp.c/debug-1.c: New test. diff --git a/libgomp/testsuite/libgomp.c++/loop-6.C b/libgomp/testsuite/libgomp.c++/loop-6.C index fa26c6892cf..f4a6925a40c 100644 --- a/libgomp/testsuite/libgomp.c++/loop-6.C +++ b/libgomp/testsuite/libgomp.c++/loop-6.C @@ -8,10 +8,11 @@ static int test(void) return ++count > 0; } +int i; + int main() { - int i; - #pragma omp for + #pragma omp for lastprivate (i) for (i = 0; i < 10; ++i) { if (test()) diff --git a/libgomp/testsuite/libgomp.c/loop-10.c b/libgomp/testsuite/libgomp.c/loop-10.c new file mode 100644 index 00000000000..1b42c4bf126 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/loop-10.c @@ -0,0 +1,30 @@ +extern void abort (void); + +int i = 8; + +int main (void) +{ + int j = 7, k = 0; + #pragma omp for + for (i = 0; i < 10; i++) + ; + #pragma omp for + for (j = 0; j < 10; j++) + ; + /* OpenMP 3.0 newly guarantees that the original list items can't + be shared with the privatized omp for iterators, even when + the original list items are already private. */ + if (i != 8 || j != 7) + abort (); + #pragma omp parallel private (i) reduction (+:k) + { + i = 6; + #pragma omp for + for (i = 0; i < 10; i++) + ; + k = (i != 6); + } + if (k) + abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/loop-3.c b/libgomp/testsuite/libgomp.c/loop-3.c index ba3ecdaca3a..f0f9b4705f9 100644 --- a/libgomp/testsuite/libgomp.c/loop-3.c +++ b/libgomp/testsuite/libgomp.c/loop-3.c @@ -8,10 +8,11 @@ static int test(void) return ++count > 0; } +int i; + int main() { - int i; - #pragma omp for + #pragma omp for lastprivate (i) for (i = 0; i < 10; ++i) { if (test()) -- 2.30.2