diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/omp-low.c | 4 | ||||
-rw-r--r-- | libgomp/ChangeLog | 7 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr36802-1.c | 34 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr36802-2.c | 46 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr36802-3.c | 46 |
6 files changed, 141 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b530d25614a..ed541f12220 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-08 Jakub Jelinek <jakub@redhat.com> + + 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 <ebotcazou@adacore.com> * gimple.c (recalculate_side_effects) <tcc_constant>: New case. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 8781418bd82..b7885e6cf3c 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 46536c88381..98a307314a9 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,10 @@ +2008-12-08 Jakub Jelinek <jakub@redhat.com> + + 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 <janis187@us.ibm.com> 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 00000000000..4ed5e12769b --- /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 00000000000..06e792f0f14 --- /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 00000000000..f11baa09f57 --- /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; +} |