From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 528DC3858288; Sat, 24 Sep 2022 07:31:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 528DC3858288 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1664004695; bh=TTHM6p4tuaVm6AXsQIGVcCnRDNfXdkVTjziPbkQ3snM=; h=From:To:Subject:Date:From; b=NZhVS/pgbll+ZLCNTumI7IkQuQ0EGOuXN1l0x7X51lR+y0Ox8AIFBOINEFqovQptw LvxKZ6NpwzTxVR/E/PjmEh54LVnS226Ghr4OjPZJrqaHiTj33Ryl5xpXrFtJqb+7Ly VczHGZnjHx0jMdD7OYxQnpJy756agYX5ifOJXEQ0= 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 r13-2829] openmp: Fix ICE with taskgroup at -O0 -fexceptions [PR107001] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: 3c5bccb608c665ac3f62adb1817c42c845812428 X-Git-Newrev: ad2aab5c816a6fd56b46210c0a4a4c6243da1de9 Message-Id: <20220924073135.528DC3858288@sourceware.org> Date: Sat, 24 Sep 2022 07:31:35 +0000 (GMT) List-Id: https://gcc.gnu.org/g:ad2aab5c816a6fd56b46210c0a4a4c6243da1de9 commit r13-2829-gad2aab5c816a6fd56b46210c0a4a4c6243da1de9 Author: Jakub Jelinek Date: Sat Sep 24 09:24:26 2022 +0200 openmp: Fix ICE with taskgroup at -O0 -fexceptions [PR107001] The following testcase ICEs because with -O0 -fexceptions GOMP_taskgroup_end call isn't directly followed by GOMP_RETURN statement, but there are some conditionals to handle exceptions and we fail to find the correct GOMP_RETURN. The fix is to treat taskgroup similarly to target data, both of these constructs emit a try { body } finally { end_call } around the construct's body during gimplification and we need to see proper construct nesting during gimplification and omp lowering (including nesting of regions checks), but during omp expansion we don't really need their nesting anymore, all we need is emit something at the start of the region and the end of the region is the end API call we've already emitted during gimplification. For target data, we weren't adding GOMP_RETURN statement during omp lowering, so after that pass it is treated merely like stand-alone omp directives. This patch does the same for taskgroup too. 2022-09-24 Jakub Jelinek PR c/107001 * omp-low.cc (lower_omp_taskgroup): Don't add GOMP_RETURN statement at the end. * omp-expand.cc (build_omp_regions_1): Clarify GF_OMP_TARGET_KIND_DATA is not stand-alone directive. For GIMPLE_OMP_TASKGROUP, also don't update parent. (omp_make_gimple_edges) : Reset cur_region back after new_omp_region. * c-c++-common/gomp/pr107001.c: New test. Diff: --- gcc/omp-expand.cc | 17 +++++++++++++++-- gcc/omp-low.cc | 1 - gcc/testsuite/c-c++-common/gomp/pr107001.c | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc index 5cac8dfe634..5dc0bf16e17 100644 --- a/gcc/omp-expand.cc +++ b/gcc/omp-expand.cc @@ -10712,7 +10712,10 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent, case GF_OMP_TARGET_KIND_OACC_ENTER_DATA: case GF_OMP_TARGET_KIND_OACC_EXIT_DATA: case GF_OMP_TARGET_KIND_OACC_DECLARE: - /* ..., other than for those stand-alone directives... */ + /* ..., other than for those stand-alone directives... + To be precise, target data isn't stand-alone, but + gimplifier put the end API call into try finally block + for it, so omp expansion can treat it as such. */ region = NULL; break; default: @@ -10728,6 +10731,11 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent, && gimple_omp_task_taskwait_p (stmt)) /* #pragma omp taskwait depend(...) is a stand-alone directive. */ region = NULL; + else if (code == GIMPLE_OMP_TASKGROUP) + /* #pragma omp taskgroup isn't a stand-alone directive, but + gimplifier put the end API call into try finall block + for it, so omp expansion can treat it as such. */ + region = NULL; /* ..., this directive becomes the parent for a new region. */ if (region) parent = region; @@ -10927,13 +10935,18 @@ omp_make_gimple_edges (basic_block bb, struct omp_region **region, case GIMPLE_OMP_MASTER: case GIMPLE_OMP_MASKED: case GIMPLE_OMP_SCOPE: - case GIMPLE_OMP_TASKGROUP: case GIMPLE_OMP_CRITICAL: case GIMPLE_OMP_SECTION: cur_region = new_omp_region (bb, code, cur_region); fallthru = true; break; + case GIMPLE_OMP_TASKGROUP: + cur_region = new_omp_region (bb, code, cur_region); + fallthru = true; + cur_region = cur_region->outer; + break; + case GIMPLE_OMP_TASK: cur_region = new_omp_region (bb, code, cur_region); fallthru = true; diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc index f0469d20b3d..d9f9aaebc0b 100644 --- a/gcc/omp-low.cc +++ b/gcc/omp-low.cc @@ -9724,7 +9724,6 @@ lower_omp_taskgroup (gimple_stmt_iterator *gsi_p, omp_context *ctx) gimple_bind_add_seq (bind, gimple_omp_body (stmt)); gimple_omp_set_body (stmt, NULL); - gimple_bind_add_stmt (bind, gimple_build_omp_return (true)); gimple_bind_add_seq (bind, dseq); pop_gimplify_context (bind); diff --git a/gcc/testsuite/c-c++-common/gomp/pr107001.c b/gcc/testsuite/c-c++-common/gomp/pr107001.c new file mode 100644 index 00000000000..9c19d9b8745 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr107001.c @@ -0,0 +1,14 @@ +/* PR c/107001 */ +/* { dg-do compile } */ +/* { dg-options "-O0 -fopenmp -fexceptions" } */ +/* { dg-require-effective-target exceptions } */ + +void bar (void); +void foo (void) +{ + #pragma omp taskgroup + { + #pragma omp taskgroup + bar (); + } +}