https://gcc.gnu.org/g:181a186a4a77e67285a7fe8375ac6c381378dfa6
commit 181a186a4a77e67285a7fe8375ac6c381378dfa6 Author: Tobias Burnus <tbur...@baylibre.com> Date: Tue Jan 28 13:01:33 2025 +0100 OpenMP: Skip declare_variant's append_args it not variant substituted Follow up to r15-6658-gaa688dd6302fd9 that handles the same for declare_variant's adjust_args. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): Disable variant function's append_args in 'omp dispatch' when invoking the variant directly and not through the base function. gcc/testsuite/ChangeLog: * c-c++-common/gomp/append-args-4.c: New test. * c-c++-common/gomp/append-args-5.c: New test. (cherry picked from commit f79f5b87efc690abc3b8d1b0f927f9348157348b) Diff: --- gcc/ChangeLog.omp | 9 ++++ gcc/cp/ChangeLog | 13 +++++ gcc/gimplify.cc | 17 ++++-- gcc/testsuite/ChangeLog.omp | 8 +++ gcc/testsuite/c-c++-common/gomp/append-args-4.c | 71 +++++++++++++++++++++++++ gcc/testsuite/c-c++-common/gomp/append-args-5.c | 65 ++++++++++++++++++++++ 6 files changed, 179 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 47648529c0f8..5b0c134daea1 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,12 @@ +2025-01-28 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2025-01-08 Tobias Burnus <tbur...@baylibre.com> + + * gimplify.cc (gimplify_call_expr): Disable variant function's + append_args in 'omp dispatch' when invoking the variant directly + and not through the base function. + 2025-01-28 Tobias Burnus <tbur...@baylibre.com> Backported from master: diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 11f2ecac4048..4fe75831c34c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2025-01-28 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2025-01-03 Tobias Burnus <tbur...@baylibre.com> + + * parser.cc (cp_parser_omp_var_list_no_open, + cp_parser_omp_var_list): For kind=0 (= OMP_CLAUSE_ERROR), + store also the expression location in the tree list. + (cp_parser_oacc_data_clause_deviceptr, + cp_finish_omp_declare_variant): Use that location instead or + input_location/the before-parsing location. + * semantics.cc (finish_omp_threadprivate): Likewise. + 2025-01-21 Jakub Jelinek <ja...@redhat.com> PR c++/118509 diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index 2027599b9c5e..f555b548d1e8 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -4354,9 +4354,10 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback) && DECL_P (TREE_OPERAND (CALL_EXPR_FN (*expr_p), 0))) { tree fndecl = TREE_OPERAND (CALL_EXPR_FN (*expr_p), 0); - dispatch_adjust_args_list - = lookup_attribute ("omp declare variant variant args", - DECL_ATTRIBUTES (fndecl)); + if (variant_substituted_p) + dispatch_adjust_args_list + = lookup_attribute ("omp declare variant variant args", + DECL_ATTRIBUTES (fndecl)); if (dispatch_adjust_args_list) { dispatch_adjust_args_list = TREE_VALUE (dispatch_adjust_args_list); @@ -4380,7 +4381,15 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback) int nappend = 0, ninterop = 0; for (tree t = dispatch_append_args; t; t = TREE_CHAIN (t)) nappend++; - if (dispatch_interop) + if (dispatch_interop && !variant_substituted_p) + { + error_at (OMP_CLAUSE_LOCATION (dispatch_interop), + "unexpected %<interop%> clause as invoked procedure %qD is " + "not variant substituted", fndecl); + inform (DECL_SOURCE_LOCATION (fndecl), + "%qD declared here", fndecl); + } + else if (dispatch_interop) { for (tree t = dispatch_interop; t; t = TREE_CHAIN (t)) if (OMP_CLAUSE_CODE (t) == OMP_CLAUSE_INTEROP) diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index 310846eec1e1..45b16708e424 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,11 @@ +2025-01-28 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2025-01-08 Tobias Burnus <tbur...@baylibre.com> + + * c-c++-common/gomp/append-args-4.c: New test. + * c-c++-common/gomp/append-args-5.c: New test. + 2025-01-28 Tobias Burnus <tbur...@baylibre.com> Backported from master: diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-4.c b/gcc/testsuite/c-c++-common/gomp/append-args-4.c new file mode 100644 index 000000000000..25490e5b96e4 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/append-args-4.c @@ -0,0 +1,71 @@ +/* { dg-additional-options "-fdump-tree-gimple" } */ + +/* Check that append_args is not applied if there the outermost function + in '#pragma omp dispatch' is not variant substituted. */ + +#if __cplusplus >= 201103L +# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__ +#else +# define __GOMP_UINTPTR_T_ENUM +#endif + +typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM +{ + omp_interop_none = 0, + __omp_interop_t_max__ = __UINTPTR_MAX__ +} omp_interop_t; + +int v1(int, omp_interop_t); +#pragma omp declare variant(v1) match(construct={dispatch}) append_args(interop(target)) +int b1(int); + +int v2(int); +int v2a(int); +#pragma omp declare variant(v2) match(construct={dispatch},user={condition(1)}) +#pragma omp declare variant(v2a) match(user={condition(1)}) +int b2(int); + + +int test (int x1, int x2, int y1, int y2, int z1, int z2, int num1, int num2, int num3) +{ + +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = __builtin_omp_get_default_device \\(\\);" 3 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_omp_set_default_device \\(D\.\[0-9\]+\\);" 3 "gimple" } } */ + + #pragma omp dispatch + x1 = v1 (b2 (x1), omp_interop_none); +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2 \\(x1\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "x1 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + #pragma omp dispatch device(num1) + x2 = v1 (b2 (x2), omp_interop_none); +/* { dg-final { scan-tree-dump-times "__builtin_omp_set_default_device \\(num1\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2 \\(x2\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "x2 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + + #pragma omp dispatch nocontext(1) + y1 = v1 (b2 (y1), omp_interop_none); +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2a \\(y1\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "y1 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + #pragma omp dispatch nocontext(1) device(num2) + y2 = v1 (b2 (y2), omp_interop_none); +/* { dg-final { scan-tree-dump-times "__builtin_omp_set_default_device \\(num2\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2a \\(y2\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "y2 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + + #pragma omp dispatch novariants(1) + z1 = v1 (b2 (z1), omp_interop_none); +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2 \\(z1\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "z1 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + #pragma omp dispatch novariants(1) device(num3) + z2 = v1 (b2 (z2), omp_interop_none); +/* { dg-final { scan-tree-dump-times "__builtin_omp_set_default_device \\(num3\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = v2 \\(z2\\);" 1 "gimple" } } */ +/* { dg-final { scan-tree-dump-times "z2 = v1 \\(D\.\[0-9\]+, 0\\);" 1 "gimple" } } */ + + return x1 + x2 + y1 + y2 + z1 + z2; +} diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-5.c b/gcc/testsuite/c-c++-common/gomp/append-args-5.c new file mode 100644 index 000000000000..6f57ca869150 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/append-args-5.c @@ -0,0 +1,65 @@ +/* { dg-additional-options "-fdump-tree-gimple" } */ + +/* Check that append_args is not applied when the outermost function + in '#pragma omp dispatch' is not variant substituted. */ + +#if __cplusplus >= 201103L +# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__ +#else +# define __GOMP_UINTPTR_T_ENUM +#endif + +typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM +{ + omp_interop_none = 0, + __omp_interop_t_max__ = __UINTPTR_MAX__ +} omp_interop_t; + +int v1(int, omp_interop_t); + /* { dg-note "'v1' declared here" "" { target c } .-1 } */ + /* { dg-note "'int v1\\(int, omp_interop_t\\)' declared here" "" { target c++ } .-2 } */ +int v1a(int); + /* { dg-note "'declare variant' candidate 'v1a' declared here" "" { target c } .-1 } */ + /* { dg-note "'declare variant' candidate 'int v1a\\(int\\)' declared here" "" { target c++ } .-2 } */ +#pragma omp declare variant(v1) match(construct={dispatch},user={condition(1)}) append_args(interop(targetsync)) +#pragma omp declare variant(v1a) match(user={condition(1)}) +int b1(int); + /* { dg-note "'b1' declared here" "" { target c } .-1 } */ + /* { dg-note "'int b1\\(int\\)' declared here" "" { target c++ } .-2 } */ + +int v2(int); +int v2a(int); +#pragma omp declare variant(v2) match(construct={dispatch},user={condition(1)}) +#pragma omp declare variant(v2a) match(user={condition(1)}) +int b2(int); + + +int test (int y1, int y2, int y3, int y4, int num1, int num2, int num3, int num4) +{ + int x1, x2, x3, x4; + omp_interop_t obj = omp_interop_none; + + #pragma omp dispatch device(num1) interop(obj) + x1 = v1 (b2 (y1), omp_interop_none); + /* { dg-error "unexpected 'interop' clause as invoked procedure 'v1' is not variant substituted" "" { target c } .-2 } */ + /* { dg-error "unexpected 'interop' clause as invoked procedure 'int v1\\(int, omp_interop_t\\)' is not variant substituted" "" { target c++ } .-3 } */ + + + #pragma omp dispatch device(num2) nocontext(1) interop(obj) + x2 = b1 (b2 (y2)); + /* { dg-error "number of list items in 'interop' clause \\(1\\) exceeds the number of 'append_args' items \\(0\\) for 'declare variant' candidate 'v1a'" "" { target c } .-2 } */ + /* { dg-error "number of list items in 'interop' clause \\(1\\) exceeds the number of 'append_args' items \\(0\\) for 'declare variant' candidate 'int v1a\\(int\\)'" "" { target c++ } .-3 } */ + + + #pragma omp dispatch device(num2) novariants(1) interop(obj) + x3 = b1 (b2 (y3)); + /* { dg-error "unexpected 'interop' clause as invoked procedure 'b1' is not variant substituted" "" { target c } .-2 } */ + /* { dg-error "unexpected 'interop' clause as invoked procedure 'int b1\\(int\\)' is not variant substituted" "" { target c++ } .-3 } */ + + + /* OK */ + #pragma omp dispatch device(num4) nocontext(0) interop(obj) + x4 = b1 (b2 (y4)); + + return x1 + x2 + x3 + x4; +}