diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-10-03 09:29:42 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-10-03 09:29:42 +0200 |
commit | 5771c3915bedb3e92b79a7e81fa5eac751cd7413 (patch) | |
tree | c8064d52e6ef0cbb4a3d77e534901e6b120a766e /libgomp | |
parent | 661fb5ddb8d4232135a61227e7db2d1de8e458ac (diff) | |
download | gcc-5771c3915bedb3e92b79a7e81fa5eac751cd7413.zip gcc-5771c3915bedb3e92b79a7e81fa5eac751cd7413.tar.gz gcc-5771c3915bedb3e92b79a7e81fa5eac751cd7413.tar.bz2 |
re PR libgomp/61200 (internal compiler error: Segmentation fault, assert & openmp)
PR libgomp/61200
* omp-low.c (taskreg_contexts): New variable.
(scan_omp_parallel): Push newly created context into taskreg_contexts
vector and move record layout code to finish_taskreg_scan.
(scan_omp_task): Likewise.
(finish_taskreg_scan): New function.
(execute_lower_omp): Call finish_taskreg_scan on all taskreg_contexts
vector elements and release it.
* c-c++-common/gomp/pr61200.c: New test.
* testsuite/libgomp.c/pr61200.c: New test.
From-SVN: r215835
Diffstat (limited to 'libgomp')
-rw-r--r-- | libgomp/ChangeLog | 5 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr61200.c | 87 |
2 files changed, 92 insertions, 0 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 72caab9..0bf7cbe 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2014-10-03 Jakub Jelinek <jakub@redhat.com> + + PR libgomp/61200 + * testsuite/libgomp.c/pr61200.c: New test. + 2014-09-18 Jakub Jelinek <jakub@redhat.com> PR c++/63248 diff --git a/libgomp/testsuite/libgomp.c/pr61200.c b/libgomp/testsuite/libgomp.c/pr61200.c new file mode 100644 index 0000000..ba3ed37 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr61200.c @@ -0,0 +1,87 @@ +/* PR libgomp/61200 */ +/* { dg-do run } */ + +#include <omp.h> +#include <stdlib.h> +#include <unistd.h> + +volatile int x; + +void +foo () +{ + int var = 1; + int i; + + for (i = 0; i < 2; i++) + { + if (i == 1) + { + #pragma omp parallel num_threads(2) + if (x) + var++; + else + { + #pragma omp single + sleep (2); + } + } + else + { + #pragma omp task shared(var) + { + sleep (1); + var = 2; + } + } + } + #pragma omp taskwait + if (var != 2) + abort (); +} + +void +bar () +{ + int var = 1; + int i; + + for (i = 0; i < 2; i++) + { + if (i == 0) + { + #pragma omp task shared(var) + { + sleep (1); + var = 2; + } + } + else + { + #pragma omp parallel num_threads(2) + if (x) + var++; + else + { + #pragma omp single + sleep (2); + } + } + } + #pragma omp taskwait + if (var != 2) + abort (); +} + +int +main () +{ + omp_set_nested (1); + #pragma omp parallel num_threads(2) + #pragma omp single + foo (); + #pragma omp parallel num_threads(2) + #pragma omp single + bar (); + return 0; +} |