diff mbox series

[v2,2/8] OpenMP: dispatch + adjust_args tree data structures and front-end interfaces

Message ID 20240712141155.255186-3-parras@baylibre.com
State New
Headers show
Series OpenMP: dispatch + adjust_args support | expand

Commit Message

Paul-Antoine Arras July 12, 2024, 2:11 p.m. UTC
This patch introduces the OMP_DISPATCH tree node, as well as two new clauses
`nocontext` and `novariants`. It defines/exposes interfaces that will be
used in subsequent patches that add front-end and middle-end support, but
nothing generates these nodes yet.

It also adds support for new OpenMP context selectors: `dispatch` as trait
selector and `need_device_ptr` as pseudo-trait set selector. The purpose of the
latter is for the C++ front-end to store the list of arguments (that need to be
converted to device pointers) until the declaration of the variant function
becomes available.

gcc/ChangeLog:

	* builtin-types.def (BT_FN_PTR_CONST_PTR_INT): New.
	* omp-selectors.h (enum omp_tss_code): Add
	OMP_TRAIT_SET_NEED_DEVICE_PTR.
	(enum omp_ts_code): Add OMP_TRAIT_CONSTRUCT_DISPATCH.
	* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_NOVARIANTS and
	OMP_CLAUSE_NOCONTEXT.
	* tree-pretty-print.cc (dump_omp_clause): Handle OMP_CLAUSE_NOVARIANTS
	and OMP_CLAUSE_NOCONTEXT.
	(dump_generic_node): Handle OMP_DISPATCH.
	* tree.cc (omp_clause_num_ops): Add OMP_CLAUSE_NOVARIANTS and
	OMP_CLAUSE_NOCONTEXT.
	(omp_clause_code_name): Add "novariants" and "nocontext".
	* tree.def (OMP_DISPATCH): New.
	* tree.h (OMP_DISPATCH_BODY): New macro.
	(OMP_DISPATCH_CLAUSES): New macro.
	(OMP_CLAUSE_NOVARIANTS_EXPR): New macro.
	(OMP_CLAUSE_NOCONTEXT_EXPR): New macro.
---
 gcc/builtin-types.def    |  1 +
 gcc/omp-selectors.h      |  3 +++
 gcc/tree-core.h          |  7 +++++++
 gcc/tree-pretty-print.cc | 21 +++++++++++++++++++++
 gcc/tree.cc              |  4 ++++
 gcc/tree.def             |  5 +++++
 gcc/tree.h               |  7 +++++++
 7 files changed, 48 insertions(+)

Comments

Tobias Burnus July 18, 2024, 9:52 a.m. UTC | #1
Paul-Antoine Arras wrote:
> This patch introduces the OMP_DISPATCH tree node, as well as two new clauses
> `nocontext` and `novariants`. It defines/exposes interfaces that will be
> used in subsequent patches that add front-end and middle-end support, but
> nothing generates these nodes yet.

LGTM.

OFF TOPIC regarding "OMP_TRAIT_SET_NEED_DEVICE_PTR" and
"pseudo-set selector used to convey argument list until variant has a decl":
This reminds me vaguely of the issue that we should store the variant 
declarations with the base function and not with the variant, cf.
https://gcc.gnu.org/PR113905

Thanks for the patch!

Tobias

> It also adds support for new OpenMP context selectors: `dispatch` as trait
> selector and `need_device_ptr` as pseudo-trait set selector. The purpose of the
> latter is for the C++ front-end to store the list of arguments (that need to be
> converted to device pointers) until the declaration of the variant function
> becomes available.
> 
> gcc/ChangeLog:
> 
> 	* builtin-types.def (BT_FN_PTR_CONST_PTR_INT): New.
> 	* omp-selectors.h (enum omp_tss_code): Add
> 	OMP_TRAIT_SET_NEED_DEVICE_PTR.
> 	(enum omp_ts_code): Add OMP_TRAIT_CONSTRUCT_DISPATCH.
> 	* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_NOVARIANTS and
> 	OMP_CLAUSE_NOCONTEXT.
> 	* tree-pretty-print.cc (dump_omp_clause): Handle OMP_CLAUSE_NOVARIANTS
> 	and OMP_CLAUSE_NOCONTEXT.
> 	(dump_generic_node): Handle OMP_DISPATCH.
> 	* tree.cc (omp_clause_num_ops): Add OMP_CLAUSE_NOVARIANTS and
> 	OMP_CLAUSE_NOCONTEXT.
> 	(omp_clause_code_name): Add "novariants" and "nocontext".
> 	* tree.def (OMP_DISPATCH): New.
> 	* tree.h (OMP_DISPATCH_BODY): New macro.
> 	(OMP_DISPATCH_CLAUSES): New macro.
> 	(OMP_CLAUSE_NOVARIANTS_EXPR): New macro.
> 	(OMP_CLAUSE_NOCONTEXT_EXPR): New macro.
> ---
>   gcc/builtin-types.def    |  1 +
>   gcc/omp-selectors.h      |  3 +++
>   gcc/tree-core.h          |  7 +++++++
>   gcc/tree-pretty-print.cc | 21 +++++++++++++++++++++
>   gcc/tree.cc              |  4 ++++
>   gcc/tree.def             |  5 +++++
>   gcc/tree.h               |  7 +++++++
>   7 files changed, 48 insertions(+)
> 
> diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
> index c97d6bad1de..ef7aaf67d13 100644
> --- a/gcc/builtin-types.def
> +++ b/gcc/builtin-types.def
> @@ -677,6 +677,7 @@ DEF_FUNCTION_TYPE_2 (BT_FN_INT_FEXCEPT_T_PTR_INT, BT_INT, BT_FEXCEPT_T_PTR,
>   DEF_FUNCTION_TYPE_2 (BT_FN_INT_CONST_FEXCEPT_T_PTR_INT, BT_INT,
>   		     BT_CONST_FEXCEPT_T_PTR, BT_INT)
>   DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_UINT8, BT_PTR, BT_CONST_PTR, BT_UINT8)
> +DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_INT, BT_PTR, BT_CONST_PTR, BT_INT)
>   
>   DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR)
>   
> diff --git a/gcc/omp-selectors.h b/gcc/omp-selectors.h
> index c61808ec0ad..12bc9e9afa0 100644
> --- a/gcc/omp-selectors.h
> +++ b/gcc/omp-selectors.h
> @@ -31,6 +31,8 @@ enum omp_tss_code {
>     OMP_TRAIT_SET_TARGET_DEVICE,
>     OMP_TRAIT_SET_IMPLEMENTATION,
>     OMP_TRAIT_SET_USER,
> +  OMP_TRAIT_SET_NEED_DEVICE_PTR, // pseudo-set selector used to convey argument
> +				 // list until variant has a decl
>     OMP_TRAIT_SET_LAST,
>     OMP_TRAIT_SET_INVALID = -1
>   };
> @@ -55,6 +57,7 @@ enum omp_ts_code {
>     OMP_TRAIT_CONSTRUCT_PARALLEL,
>     OMP_TRAIT_CONSTRUCT_FOR,
>     OMP_TRAIT_CONSTRUCT_SIMD,
> +  OMP_TRAIT_CONSTRUCT_DISPATCH,
>     OMP_TRAIT_LAST,
>     OMP_TRAIT_INVALID = -1
>   };
> diff --git a/gcc/tree-core.h b/gcc/tree-core.h
> index 27c569c7702..508f5c580d4 100644
> --- a/gcc/tree-core.h
> +++ b/gcc/tree-core.h
> @@ -542,6 +542,13 @@ enum omp_clause_code {
>   
>     /* OpenACC clause: nohost.  */
>     OMP_CLAUSE_NOHOST,
> +
> +  /* OpenMP clause: novariants (scalar-expression).  */
> +  OMP_CLAUSE_NOVARIANTS,
> +
> +  /* OpenMP clause: nocontext (scalar-expression).  */
> +  OMP_CLAUSE_NOCONTEXT,
> +
>   };
>   
>   #undef DEFTREESTRUCT
> diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
> index 4bb946bb0e8..752a402e0d0 100644
> --- a/gcc/tree-pretty-print.cc
> +++ b/gcc/tree-pretty-print.cc
> @@ -506,6 +506,22 @@ dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
>       case OMP_CLAUSE_EXCLUSIVE:
>         name = "exclusive";
>         goto print_remap;
> +    case OMP_CLAUSE_NOVARIANTS:
> +      pp_string (pp, "novariants");
> +      pp_left_paren (pp);
> +      gcc_assert (OMP_CLAUSE_NOVARIANTS_EXPR (clause));
> +      dump_generic_node (pp, OMP_CLAUSE_NOVARIANTS_EXPR (clause), spc, flags,
> +			 false);
> +      pp_right_paren (pp);
> +      break;
> +    case OMP_CLAUSE_NOCONTEXT:
> +      pp_string (pp, "nocontext");
> +      pp_left_paren (pp);
> +      gcc_assert (OMP_CLAUSE_NOCONTEXT_EXPR (clause));
> +      dump_generic_node (pp, OMP_CLAUSE_NOCONTEXT_EXPR (clause), spc, flags,
> +			 false);
> +      pp_right_paren (pp);
> +      break;
>       case OMP_CLAUSE__LOOPTEMP_:
>         name = "_looptemp_";
>         goto print_remap;
> @@ -3947,6 +3963,11 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
>         dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
>         goto dump_omp_body;
>   
> +    case OMP_DISPATCH:
> +      pp_string (pp, "#pragma omp dispatch");
> +      dump_omp_clauses (pp, OMP_DISPATCH_CLAUSES (node), spc, flags);
> +      goto dump_omp_body;
> +
>       case OMP_SECTION:
>         pp_string (pp, "#pragma omp section");
>         goto dump_omp_body;
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 2d2d5b6db6e..9da9630199b 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -331,6 +331,8 @@ unsigned const char omp_clause_num_ops[] =
>     0, /* OMP_CLAUSE_IF_PRESENT */
>     0, /* OMP_CLAUSE_FINALIZE */
>     0, /* OMP_CLAUSE_NOHOST */
> +  1, /* OMP_CLAUSE_NOVARIANTS */
> +  1, /* OMP_CLAUSE_NOCONTEXT */
>   };
>   
>   const char * const omp_clause_code_name[] =
> @@ -427,6 +429,8 @@ const char * const omp_clause_code_name[] =
>     "if_present",
>     "finalize",
>     "nohost",
> +  "novariants",
> +  "nocontext",
>   };
>   
>   /* Unless specific to OpenACC, we tend to internally maintain OpenMP-centric
> diff --git a/gcc/tree.def b/gcc/tree.def
> index 85ab182c6f5..1a6c9512cfc 100644
> --- a/gcc/tree.def
> +++ b/gcc/tree.def
> @@ -1298,6 +1298,11 @@ DEFTREECODE (OMP_MASKED, "omp_masked", tcc_statement, 2)
>      Operand 1: OMP_SCAN_CLAUSES: List of clauses.  */
>   DEFTREECODE (OMP_SCAN, "omp_scan", tcc_statement, 2)
>   
> +/* OpenMP - #pragma omp dispatch [clause1 ... clauseN]
> +   Operand 0: OMP_DISPATCH_BODY: Expression statement including a target call.
> +   Operand 1: OMP_DISPATCH_CLAUSES: List of clauses.  */
> +DEFTREECODE (OMP_DISPATCH, "omp_dispatch", tcc_statement, 2)
> +
>   /* OpenMP - #pragma omp section
>      Operand 0: OMP_SECTION_BODY: Section body.  */
>   DEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1)
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 28e8e71b036..961615a6030 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -1603,6 +1603,9 @@ class auto_suppress_location_wrappers
>   #define OMP_SCAN_BODY(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 0)
>   #define OMP_SCAN_CLAUSES(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 1)
>   
> +#define OMP_DISPATCH_BODY(NODE) TREE_OPERAND (OMP_DISPATCH_CHECK (NODE), 0)
> +#define OMP_DISPATCH_CLAUSES(NODE) TREE_OPERAND (OMP_DISPATCH_CHECK (NODE), 1)
> +
>   #define OMP_CLAUSE_SIZE(NODE)						\
>     OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE),	\
>   					      OMP_CLAUSE_FROM,		\
> @@ -1750,6 +1753,10 @@ class auto_suppress_location_wrappers
>     OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PARTIAL), 0)
>   #define OMP_CLAUSE_SIZES_LIST(NODE) \
>     OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SIZES), 0)
> +#define OMP_CLAUSE_NOVARIANTS_EXPR(NODE)                                       \
> +  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NOVARIANTS), 0)
> +#define OMP_CLAUSE_NOCONTEXT_EXPR(NODE)                                        \
> +  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NOCONTEXT), 0)
>   
>   #define OMP_CLAUSE_GRAINSIZE_EXPR(NODE) \
>     OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_GRAINSIZE),0)
diff mbox series

Patch

diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index c97d6bad1de..ef7aaf67d13 100644
--- a/gcc/builtin-types.def
+++ b/gcc/builtin-types.def
@@ -677,6 +677,7 @@  DEF_FUNCTION_TYPE_2 (BT_FN_INT_FEXCEPT_T_PTR_INT, BT_INT, BT_FEXCEPT_T_PTR,
 DEF_FUNCTION_TYPE_2 (BT_FN_INT_CONST_FEXCEPT_T_PTR_INT, BT_INT,
 		     BT_CONST_FEXCEPT_T_PTR, BT_INT)
 DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_UINT8, BT_PTR, BT_CONST_PTR, BT_UINT8)
+DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_INT, BT_PTR, BT_CONST_PTR, BT_INT)
 
 DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR)
 
diff --git a/gcc/omp-selectors.h b/gcc/omp-selectors.h
index c61808ec0ad..12bc9e9afa0 100644
--- a/gcc/omp-selectors.h
+++ b/gcc/omp-selectors.h
@@ -31,6 +31,8 @@  enum omp_tss_code {
   OMP_TRAIT_SET_TARGET_DEVICE,
   OMP_TRAIT_SET_IMPLEMENTATION,
   OMP_TRAIT_SET_USER,
+  OMP_TRAIT_SET_NEED_DEVICE_PTR, // pseudo-set selector used to convey argument
+				 // list until variant has a decl
   OMP_TRAIT_SET_LAST,
   OMP_TRAIT_SET_INVALID = -1
 };
@@ -55,6 +57,7 @@  enum omp_ts_code {
   OMP_TRAIT_CONSTRUCT_PARALLEL,
   OMP_TRAIT_CONSTRUCT_FOR,
   OMP_TRAIT_CONSTRUCT_SIMD,
+  OMP_TRAIT_CONSTRUCT_DISPATCH,
   OMP_TRAIT_LAST,
   OMP_TRAIT_INVALID = -1
 };
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 27c569c7702..508f5c580d4 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -542,6 +542,13 @@  enum omp_clause_code {
 
   /* OpenACC clause: nohost.  */
   OMP_CLAUSE_NOHOST,
+
+  /* OpenMP clause: novariants (scalar-expression).  */
+  OMP_CLAUSE_NOVARIANTS,
+
+  /* OpenMP clause: nocontext (scalar-expression).  */
+  OMP_CLAUSE_NOCONTEXT,
+
 };
 
 #undef DEFTREESTRUCT
diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
index 4bb946bb0e8..752a402e0d0 100644
--- a/gcc/tree-pretty-print.cc
+++ b/gcc/tree-pretty-print.cc
@@ -506,6 +506,22 @@  dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
     case OMP_CLAUSE_EXCLUSIVE:
       name = "exclusive";
       goto print_remap;
+    case OMP_CLAUSE_NOVARIANTS:
+      pp_string (pp, "novariants");
+      pp_left_paren (pp);
+      gcc_assert (OMP_CLAUSE_NOVARIANTS_EXPR (clause));
+      dump_generic_node (pp, OMP_CLAUSE_NOVARIANTS_EXPR (clause), spc, flags,
+			 false);
+      pp_right_paren (pp);
+      break;
+    case OMP_CLAUSE_NOCONTEXT:
+      pp_string (pp, "nocontext");
+      pp_left_paren (pp);
+      gcc_assert (OMP_CLAUSE_NOCONTEXT_EXPR (clause));
+      dump_generic_node (pp, OMP_CLAUSE_NOCONTEXT_EXPR (clause), spc, flags,
+			 false);
+      pp_right_paren (pp);
+      break;
     case OMP_CLAUSE__LOOPTEMP_:
       name = "_looptemp_";
       goto print_remap;
@@ -3947,6 +3963,11 @@  dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
       dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
       goto dump_omp_body;
 
+    case OMP_DISPATCH:
+      pp_string (pp, "#pragma omp dispatch");
+      dump_omp_clauses (pp, OMP_DISPATCH_CLAUSES (node), spc, flags);
+      goto dump_omp_body;
+
     case OMP_SECTION:
       pp_string (pp, "#pragma omp section");
       goto dump_omp_body;
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 2d2d5b6db6e..9da9630199b 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -331,6 +331,8 @@  unsigned const char omp_clause_num_ops[] =
   0, /* OMP_CLAUSE_IF_PRESENT */
   0, /* OMP_CLAUSE_FINALIZE */
   0, /* OMP_CLAUSE_NOHOST */
+  1, /* OMP_CLAUSE_NOVARIANTS */
+  1, /* OMP_CLAUSE_NOCONTEXT */
 };
 
 const char * const omp_clause_code_name[] =
@@ -427,6 +429,8 @@  const char * const omp_clause_code_name[] =
   "if_present",
   "finalize",
   "nohost",
+  "novariants",
+  "nocontext",
 };
 
 /* Unless specific to OpenACC, we tend to internally maintain OpenMP-centric
diff --git a/gcc/tree.def b/gcc/tree.def
index 85ab182c6f5..1a6c9512cfc 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -1298,6 +1298,11 @@  DEFTREECODE (OMP_MASKED, "omp_masked", tcc_statement, 2)
    Operand 1: OMP_SCAN_CLAUSES: List of clauses.  */
 DEFTREECODE (OMP_SCAN, "omp_scan", tcc_statement, 2)
 
+/* OpenMP - #pragma omp dispatch [clause1 ... clauseN]
+   Operand 0: OMP_DISPATCH_BODY: Expression statement including a target call.
+   Operand 1: OMP_DISPATCH_CLAUSES: List of clauses.  */
+DEFTREECODE (OMP_DISPATCH, "omp_dispatch", tcc_statement, 2)
+
 /* OpenMP - #pragma omp section
    Operand 0: OMP_SECTION_BODY: Section body.  */
 DEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1)
diff --git a/gcc/tree.h b/gcc/tree.h
index 28e8e71b036..961615a6030 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1603,6 +1603,9 @@  class auto_suppress_location_wrappers
 #define OMP_SCAN_BODY(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 0)
 #define OMP_SCAN_CLAUSES(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 1)
 
+#define OMP_DISPATCH_BODY(NODE) TREE_OPERAND (OMP_DISPATCH_CHECK (NODE), 0)
+#define OMP_DISPATCH_CLAUSES(NODE) TREE_OPERAND (OMP_DISPATCH_CHECK (NODE), 1)
+
 #define OMP_CLAUSE_SIZE(NODE)						\
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE),	\
 					      OMP_CLAUSE_FROM,		\
@@ -1750,6 +1753,10 @@  class auto_suppress_location_wrappers
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PARTIAL), 0)
 #define OMP_CLAUSE_SIZES_LIST(NODE) \
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SIZES), 0)
+#define OMP_CLAUSE_NOVARIANTS_EXPR(NODE)                                       \
+  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NOVARIANTS), 0)
+#define OMP_CLAUSE_NOCONTEXT_EXPR(NODE)                                        \
+  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NOCONTEXT), 0)
 
 #define OMP_CLAUSE_GRAINSIZE_EXPR(NODE) \
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_GRAINSIZE),0)