From 97c1d2fa97afc59b02d2894b88069136145603e2 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 18 Sep 2025 11:07:50 +0200 Subject: [PATCH] OpenMP: Unshare expr in context-selector condition [PR121922] 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 --- gcc/omp-general.cc | 2 +- .../libgomp.c-c++-common/declare-variant-1.c | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc index c799b8936f9..973b246cfdb 100644 --- a/gcc/omp-general.cc +++ b/gcc/omp-general.cc @@ -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 index 00000000000..b6fc40ed46d --- /dev/null +++ b/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c @@ -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" } } */ -- 2.47.3