]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP: Unshare expr in context-selector condition [PR121922]
authorTobias Burnus <tburnus@baylibre.com>
Thu, 18 Sep 2025 09:07:50 +0000 (11:07 +0200)
committerTobias Burnus <tburnus@baylibre.com>
Thu, 18 Sep 2025 09:07:50 +0000 (11:07 +0200)
As the testcase shows, a missing unshare_expr caused that the condition
was only evaluated once instead of every time when a 'declare variant'
was resolved.

PR middle-end/121922

gcc/ChangeLog:

* omp-general.cc (omp_dynamic_cond): Use 'unshare_expr' for
the user condition.

libgomp/ChangeLog:

* testsuite/libgomp.c-c++-common/declare-variant-1.c: New test.

Co-authored-by: Sandra Loosemore <sloosemore@baylibre.com>
gcc/omp-general.cc
libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c [new file with mode: 0644]

index c799b8936f99562f16ddc65c554dff7aa3a3dcc2..973b246cfdb85680ef2224f85cd629f261666104 100644 (file)
@@ -2733,7 +2733,7 @@ omp_dynamic_cond (tree ctx, tree supercontext)
 
       /* The user condition is not dynamic if it is constant.  */
       if (!tree_fits_shwi_p (expr))
-       user_cond = expr;
+       user_cond = unshare_expr (expr);
     }
 
   /* Build the "target_device" part of the dynamic selector.  In the
diff --git a/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c b/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c
new file mode 100644 (file)
index 0000000..b6fc40e
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fdump-tree-gimple" } */
+
+/* PR middle-end/121922  */
+
+/* Failed to re-check the global flag due to tree sharing.  */
+
+extern int flag;
+int flag = 0;
+
+int
+test_with_flag ()
+{
+  return flag;
+}
+
+#pragma omp declare variant (test_with_flag) match (user={condition(score(10): flag > 1)})
+int
+test ()
+{
+  return 0;
+}
+
+void
+doit ()
+{
+  flag = 0;
+  if (test () != 0) __builtin_abort ();
+  flag = 1;
+  if (test () != 0) __builtin_abort ();
+  flag = 42;
+  if (test () != 42) __builtin_abort ();
+}
+
+int main ()
+{
+  doit ();
+}
+
+/* { dg-final { scan-tree-dump-times "flag\\.\[^=\]*= flag;\[\n\r\]+ *if \\(flag\\.\[^>\]*> 1\\)" 3 "gimple" } } */