From 8d9c1aec9dbce27caf524d863e461b6471d2c1d6 Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Mon, 30 Jan 2006 03:11:29 +0000 Subject: [PATCH] re PR c++/25874 ([gomp] ICE in calc_dfs_tree()) 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. * gcc.dg/gomp/pr25874.c: New test. From-SVN: r110393 --- gcc/ChangeLog | 8 ++++++++ gcc/omp-low.c | 27 ++++++++++++++++----------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/gomp/pr25874.c | 15 +++++++++++++++ 4 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gomp/pr25874.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de75a3b5c7b..42fe910837a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-01-29 Diego Novillo + + 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-29 Eric Botcazou Revert 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 b/gcc/testsuite/ChangeLog index ecfd75caca5..5d9b87bbc28 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-01-29 Diego Novillo + + * gcc.dg/gomp/pr25874.c: New test. + 2006-01-29 Dorit Nuzman PR tree-opt/25911 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(); +} -- 2.30.2