]> gcc.gnu.org Git - gcc.git/commitdiff
openmp: Fix ICE with taskgroup at -O0 -fexceptions [PR107001]
authorJakub Jelinek <jakub@redhat.com>
Sat, 24 Sep 2022 07:24:26 +0000 (09:24 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 3 May 2023 11:30:46 +0000 (13:30 +0200)
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  <jakub@redhat.com>

PR c/107001
* omp-low.c (lower_omp_taskgroup): Don't add GOMP_RETURN statement
at the end.
* omp-expand.c (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) <case GIMPLE_OMP_TASKGROUP>: Reset
cur_region back after new_omp_region.

* c-c++-common/gomp/pr107001.c: New test.

(cherry picked from commit ad2aab5c816a6fd56b46210c0a4a4c6243da1de9)

gcc/omp-expand.c
gcc/omp-low.c
gcc/testsuite/c-c++-common/gomp/pr107001.c [new file with mode: 0644]

index af4059cc2ab4eb3c853469f9facc54825c103704..3ca9300d41a4ffb218d822a3e31c492dbcf6b21d 100644 (file)
@@ -8973,7 +8973,10 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent,
                case GF_OMP_TARGET_KIND_OACC_UPDATE:
                case GF_OMP_TARGET_KIND_OACC_ENTER_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:
@@ -8991,6 +8994,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;
@@ -9185,7 +9193,6 @@ omp_make_gimple_edges (basic_block bb, struct omp_region **region,
     case GIMPLE_OMP_SINGLE:
     case GIMPLE_OMP_TEAMS:
     case GIMPLE_OMP_MASTER:
-    case GIMPLE_OMP_TASKGROUP:
     case GIMPLE_OMP_CRITICAL:
     case GIMPLE_OMP_SECTION:
     case GIMPLE_OMP_GRID_BODY:
@@ -9193,6 +9200,12 @@ omp_make_gimple_edges (basic_block bb, struct omp_region **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;
index f9aa39308036baaca10e6131ba171fb7f99b297e..0b367998ce7e29556bebeddba9653af4760dd231 100644 (file)
@@ -8833,7 +8833,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 (file)
index 0000000..9c19d9b
--- /dev/null
@@ -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 ();
+  }
+}
This page took 0.086742 seconds and 5 git commands to generate.