On Fri, 7 Mar 2025, Tejas Belagod wrote:
> Given a vector mode and its corresponding element mode, this new new language
> hook returns a vector type that has properties of the vector mode and element
> type of that of the element mode. For eg. on AArch64, given VNx16BI and
> QImode
> it returns VNx16QI i.e. the wider mode to BImode that is an SVE mode.
What's the rationale for this to be a new frontend hook? It seems
to be a composition of a target hook (related_mode) and a
frontend hook (type_for_mode). And how can it survive without
a default implementation?
> gcc/ChangeLog:
>
> * c-family/c-common.cc (c_common_related_vtype): New.
> * c-family/c-common.h: Declare.
> * c/c-objc-common.h: Likwise.
> * cp/cp-objcp-common.h: Likewise.
> * langhooks-def.h: Declare new hook.
> ---
> gcc/c-family/c-common.cc | 15 +++++++++++++++
> gcc/c-family/c-common.h | 1 +
> gcc/c/c-objc-common.h | 2 ++
> gcc/cp/cp-objcp-common.h | 2 ++
> gcc/langhooks-def.h | 2 ++
> gcc/langhooks.h | 4 ++++
> 6 files changed, 26 insertions(+)
>
> diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
> index 49508fe9ee6..0895c24ba97 100644
> --- a/gcc/c-family/c-common.cc
> +++ b/gcc/c-family/c-common.cc
> @@ -2665,6 +2665,21 @@ c_common_type_for_mode (machine_mode mode, int
> unsignedp)
> return NULL_TREE;
> }
>
> +/* Given MODE, and INNER_MODE find a vector mode made up of INNER_MODE. */
> +
> +tree
> +c_common_related_vtype_for_mode (machine_mode mode, scalar_mode inner_mode,
> + int unsignedp)
> +{
> + gcc_assert (VECTOR_MODE_P (mode));
> + gcc_assert (!VECTOR_MODE_P (inner_mode));
> +
> + opt_machine_mode wvmode = targetm.vectorize.related_mode
> + (mode, inner_mode, GET_MODE_NUNITS (mode));
> + tree type = c_common_type_for_mode (wvmode.require (), unsignedp);
> + return type;
> +}
> +
> tree
> c_common_unsigned_type (tree type)
> {
> diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
> index ea6c2975056..0178a106343 100644
> --- a/gcc/c-family/c-common.h
> +++ b/gcc/c-family/c-common.h
> @@ -874,6 +874,7 @@ extern bool c_common_handle_option (size_t, const char *,
> HOST_WIDE_INT, int,
> const struct cl_option_handlers *);
> extern bool default_handle_c_option (size_t, const char *, int);
> extern tree c_common_type_for_mode (machine_mode, int);
> +extern tree c_common_related_vtype_for_mode (machine_mode, scalar_mode, int);
> extern tree c_common_type_for_size (unsigned int, int);
> extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int,
> int, int);
> diff --git a/gcc/c/c-objc-common.h b/gcc/c/c-objc-common.h
> index 84bd3571ffc..93c753e4885 100644
> --- a/gcc/c/c-objc-common.h
> +++ b/gcc/c/c-objc-common.h
> @@ -97,6 +97,8 @@ static const scoped_attribute_specs *const
> c_objc_attribute_table[] =
> #define LANG_HOOKS_SIMULATE_RECORD_DECL c_simulate_record_decl
> #undef LANG_HOOKS_TYPE_FOR_MODE
> #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
> +#undef LANG_HOOKS_RELATED_VTYPE_FOR_MODE
> +#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE c_common_related_vtype_for_mode
> #undef LANG_HOOKS_TYPE_FOR_SIZE
> #define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
> #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR
> diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
> index 13fb80c2da5..821c7bdc881 100644
> --- a/gcc/cp/cp-objcp-common.h
> +++ b/gcc/cp/cp-objcp-common.h
> @@ -151,6 +151,8 @@ static const scoped_attribute_specs *const
> cp_objcp_attribute_table[] =
> #define LANG_HOOKS_SIMULATE_RECORD_DECL cxx_simulate_record_decl
> #undef LANG_HOOKS_TYPE_FOR_MODE
> #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
> +#undef LANG_HOOKS_RELATED_VTYPE_FOR_MODE
> +#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE c_common_related_vtype_for_mode
> #undef LANG_HOOKS_TYPE_FOR_SIZE
> #define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
> #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR
> diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
> index 6b34d324ab5..69a354639c3 100644
> --- a/gcc/langhooks-def.h
> +++ b/gcc/langhooks-def.h
> @@ -221,6 +221,7 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
> #define LANG_HOOKS_TYPE_DWARF_ATTRIBUTE lhd_type_dwarf_attribute
> #define LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING
> lhd_unit_size_without_reusable_padding
> #define LANG_HOOKS_CLASSTYPE_AS_BASE hook_tree_const_tree_null
> +#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE NULL
>
> #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \
> LANG_HOOKS_MAKE_TYPE, \
> @@ -228,6 +229,7 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
> LANG_HOOKS_SIMULATE_RECORD_DECL, \
> LANG_HOOKS_CLASSIFY_RECORD, \
> LANG_HOOKS_TYPE_FOR_MODE, \
> + LANG_HOOKS_RELATED_VTYPE_FOR_MODE, \
> LANG_HOOKS_TYPE_FOR_SIZE, \
> LANG_HOOKS_GENERIC_TYPE_P, \
> LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS, \
> diff --git a/gcc/langhooks.h b/gcc/langhooks.h
> index dc8d878c7fb..45dbea481c7 100644
> --- a/gcc/langhooks.h
> +++ b/gcc/langhooks.h
> @@ -87,6 +87,10 @@ struct lang_hooks_for_types
> mode. */
> tree (*type_for_mode) (machine_mode, int);
>
> + /* Given MODE, SCALAR_MODE and UNSIGNEDP, return a suitable vector
> type-tree
> + where the element is of SCALAR_MODE and related to MODE. */
> + tree (*related_vtype_for_mode) (machine_mode, scalar_mode, int);
> +
> /* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an
> integer type with at least that precision. */
> tree (*type_for_size) (unsigned, int);
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)