diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/omp-low.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/combined-1.c | 24 |
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d038634..6c20ca46 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2007-12-19 Zdenek Dvorak <ook@ucw.cz> + * omp-low.c (build_omp_regions_1): Recognition of combined parallels + moved ... + (expand_omp): ... here. + +2007-12-19 Zdenek Dvorak <ook@ucw.cz> + PR tree-optimization/34355 * tree-parloops.c (take_address_of): Handle expresions instead of just variables. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 5323ec2..36fb13d 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -3952,6 +3952,11 @@ expand_omp (struct omp_region *region) { while (region) { + /* First, determine whether this is a combined parallel+workshare + region. */ + if (region->type == OMP_PARALLEL) + determine_parallel_type (region); + if (region->inner) expand_omp (region->inner); @@ -4028,11 +4033,6 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent, region = parent; region->exit = bb; parent = parent->outer; - - /* If REGION is a parallel region, determine whether it is - a combined parallel+workshare region. */ - if (region->type == OMP_PARALLEL) - determine_parallel_type (region); } else if (code == OMP_ATOMIC_STORE) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 024867a..38a492e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2007-12-19 Zdenek Dvorak <ook@ucw.cz> + * gcc.dg/gomp/combined-1.c: New test. + +2007-12-19 Zdenek Dvorak <ook@ucw.cz> + PR tree-optimization/34355 * g++.dg/tree-ssa/pr34355.C: New test. diff --git a/gcc/testsuite/gcc.dg/gomp/combined-1.c b/gcc/testsuite/gcc.dg/gomp/combined-1.c new file mode 100644 index 0000000..fc86a9b --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/combined-1.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fopenmp -fdump-tree-final_cleanup" } */ + +int a[10]; +int foo (void) +{ + int i; +#pragma omp parallel for schedule(runtime) + for (i = 0; i < 10; i++) + a[i] = i; +#pragma omp parallel +#pragma omp for schedule(runtime) + for (i = 0; i < 10; i++) + a[i] = 10 - i; +#pragma omp parallel + { +#pragma omp for schedule(runtime) + for (i = 0; i < 10; i++) + a[i] = i; + } +} + +/* { dg-final { scan-tree-dump-times "__builtin_GOMP_parallel_loop_runtime_start" 3 "final_cleanup" } } */ +/* { dg-final { cleanup-tree-dump "final_cleanup" } } */ |