diff options
author | Paul-Antoine Arras <parras@baylibre.com> | 2025-01-06 17:00:10 +0100 |
---|---|---|
committer | Paul-Antoine Arras <parras@baylibre.com> | 2025-01-07 16:01:44 +0100 |
commit | aa688dd6302fd9fd4a6ede232bbe63781e672ae9 (patch) | |
tree | a220bae1e424d0e3d583c8c894f11f25224a511d | |
parent | 405c99c17210a58df1adddd237219e773e689f17 (diff) | |
download | gcc-aa688dd6302fd9fd4a6ede232bbe63781e672ae9.zip gcc-aa688dd6302fd9fd4a6ede232bbe63781e672ae9.tar.gz gcc-aa688dd6302fd9fd4a6ede232bbe63781e672ae9.tar.bz2 |
Only apply adjust_args in OpenMP dispatch if variant substitution occurs
This is a followup to
084ea8ad584 OpenMP: middle-end support for dispatch + adjust_args.
This patch fixes a bug that caused arguments in an OpenMP dispatch call to be
modified even when no variant substitution occurred.
gcc/ChangeLog:
* gimplify.cc (gimplify_call_expr): Create variable
variant_substituted_p to control whether adjust_args applies.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/adjust-args-4.c: New test.
-rw-r--r-- | gcc/gimplify.cc | 13 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/adjust-args-4.c | 24 |
2 files changed, 33 insertions, 4 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index bd324be..251d581 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -3857,7 +3857,8 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value) enum gimplify_status ret; int i, nargs; gcall *call; - bool builtin_va_start_p = false, omp_dispatch_p = false; + bool builtin_va_start_p = false, omp_dispatch_p = false, + variant_substituted_p = false; location_t loc = EXPR_LOCATION (*expr_p); gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR); @@ -4035,7 +4036,10 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value) { tree variant = omp_resolve_declare_variant (fndecl); if (variant != fndecl) - CALL_EXPR_FN (*expr_p) = build1 (ADDR_EXPR, fnptrtype, variant); + { + CALL_EXPR_FN (*expr_p) = build1 (ADDR_EXPR, fnptrtype, variant); + variant_substituted_p = true; + } } /* There is a sequence point before the call, so any side effects in @@ -4325,8 +4329,9 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value) } } - if ((need_device_ptr && !is_device_ptr) - || (need_device_addr && !has_device_addr)) + if (variant_substituted_p + && ((need_device_ptr && !is_device_ptr) + || (need_device_addr && !has_device_addr))) { if (dispatch_device_num == NULL_TREE) { diff --git a/gcc/testsuite/c-c++-common/gomp/adjust-args-4.c b/gcc/testsuite/c-c++-common/gomp/adjust-args-4.c new file mode 100644 index 0000000..377932e --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/adjust-args-4.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fdump-tree-gimple" } */ + +/* Ensure that adjust_args is only applied when variant substitution happens. */ + +void h(int *); +void f(int *); +#pragma omp declare variant(f) match(construct={dispatch}) adjust_args(need_device_ptr : x) +void g(int *x); + +void foo(int *y) +{ + #pragma omp dispatch + h(y); + #pragma omp dispatch + f(y); + #pragma omp dispatch + g(y); +} + +/* { dg-final { scan-tree-dump-times "h \\(y\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "f \\(y\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "D\.\[0-9]+ = __builtin_omp_get_mapped_ptr \\(y, D\.\[0-9]+\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "f \\(D\.\[0-9]+\\);" 1 "gimple" } } */ |