https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109510
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- In patch form what I wrote above (completely untested): --- gcc/config/aarch64/aarch64.cc.jj 2023-04-14 09:15:08.470312336 +0200 +++ gcc/config/aarch64/aarch64.cc 2023-04-14 12:08:59.785137542 +0200 @@ -7459,6 +7459,8 @@ aarch64_vfp_is_call_candidate (cumulativ nregs, NULL, pcum->silent_p); } +static HOST_WIDE_INT aarch64_simd_vector_alignment (const_tree); + /* Given MODE and TYPE of a function argument, return the alignment in bits. The idea is to suppress any stronger alignment requested by the user and opt for the natural alignment (specified in AAPCS64 \S @@ -7487,16 +7489,16 @@ aarch64_function_arg_alignment (machine_ { /* The ABI alignment is the natural alignment of the type, without any attributes applied. Normally this is the alignment of the - TYPE_MAIN_VARIANT, but not always; see PR108910 for a counterexample. - For now we just handle the known exceptions explicitly. */ + TYPE_MAIN_VARIANT, but not always; see PR108910 for a + counterexample. */ + unsigned int ret; type = TYPE_MAIN_VARIANT (type); - if (POINTER_TYPE_P (type)) - { - gcc_assert (known_eq (POINTER_SIZE, GET_MODE_BITSIZE (mode))); - return POINTER_SIZE; - } - gcc_assert (!TYPE_USER_ALIGN (type)); - return TYPE_ALIGN (type); + if (VECTOR_TYPE_P (type)) + ret = aarch64_simd_vector_alignment (type); + else + ret = GET_MODE_ALIGNMENT (TYPE_MODE (type)); + gcc_assert (TYPE_USER_ALIGN (type) || ret == TYPE_ALIGN (type)); + return ret; } if (TREE_CODE (type) == ARRAY_TYPE)