]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: Handle asm goto in diagnose_sb_2 [PR123876]
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Jan 2026 10:00:41 +0000 (11:00 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Jan 2026 10:00:41 +0000 (11:00 +0100)
We weren't handling asm goto in diagnose_sb_2, so could ICE
on invalid code instead of diagnosing it as invalid.

Note, for C++ the FE already diagnoses that instead of deferring
it will omp-low.cc.

2026-01-30  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/123876
* omp-low.cc (diagnose_sb_2): Handle GIMPLE_ASM.

* gcc.dg/gomp/pr123876.c: New test.

gcc/omp-low.cc
gcc/testsuite/gcc.dg/gomp/pr123876.c [new file with mode: 0644]

index 1444ff4ca43c3e22c786b40dd58b3ba9c51c963a..270a9abee3306f6c1a997ddedb01f4f5b0f4c636 100644 (file)
@@ -15480,6 +15480,19 @@ diagnose_sb_2 (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
       }
       break;
 
+    case GIMPLE_ASM:
+      {
+       gasm *asm_stmt = as_a <gasm *> (stmt);
+       for (unsigned i = 0; i < gimple_asm_nlabels (asm_stmt); ++i)
+         {
+           tree lab = TREE_VALUE (gimple_asm_label_op (asm_stmt, i));
+           n = splay_tree_lookup (all_labels, (splay_tree_key) lab);
+           if (n && diagnose_sb_0 (gsi_p, context, (gimple *) n->value))
+             break;
+         }
+      }
+      break;
+
     case GIMPLE_RETURN:
       diagnose_sb_0 (gsi_p, context, NULL);
       break;
diff --git a/gcc/testsuite/gcc.dg/gomp/pr123876.c b/gcc/testsuite/gcc.dg/gomp/pr123876.c
new file mode 100644 (file)
index 0000000..984c2dc
--- /dev/null
@@ -0,0 +1,69 @@
+/* PR middle-end/123876 */
+
+void
+foo ()
+{
+lab:
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    asm goto ("" : : : : lab);                 /* { dg-error "invalid branch to/from OpenMP structured block" } */
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+   asm goto ("" : : : : lab);                  /* { dg-error "invalid branch to/from OpenMP structured block" } */
+#pragma omp parallel
+  asm goto ("" : : : : lab);                   /* { dg-error "invalid branch to/from OpenMP structured block" } */
+}
+
+void
+bar ()
+{
+lab3:
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    {
+    lab1:
+    lab2:
+      asm goto ("" : : : : lab1, lab2, lab3);  /* { dg-error "invalid branch to/from OpenMP structured block" } */
+    }
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+    {
+    lab4:
+    lab5:
+      asm goto ("" : : : : lab4, lab5, lab3);  /* { dg-error "invalid branch to/from OpenMP structured block" } */
+    }
+#pragma omp parallel
+  {
+  lab6:
+  lab7:
+    asm goto ("" : : : : lab6, lab7, lab3);    /* { dg-error "invalid branch to/from OpenMP structured block" } */
+  }
+}
+
+void
+baz ()
+{
+#pragma omp simd
+  for (int i = 0; i < 4; i++)
+    {
+    lab1:
+    lab2:
+      asm goto ("" : : : : lab1, lab2, lab3);
+    lab3:;
+    }
+#pragma omp for
+  for (int i = 0; i < 4; i++)
+    {
+    lab4:
+    lab5:
+      asm goto ("" : : : : lab4, lab5, lab6);
+    lab6:;
+    }
+#pragma omp parallel
+  {
+  lab7:
+  lab8:
+    asm goto ("" : : : : lab7, lab8, lab9);
+  lab9:;
+  }
+}