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.

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?

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);



Reply via email to