>> In that case I relied on !is_packed for riscv. > > I guess it's easiest to keep is_packed then, but is it having the data > accesses aligned to element _size_ or to element mode alignment? > For gather a target couldn't distinguish this based on is_packed, > but when misalignment is the misalignment of the element in this > case it could?
Hmm, so something like the attached? Actually for riscv it's even better to not use size alignment because the uint8_t in x264 seem to be aligned to 4 bytes so we can actually read ints safely. [PATCH] vect: Remove type from misalignment hook. 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. 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 | 5 +++-- gcc/config/loongarch/loongarch.cc | 3 +-- gcc/config/riscv/riscv.cc | 12 ++++++------ 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 | 13 +++++++++---- 13 files changed, 45 insertions(+), 47 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..b018f96e8bc 100644 --- a/gcc/config/gcn/gcn.cc +++ b/gcc/config/gcn/gcn.cc @@ -5368,7 +5368,7 @@ 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) { @@ -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..0b77672becb 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,13 @@ 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_ALIGNMENT (GET_MODE_INNER (mode)) + / BITS_PER_UNIT) == 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 37642680f42..e1267fa25f7 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 +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 between the alignment 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 8e491d83864..2f7406f3316 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\ +memory access not naturally aligned. @var{is_gather_scatter} is true\n\ +if the load/store is a gather or scatter. In that case misalignment denotes\n\ +the misalignment between the alignment 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..1e0c086be68 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, @@ -6637,10 +6638,14 @@ 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, + { + is_packed = not_size_aligned (DR_REF (dr)); + if (is_gather_scatter) + misalignment = get_object_alignment (DR_REF (dr)) + % (GET_MODE_ALIGNMENT (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