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;
+}

Reply via email to