diff options
author | Diego Novillo <dnovillo@redhat.com> | 2006-01-30 02:37:09 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@redhat.com> | 2006-01-30 02:37:09 +0000 |
commit | b44c6fdc9b5cf57a48f273c990164587ed535224 (patch) | |
tree | 1eb7346589514e00c8d7c85581030929884224ce | |
parent | ad70f0a6d931b172ebf379c2f4be7592a329a7e8 (diff) |
PR 25874
* omp-low.c (execute_expand_omp): Move CFG cleanup code ...
(expand_omp): ... here.
(expand_omp_parallel): Only remove barriers for combined
parallel+workshare constructs.
testsuite/
* g++.dg/gomp/pr25874.C: New test.
* gcc.dg/gomp/pr25874.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gomp-20050608-branch@110392 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.gomp | 8 | ||||
-rw-r--r-- | gcc/omp-low.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.gomp | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/pr25874.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/pr25874.c | 15 |
5 files changed, 67 insertions, 11 deletions
diff --git a/gcc/ChangeLog.gomp b/gcc/ChangeLog.gomp index cb14d290319..70e40a7d64e 100644 --- a/gcc/ChangeLog.gomp +++ b/gcc/ChangeLog.gomp @@ -1,3 +1,11 @@ +2006-01-29 Diego Novillo <dnovillo@redhat.com> + + PR 25874 + * omp-low.c (execute_expand_omp): Move CFG cleanup code ... + (expand_omp): ... here. + (expand_omp_parallel): Only remove barriers for combined + parallel+workshare constructs. + 2006-01-26 Diego Novillo <dnovillo@redhat.com> * Mainline merge as of 2006-01-26 (@110255). diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 93ceb8e2302..38d4224f4bf 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -2279,13 +2279,16 @@ expand_omp_parallel (struct omp_region *region) entry_bb = bb_for_stmt (region->entry); exit_bb = bb_for_stmt (region->exit); - /* Barriers at the end of the function are not necessary and can be - removed. Since the caller will have a barrier of its own, this - one is superfluous. */ - remove_exit_barrier (region); - if (is_combined_parallel (region)) - ws_args = region->ws_args; + { + ws_args = region->ws_args; + + /* For combined parallel+workshare calls, barriers at the end of + the function are not necessary and can be removed. Since the + caller will have a barrier of its own, the workshare barrier is + superfluous. */ + remove_exit_barrier (region); + } else ws_args = NULL_TREE; @@ -3244,6 +3247,13 @@ expand_omp (struct omp_region *region) gcc_unreachable (); } + /* Expansion adds and removes basic block, edges, creates + and exposes unreachable regions that need to be cleaned up + before proceeding. */ + free_dominance_info (CDI_DOMINATORS); + free_dominance_info (CDI_POST_DOMINATORS); + cleanup_tree_cfg (); + region = region->next; } } @@ -3339,12 +3349,7 @@ execute_expand_omp (void) splay_tree_delete (omp_regions); root_omp_region = NULL; omp_regions = NULL; - free_dominance_info (CDI_DOMINATORS); - free_dominance_info (CDI_POST_DOMINATORS); } - - /* Expansion adds basic blocks that may be merged. */ - cleanup_tree_cfg (); } static bool diff --git a/gcc/testsuite/ChangeLog.gomp b/gcc/testsuite/ChangeLog.gomp index 4833bdccbc3..bd0713a17ec 100644 --- a/gcc/testsuite/ChangeLog.gomp +++ b/gcc/testsuite/ChangeLog.gomp @@ -1,3 +1,8 @@ +2006-01-29 Diego Novillo <dnovillo@redhat.com> + + * g++.dg/gomp/pr25874.C: New test. + * gcc.dg/gomp/pr25874.c: New test. + 2006-01-19 Diego Novillo <dnovillo@redhat.com> * g++.dg/gomp/for-4.C: Use -fdump-tree-ompexp. diff --git a/gcc/testsuite/g++.dg/gomp/pr25874.C b/gcc/testsuite/g++.dg/gomp/pr25874.C new file mode 100644 index 00000000000..02adef97f56 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr25874.C @@ -0,0 +1,23 @@ +int foo(); + +struct wigner_d + { + void recurse () { + int dd; + for (int j=0; j<=1; ++j) { +#pragma omp parallel + dd=5; + } + } + }; + +template<typename T> void rotate_alm(T arg) + { + wigner_d rec; + rec.recurse(); +#pragma omp parallel + foo(); + } + +template void rotate_alm(float arg); +template void rotate_alm(double arg); diff --git a/gcc/testsuite/gcc.dg/gomp/pr25874.c b/gcc/testsuite/gcc.dg/gomp/pr25874.c new file mode 100644 index 00000000000..568e1f04f88 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr25874.c @@ -0,0 +1,15 @@ +void foo(); + +inline void bar() +{ + int i; + for ( i=0; i<1; ++i ) +#pragma omp parallel + foo(); +} + +void baz() +{ +#pragma omp parallel + bar(); +} |