Kyrylo Tkachov <[email protected]> writes:
> Hi Jakub,
>
>> -----Original Message-----
>> From: Jakub Jelinek <[email protected]>
>> Sent: 13 March 2021 20:34
>> To: Richard Sandiford <[email protected]>; Richard Earnshaw
>> <[email protected]>; Kyrylo Tkachov <[email protected]>
>> Cc: [email protected]
>> Subject: [PATCH] aarch64: Fix up
>> aarch64_simd_clone_compute_vecsize_and_simdlen [PR99542]
>>
>> Hi!
>>
>> As the patch shows, there are several bugs in
>> aarch64_simd_clone_compute_vecsize_and_simdlen.
>> One is that unlike for function declarations that aren't definitions
>> it completely ignores argument types. Such decls don't have
>> DECL_ARGUMENTS,
>> but we can walk TYPE_ARG_TYPES instead, like the i386 backend does or like
>> the simd cloning code in the middle end does too.
>>
>> Another problem is that it checks types of uniform arguments. That is
>> unnecessary, uniform arguments are passed the way it normally is, it is
>> a scalar argument rather than vector, so there is no reason not to support
>> uniform argument of different size, or long double, structure etc.
>>
>> Fixed thusly, bootstrapped/regtested on aarch64-linux, ok for trunk?
>
> I don't have much experience in this part of GCC and I think you're best
> placed to make a judgement on the implementation of this hook.
> It's okay from my perspective (it doesn't look like it would break any SVE
> logic), but if you'd like to wait for a review from Richard I won't object.
Yeah, it looks good to me too, sorry for the slow response.
IMO:
tree type_arg_types = TYPE_ARG_TYPES (TREE_TYPE (node->decl));
bool decl_arg_p = (node->definition || type_arg_types == NULL_TREE);
for (t = (decl_arg_p ? DECL_ARGUMENTS (node->decl) : type_arg_types), i = 0;
t && t != void_list_node; t = TREE_CHAIN (t), i++)
{
tree arg_type = decl_arg_p ? TREE_TYPE (t) : TREE_VALUE (t);
shows we have an interface problem here -- we shouldn't need something this
convoluted to walk through an argument list. But that's not your problem
or a problem with the patch.
Thanks,
Richard