[v3,1/7] OpenMP: dispatch + adjust_args tree data structures and front-end interfaces
Commit Message
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.
gcc/ChangeLog:
* builtin-types.def (BT_FN_PTR_CONST_PTR_INT): New.
* omp-selectors.h (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/fortran/ChangeLog:
* types.def (BT_FN_PTR_CONST_PTR_INT): Declare.
---
gcc/builtin-types.def | 1 +
gcc/fortran/types.def | 1 +
gcc/omp-selectors.h | 1 +
gcc/tree-core.h | 7 +++++++
gcc/tree-pretty-print.cc | 21 +++++++++++++++++++++
gcc/tree.cc | 4 ++++
gcc/tree.def | 5 +++++
gcc/tree.h | 7 +++++++
8 files changed, 47 insertions(+)
Comments
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 - thanks!
Tobias
> gcc/ChangeLog:
>
> * builtin-types.def (BT_FN_PTR_CONST_PTR_INT): New.
> * omp-selectors.h (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/fortran/ChangeLog:
>
> * types.def (BT_FN_PTR_CONST_PTR_INT): Declare.
> ---
> gcc/builtin-types.def | 1 +
> gcc/fortran/types.def | 1 +
> gcc/omp-selectors.h | 1 +
> gcc/tree-core.h | 7 +++++++
> gcc/tree-pretty-print.cc | 21 +++++++++++++++++++++
> gcc/tree.cc | 4 ++++
> gcc/tree.def | 5 +++++
> gcc/tree.h | 7 +++++++
> 8 files changed, 47 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/fortran/types.def b/gcc/fortran/types.def
> index 390cc9542f7..5047c8f816a 100644
> --- a/gcc/fortran/types.def
> +++ b/gcc/fortran/types.def
> @@ -120,6 +120,7 @@ DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_INT_BOOL, BT_BOOL, BT_INT, BT_BOOL)
> DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_PTRMODE,
> BT_VOID, BT_PTR, BT_PTRMODE)
> DEF_FUNCTION_TYPE_2 (BT_FN_VOID_CONST_PTR_SIZE, BT_VOID, BT_CONST_PTR, BT_SIZE)
> +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..ef3ce9a449a 100644
> --- a/gcc/omp-selectors.h
> +++ b/gcc/omp-selectors.h
> @@ -55,6 +55,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 a2d431662bd..4d60143c3ca 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 5dcbb2fb5dd..612c2a1b868 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)
@@ -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)
@@ -120,6 +120,7 @@ DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_INT_BOOL, BT_BOOL, BT_INT, BT_BOOL)
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_PTRMODE,
BT_VOID, BT_PTR, BT_PTRMODE)
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_CONST_PTR_SIZE, BT_VOID, BT_CONST_PTR, BT_SIZE)
+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)
@@ -55,6 +55,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
};
@@ -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
@@ -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;
@@ -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
@@ -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)
@@ -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)