On Fri, 7 Mar 2025, Tejas Belagod wrote:

> On 3/7/25 4:38 PM, Richard Biener wrote:
> > 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).  
> 
> I don't know this part of the FE very well, so pardon if its wrong way to do
> it.
> 
> I was trying to find a generic way to determine a wider vtype for a given
> vmode in a language-agnostic way. It looks like lang hooks are the generic way
> for the mid-end to communicate to the FE to determine types the FE seems fit,
> so I decided to make it a langhook.

Who is supposed to call this hook and for what reason?  Why would the
frontend be involved here?

> And how can it survive without
> > a default implementation?
> > 
> 
> I saw a comment in langhooks-def.h that says:
> 
> /* Types hooks.  There are no reasonable defaults for most of them,
>    so we create a compile-time error instead.  */
> 
> So I assumed it was OK to have a NULL default which presumably fails at build
> time when a hook is not defined for a language. Is there a more graceful way
> to remedy this?

Well, you made the default a NULL pointer - what do you do at the use
point of the hook when it's not defined?

> 
> Thanks,
> Tejas.
> 
> >> 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 <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to