From 0cb159ec52b4176ce3132ffaba7ff46fcf78ac92 Mon Sep 17 00:00:00 2001 From: jakub Date: Mon, 8 Dec 2008 10:36:01 +0000 Subject: [PATCH] PR middle-end/36802 * omp-low.c (use_pointer_for_field): Only call maybe_lookup_decl on parallel and task contexts. * testsuite/libgomp.c/pr36802-1.c: New test. * testsuite/libgomp.c/pr36802-2.c: New test. * testsuite/libgomp.c/pr36802-3.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142546 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++++ gcc/omp-low.c | 4 +-- libgomp/ChangeLog | 7 +++++ libgomp/testsuite/libgomp.c/pr36802-1.c | 34 ++++++++++++++++++++++++ libgomp/testsuite/libgomp.c/pr36802-2.c | 46 +++++++++++++++++++++++++++++++++ libgomp/testsuite/libgomp.c/pr36802-3.c | 46 +++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/pr36802-1.c create mode 100644 libgomp/testsuite/libgomp.c/pr36802-2.c create mode 100644 libgomp/testsuite/libgomp.c/pr36802-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b530d25..ed541f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-08 Jakub Jelinek + + PR middle-end/36802 + * omp-low.c (use_pointer_for_field): Only call maybe_lookup_decl + on parallel and task contexts. + 2008-12-07 Eric Botcazou * gimple.c (recalculate_side_effects) : New case. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 8781418..b7885e6 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -760,10 +760,10 @@ use_pointer_for_field (tree decl, omp_context *shared_ctx) omp_context *up; for (up = shared_ctx->outer; up; up = up->outer) - if (maybe_lookup_decl (decl, up)) + if (is_taskreg_ctx (up) && maybe_lookup_decl (decl, up)) break; - if (up && is_taskreg_ctx (up)) + if (up) { tree c; diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 46536c8..98a3073 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,10 @@ +2008-12-08 Jakub Jelinek + + PR middle-end/36802 + * testsuite/libgomp.c/pr36802-1.c: New test. + * testsuite/libgomp.c/pr36802-2.c: New test. + * testsuite/libgomp.c/pr36802-3.c: New test. + 2008-12-01 Janis Johnson PR libgomp/38270 diff --git a/libgomp/testsuite/libgomp.c/pr36802-1.c b/libgomp/testsuite/libgomp.c/pr36802-1.c new file mode 100644 index 0000000..4ed5e12 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr36802-1.c @@ -0,0 +1,34 @@ +/* PR middle-end/36802 */ + +extern void abort (void); + +int +foo (int k) +{ + int i = 0; +#pragma omp parallel + #pragma omp single + { + if (!k) + { + int j; + for (j = 0; j < 10; j++) + #pragma omp task + if (j == 4) + i++; + } + else + i++; + } + return i; +} + +int +main (void) +{ + if (foo (0) != 1) + abort (); + if (foo (1) != 1) + abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr36802-2.c b/libgomp/testsuite/libgomp.c/pr36802-2.c new file mode 100644 index 0000000..06e792f --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr36802-2.c @@ -0,0 +1,46 @@ +/* PR middle-end/36802 */ + +extern void abort (void); + +int q; + +int +foo (int k) +{ + int i = 6, n = 0; + omp_set_dynamic (0); + omp_set_nested (1); +#pragma omp parallel shared (i) num_threads (3) + { + int l; + + if (omp_get_num_threads () != 3) + #pragma omp atomic + n += 1; + else + #pragma omp for + for (l = 0; l < 3; l++) + if (k) + #pragma omp atomic + q += i; + else + #pragma omp parallel shared (i) num_threads (4) + { + if (omp_get_num_threads () != 4) + #pragma omp atomic + n += 1; + #pragma omp critical + i += 1; + } + } + if (n == 0 && i != 6 + 3 * 4) + abort (); + return 0; +} + +int +main (void) +{ + foo (0); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr36802-3.c b/libgomp/testsuite/libgomp.c/pr36802-3.c new file mode 100644 index 0000000..f11baa0 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr36802-3.c @@ -0,0 +1,46 @@ +/* PR middle-end/36802 */ + +extern void abort (void); + +int q; + +int +foo (int k) +{ + int i = 6, n = 0; + omp_set_dynamic (0); + omp_set_nested (1); +#pragma omp parallel shared (i) num_threads (3) + { + int l; + + if (omp_get_num_threads () != 3) + #pragma omp atomic + n += 1; + else + #pragma omp for + for (l = 0; l < 3; l++) + if (!k) + #pragma omp parallel shared (i) num_threads (4) + { + if (omp_get_num_threads () != 4) + #pragma omp atomic + n += 1; + #pragma omp critical + i += 1; + } + else + #pragma omp atomic + q += i; + } + if (n == 0 && i != 6 + 3 * 4) + abort (); + return 0; +} + +int +main (void) +{ + foo (0); + return 0; +} -- 2.7.4