From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 660503858D39; Wed, 22 Sep 2021 07:36:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 660503858D39 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-3779] openmp: Fix OpenMP expansion of scope with non-fallthrugh body [PR102415] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: 059b819e3c94aae3dd0be55bd512ee6ee4e28798 X-Git-Newrev: c4432b2776aeeffee9125bf87ff937e4a8907bbd Message-Id: <20210922073651.660503858D39@sourceware.org> Date: Wed, 22 Sep 2021 07:36:51 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Sep 2021 07:36:51 -0000 https://gcc.gnu.org/g:c4432b2776aeeffee9125bf87ff937e4a8907bbd commit r12-3779-gc4432b2776aeeffee9125bf87ff937e4a8907bbd Author: Jakub Jelinek Date: Wed Sep 22 09:32:32 2021 +0200 openmp: Fix OpenMP expansion of scope with non-fallthrugh body [PR102415] I've used function for omp single expansion also for omp scope. That is mostly ok, but as the testcase shows, there is one important difference. The omp single expansion always has a fallthru body, because it during omp lowering expands the body as if wrapped in an if to simulate that one thread runs the body and others wait (unless nowait) until it completes and continue. omp scope is invoked by all threads and so if the body is non-fallthru, the barrier (unless nowait) at the end will not be reached by any of the threads. The following patch fixes that by handling the case where cfg pass optimizes away the exit bb of it gracefully. 2021-09-22 Jakub Jelinek PR middle-end/102415 * omp-expand.c (expand_omp_single): If region->exit is NULL, assert region->entry is GIMPLE_OMP_SCOPE region and return. * c-c++-common/gomp/scope-3.c: New test. Diff: --- gcc/omp-expand.c | 10 ++++++++-- gcc/testsuite/c-c++-common/gomp/scope-3.c | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index 159ae0e1647..496c0e6cdd6 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -8433,11 +8433,17 @@ expand_omp_single (struct omp_region *region) exit_bb = region->exit; si = gsi_last_nondebug_bb (entry_bb); - gcc_assert (gimple_code (gsi_stmt (si)) == GIMPLE_OMP_SINGLE - || gimple_code (gsi_stmt (si)) == GIMPLE_OMP_SCOPE); + enum gimple_code code = gimple_code (gsi_stmt (si)); + gcc_assert (code == GIMPLE_OMP_SINGLE || code == GIMPLE_OMP_SCOPE); gsi_remove (&si, true); single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; + if (exit_bb == NULL) + { + gcc_assert (code == GIMPLE_OMP_SCOPE); + return; + } + si = gsi_last_nondebug_bb (exit_bb); if (!gimple_omp_return_nowait_p (gsi_stmt (si))) { diff --git a/gcc/testsuite/c-c++-common/gomp/scope-3.c b/gcc/testsuite/c-c++-common/gomp/scope-3.c new file mode 100644 index 00000000000..78bb1a3ccb9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/scope-3.c @@ -0,0 +1,21 @@ +/* PR middle-end/102415 */ + +extern +#ifdef __cplusplus +"C" +#endif +void abort (); + +void +foo (void) +{ + #pragma omp scope nowait + abort (); +} + +void +bar (void) +{ + #pragma omp scope + abort (); +}