aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2006-01-30 02:37:09 +0000
committerDiego Novillo <dnovillo@redhat.com>2006-01-30 02:37:09 +0000
commitb44c6fdc9b5cf57a48f273c990164587ed535224 (patch)
tree1eb7346589514e00c8d7c85581030929884224ce
parentad70f0a6d931b172ebf379c2f4be7592a329a7e8 (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.gomp8
-rw-r--r--gcc/omp-low.c27
-rw-r--r--gcc/testsuite/ChangeLog.gomp5
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr25874.C23
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr25874.c15
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();
+}