On Mon, Sep 15, 2025 at 8:51 PM Robin Dapp <[email protected]> wrote:
>
> Hi,
>
> This patch removes the type argument from the vector_misalignment hook.
> Ever since we switched from element to byte misalignment its
> semantics haven't been particularly clear and nowadays it should be
> redundant.
>
> Also, in case of gather/scatter, the patch sets misalignment to the
> misalignment of one unit of the vector mode so targets can
> distinguish between element size alignment and element mode alignment.
>
> is_packed is now always set, regardless of misalignment.
>
> Regtested and bootstrapped on x86 and power10. Regtested on aarch64 and
> rv64gcv_zvl512b.
OK.
Thanks,
Richard.
> Regards
> Robin
>
> gcc/ChangeLog:
>
> * config/aarch64/aarch64.cc
> (aarch64_builtin_support_vector_misalignment):
> Remove type.
> * config/arm/arm.cc (arm_builtin_support_vector_misalignment):
> Ditto.
> * config/epiphany/epiphany.cc (epiphany_support_vector_misalignment):
> Ditto.
> * config/gcn/gcn.cc (gcn_vectorize_support_vector_misalignment):
> Ditto.
> * config/loongarch/loongarch.cc
> (loongarch_builtin_support_vector_misalignment):
> Ditto.
> * config/riscv/riscv.cc (riscv_support_vector_misalignment):
> Ditto.
> * config/rs6000/rs6000.cc
> (rs6000_builtin_support_vector_misalignment):
> Ditto.
> * config/s390/s390.cc (s390_support_vector_misalignment):
> Ditto.
> * doc/tm.texi: Adjust vector misalignment docs.
> * target.def: Ditto.
> * targhooks.cc (default_builtin_support_vector_misalignment):
> Remove type.
> * targhooks.h (default_builtin_support_vector_misalignment):
> Ditto.
> * tree-vect-data-refs.cc (vect_can_force_dr_alignment_p):
> Set misalignment for gather/scatter and remove type.
> (vect_supportable_dr_alignment): Ditto.
> ---
> gcc/config/aarch64/aarch64.cc | 5 ++---
> gcc/config/arm/arm.cc | 5 ++---
> gcc/config/epiphany/epiphany.cc | 6 +++---
> gcc/config/gcn/gcn.cc | 7 ++++---
> gcc/config/loongarch/loongarch.cc | 3 +--
> gcc/config/riscv/riscv.cc | 11 +++++------
> gcc/config/rs6000/rs6000.cc | 13 ++++++-------
> gcc/config/s390/s390.cc | 3 +--
> gcc/doc/tm.texi | 12 ++++++------
> gcc/target.def | 12 ++++++------
> gcc/targhooks.cc | 2 --
> gcc/targhooks.h | 1 -
> gcc/tree-vect-data-refs.cc | 14 ++++++++------
> 13 files changed, 44 insertions(+), 50 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index ef9c16598c0..baa38fcc4b3 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -354,7 +354,6 @@ static void aarch64_override_options_after_change (void);
> static bool aarch64_vector_mode_supported_p (machine_mode);
> static int aarch64_address_cost (rtx, machine_mode, addr_space_t, bool);
> static bool aarch64_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type,
> int misalignment,
> bool is_packed,
> bool
> is_gather_scatter);
> @@ -24601,7 +24600,7 @@ aarch64_simd_vector_alignment_reachable (const_tree
> type, bool is_packed)
> target. */
> static bool
> aarch64_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type, int
> misalignment,
> + int misalignment,
> bool is_packed,
> bool is_gather_scatter)
> {
> @@ -24618,7 +24617,7 @@ aarch64_builtin_support_vector_misalignment
> (machine_mode mode,
> if (misalignment == -1)
> return false;
> }
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> index 8b951f3d4a6..f074a429200 100644
> --- a/gcc/config/arm/arm.cc
> +++ b/gcc/config/arm/arm.cc
> @@ -287,7 +287,6 @@ static bool arm_class_likely_spilled_p (reg_class_t);
> static HOST_WIDE_INT arm_vector_alignment (const_tree type);
> static bool arm_vector_alignment_reachable (const_tree type, bool is_packed);
> static bool arm_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type,
> int misalignment,
> bool is_packed,
> bool is_gather_scatter);
> @@ -30662,7 +30661,7 @@ arm_vector_alignment_reachable (const_tree type, bool
> is_packed)
>
> static bool
> arm_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type, int misalignment,
> + int misalignment,
> bool is_packed,
> bool is_gather_scatter)
> {
> @@ -30688,7 +30687,7 @@ arm_builtin_support_vector_misalignment (machine_mode
> mode,
> return ((misalignment % align) == 0);
> }
>
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/config/epiphany/epiphany.cc b/gcc/config/epiphany/epiphany.cc
> index f53a643575b..2446b02389a 100644
> --- a/gcc/config/epiphany/epiphany.cc
> +++ b/gcc/config/epiphany/epiphany.cc
> @@ -2815,15 +2815,15 @@ epiphany_vector_alignment_reachable (const_tree type,
> bool is_packed)
> }
>
> static bool
> -epiphany_support_vector_misalignment (machine_mode mode, const_tree type,
> - int misalignment, bool is_packed,
> +epiphany_support_vector_misalignment (machine_mode mode, int misalignment,
> + bool is_packed,
> bool is_gather_scatter)
> {
> if (is_gather_scatter)
> return true;
> if (GET_MODE_SIZE (mode) == 8 && misalignment % 4 == 0)
> return true;
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc
> index df1c1a5b19b..b26b0cda9ae 100644
> --- a/gcc/config/gcn/gcn.cc
> +++ b/gcc/config/gcn/gcn.cc
> @@ -5368,14 +5368,14 @@ gcn_preferred_vector_alignment (const_tree type)
>
> static bool
> gcn_vectorize_support_vector_misalignment (machine_mode ARG_UNUSED (mode),
> - const_tree type, int misalignment,
> + int misalignment,
> bool is_packed,
> bool is_gather_scatter)
> {
> if (is_gather_scatter)
> return true;
>
> - if (is_packed)
> + if (misalignment == DR_MISALIGNMENT_UNKNOWN && is_packed)
> return false;
>
> /* If the misalignment is unknown, we should be able to handle the access
> @@ -5387,7 +5387,8 @@ gcn_vectorize_support_vector_misalignment (machine_mode
> ARG_UNUSED (mode),
> of the vector's element type. This is probably always going to be
> true in practice, since we've already established that this isn't a
> packed access. */
> - return misalignment % TYPE_ALIGN_UNIT (type) == 0;
> + return misalignment
> + % (GET_MODE_ALIGNMENT (GET_MODE_INNER (mode)) / BITS_PER_UNIT) == 0;
> }
>
> /* Implement TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE.
> diff --git a/gcc/config/loongarch/loongarch.cc
> b/gcc/config/loongarch/loongarch.cc
> index ef5d5f4e060..145ed644f8b 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -11058,7 +11058,6 @@ void loongarch_emit_swdivsf (rtx res, rtx a, rtx b,
> machine_mode mode)
>
> static bool
> loongarch_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type,
> int misalignment,
> bool is_packed,
> bool is_gather_scatter)
> @@ -11072,7 +11071,7 @@ loongarch_builtin_support_vector_misalignment
> (machine_mode mode,
> if (misalignment == -1)
> return false;
> }
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index b93103616b8..959caf23b43 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -12648,12 +12648,11 @@ riscv_estimated_poly_value (poly_int64 val,
> /* Return true if the vector misalignment factor is supported by the
> target. */
> bool
> -riscv_support_vector_misalignment (machine_mode mode, const_tree type,
> - int misalignment, bool is_packed,
> - bool is_gather_scatter)
> +riscv_support_vector_misalignment (machine_mode mode, int misalignment,
> + bool is_packed, bool is_gather_scatter)
> {
> /* IS_PACKED is true if the corresponding scalar element is not naturally
> - aligned. If the misalignment is unknown and the the access is packed
> + aligned. If the misalignment is unknown and the access is packed
> we defer to the default hook which will check if movmisalign is present.
> Movmisalign, in turn, depends on TARGET_VECTOR_MISALIGN_SUPPORTED. */
> if (misalignment == DR_MISALIGNMENT_UNKNOWN)
> @@ -12665,12 +12664,12 @@ riscv_support_vector_misalignment (machine_mode
> mode, const_tree type,
> {
> /* If we know that misalignment is a multiple of the element size,
> we're
> good. */
> - if (misalignment % TYPE_ALIGN_UNIT (type) == 0)
> + if (misalignment % (GET_MODE_UNIT_SIZE (GET_MODE_INNER (mode))) == 0)
> return true;
> }
>
> /* Otherwise fall back to movmisalign again. */
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index 8dd23f8619c..66e95c557e0 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -4949,7 +4949,6 @@ rs6000_vector_alignment_reachable (const_tree type
> ATTRIBUTE_UNUSED, bool is_pac
> target. */
> static bool
> rs6000_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type,
> int misalignment,
> bool is_packed,
> bool is_gather_scatter)
> @@ -4975,13 +4974,13 @@ rs6000_builtin_support_vector_misalignment
> (machine_mode mode,
> {
> /* Misalignment factor is unknown at compile time but we know
> it's word aligned. */
> - if (rs6000_vector_alignment_reachable (type, is_packed))
> - {
> - int element_size = TREE_INT_CST_LOW (TYPE_SIZE (type));
> + if (rs6000_vector_alignment_reachable (NULL_TREE, is_packed))
> + {
> + int element_size = GET_MODE_UNIT_BITSIZE (mode);
>
> - if (element_size == 64 || element_size == 32)
> - return true;
> - }
> + if (element_size == 64 || element_size == 32)
> + return true;
> + }
>
> return false;
> }
> diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
> index 1a47f477dd3..d65109026f2 100644
> --- a/gcc/config/s390/s390.cc
> +++ b/gcc/config/s390/s390.cc
> @@ -17503,7 +17503,6 @@ s390_preferred_simd_mode (scalar_mode mode)
> /* Our hardware does not require vectors to be strictly aligned. */
> static bool
> s390_support_vector_misalignment (machine_mode mode ATTRIBUTE_UNUSED,
> - const_tree type ATTRIBUTE_UNUSED,
> int misalignment ATTRIBUTE_UNUSED,
> bool is_packed ATTRIBUTE_UNUSED,
> bool is_gather_scatter ATTRIBUTE_UNUSED)
> @@ -17511,7 +17510,7 @@ s390_support_vector_misalignment (machine_mode mode
> ATTRIBUTE_UNUSED,
> if (TARGET_VX)
> return true;
>
> - return default_builtin_support_vector_misalignment (mode, type,
> misalignment,
> + return default_builtin_support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter);
> }
> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
> index b80e6846dd7..2351bc7b29d 100644
> --- a/gcc/doc/tm.texi
> +++ b/gcc/doc/tm.texi
> @@ -6388,14 +6388,14 @@ return type of the vectorized function shall be of
> vector type
> @var{vec_type_out} and the argument types should be @var{vec_type_in}.
> @end deftypefn
>
> -@deftypefn {Target Hook} bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
> (machine_mode @var{mode}, const_tree @var{type}, int @var{misalignment}, bool
> @var{is_packed}, bool @var{is_gather_scatter})
> +@deftypefn {Target Hook} bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
> (machine_mode @var{mode}, int @var{misalignment}, bool @var{is_packed}, bool
> @var{is_gather_scatter})
> This hook should return true if the target supports misaligned vector
> store/load of a specific factor denoted in the @var{misalignment}
> -parameter. The vector store/load should be of machine mode @var{mode} and
> -the elements in the vectors should be of type @var{type}. The
> -@var{is_packed} parameter is true if the misalignment is unknown and the
> -memory access is defined in a packed struct. @var{is_gather_scatter} is true
> -if the load/store is a gather or scatter.
> +parameter. The vector store/load should be of machine mode @var{mode}.
> +The @var{is_packed} parameter is true if the misalignment is unknown and the
> +original memory access not naturally aligned. @var{is_gather_scatter} is
> +true if the load/store is a gather or scatter. In that case misalignment
> +denotes the misalignment of @var{mode}'s element mode.
> @end deftypefn
>
> @deftypefn {Target Hook} machine_mode TARGET_VECTORIZE_PREFERRED_SIMD_MODE
> (scalar_mode @var{mode})
> diff --git a/gcc/target.def b/gcc/target.def
> index d4fd3b46a7d..4933aab87a3 100644
> --- a/gcc/target.def
> +++ b/gcc/target.def
> @@ -1925,13 +1925,13 @@ DEFHOOK
> (support_vector_misalignment,
> "This hook should return true if the target supports misaligned vector\n\
> store/load of a specific factor denoted in the @var{misalignment}\n\
> -parameter. The vector store/load should be of machine mode @var{mode} and\n\
> -the elements in the vectors should be of type @var{type}. The\n\
> -@var{is_packed} parameter is true if the misalignment is unknown and the\n\
> -memory access is defined in a packed struct. @var{is_gather_scatter} is
> true\n\
> -if the load/store is a gather or scatter.",
> +parameter. The vector store/load should be of machine mode @var{mode}.\n\
> +The @var{is_packed} parameter is true if the misalignment is unknown and
> the\n\
> +original memory access not naturally aligned. @var{is_gather_scatter} is\n\
> +true if the load/store is a gather or scatter. In that case misalignment\n\
> +denotes the misalignment of @var{mode}'s element mode.",
> bool,
> - (machine_mode mode, const_tree type, int misalignment, bool is_packed,
> + (machine_mode mode, int misalignment, bool is_packed,
> bool is_gather_scatter),
> default_builtin_support_vector_misalignment)
>
> diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc
> index 947e39aedc1..dfd46eeb8af 100644
> --- a/gcc/targhooks.cc
> +++ b/gcc/targhooks.cc
> @@ -1551,8 +1551,6 @@ default_builtin_vector_alignment_reachable (const_tree
> /*type*/, bool is_packed)
> is_packed is true if the memory access is defined in a packed struct. */
> bool
> default_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree type
> - ATTRIBUTE_UNUSED,
> int misalignment
> ATTRIBUTE_UNUSED,
> bool is_packed
> diff --git a/gcc/targhooks.h b/gcc/targhooks.h
> index 34c30d4af45..44120676345 100644
> --- a/gcc/targhooks.h
> +++ b/gcc/targhooks.h
> @@ -113,7 +113,6 @@ extern poly_uint64 default_preferred_vector_alignment
> (const_tree);
> extern bool default_builtin_vector_alignment_reachable (const_tree, bool);
> extern bool
> default_builtin_support_vector_misalignment (machine_mode mode,
> - const_tree,
> int, bool, bool);
> extern machine_mode default_preferred_simd_mode (scalar_mode mode);
> extern machine_mode default_split_reduction (machine_mode);
> diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
> index a31ff93bbd3..56706b965c8 100644
> --- a/gcc/tree-vect-data-refs.cc
> +++ b/gcc/tree-vect-data-refs.cc
> @@ -6522,7 +6522,8 @@ vect_can_force_dr_alignment_p (const_tree decl,
> poly_uint64 alignment)
> alignment.
> If CHECK_ALIGNED_ACCESSES is TRUE, check if the access is supported even
> it is aligned, i.e., check if it is possible to vectorize it with
> different
> - alignment. If GS_INFO is passed we are dealing with a gather/scatter. */
> + alignment. If IS_GATHER_SCATTER is true we are dealing with a
> + gather/scatter. */
>
> enum dr_alignment_support
> vect_supportable_dr_alignment (vec_info *vinfo, dr_vec_info *dr_info,
> @@ -6636,11 +6637,12 @@ vect_supportable_dr_alignment (vec_info *vinfo,
> dr_vec_info *dr_info,
> }
> }
>
> - bool is_packed = false;
> - tree type = TREE_TYPE (DR_REF (dr));
> - if (misalignment == DR_MISALIGNMENT_UNKNOWN)
> - is_packed = not_size_aligned (DR_REF (dr));
> - if (targetm.vectorize.support_vector_misalignment (mode, type,
> misalignment,
> + bool is_packed = not_size_aligned (DR_REF (dr));
> + if (misalignment == DR_MISALIGNMENT_UNKNOWN
> + && is_gather_scatter)
> + misalignment = (get_object_alignment (DR_REF (dr))
> + % (GET_MODE_BITSIZE (GET_MODE_INNER (mode)))) /
> BITS_PER_UNIT;
> + if (targetm.vectorize.support_vector_misalignment (mode, misalignment,
> is_packed,
> is_gather_scatter))
> return dr_unaligned_supported;
> --
> 2.51.0
>