Hi Carl,
on 2024/7/23 01:37, Carl Love wrote:
>
> Kewen:
>
> On 7/22/24 2:09 AM, Kewen.Lin wrote:
>> Hi Carl,
>>
>> on 2024/7/18 00:01, Carl Love wrote:
>>> GCC maintainers:
>>>
>>> This patch removes the __builtin_vec_set_v1ti, __builtin_vec_set_v2df and
>>> __builtin_vec_set_v2di built-ins. The users should just use normal C-code
>>> to update the various vector elements. This change was originally intended
>>> to be part of the earlier series of cleanup patches. It was initially
>>> thought that some additional work would be needed to do some gimple
>>> generation instead of these built-ins. However, the existing default code
>>> generation does produce the needed code. The code generated with normal
>>> C-code is as good or better than the code generated with these built-ins.
>> I think we need to expand this a bit:
>> - For vec_set bif, the equivalent C code is as good as or better than it.
>> - For vec_insert bif whose resolving makes use of vec_set bif previously
>> (now get removed),
>> it's as good as before with optimization.
>>> The patch has been tested on Power 10 LE with no regressions.
>>>
>>> Please let me know if the patch is acceptable for mainline. Thanks.
>>>
>>> Carl
>>>
>>> ---------------------------------------------------------------
>>> rs6000, Remove __builtin_vec_set_v1ti, __builtin_vec_set_v2df,
>>> __builtin_vec_set_v2di
>>>
>>> Remove the built-ins, use the default gimple generation instead.
>>>
>>> gcc/ChangeLog:
>>> * config/rs6000/rs6000-builtins.def (__builtin_vec_set_v1ti,
>>> __builtin_vec_set_v2df, __builtin_vec_set_v2di): Remove built-in
>>> definitions.
>>> * config/rs6000/rs6000-c.cc (resolve_vec_insert): Remove if
>>> statemnts for mode == V2DFmode, mode == V2DImode and
>> Nit: s/statemnts/statements/
>
> OK, fixed
>> Maybe a bit more meaningful like: Remove the handling for constant
>> vec_insert position
>> with VECTOR_UNIT_VSX_P V1TImode, V2DFmode and V2DImode modes.
> OK, changed
>>
>>
>>> mode == V1TImode that reference RS6000_BIF_VEC_SET_V2DF,
>>> RS6000_BIF_VEC_SET_V2DI and RS6000_BIF_VEC_SET_V1TI.
>>> ---
>>> gcc/config/rs6000/rs6000-builtins.def | 13 ---------
>>> gcc/config/rs6000/rs6000-c.cc | 40 ---------------------------
>>> 2 files changed, 53 deletions(-)
>>>
>>> diff --git a/gcc/config/rs6000/rs6000-builtins.def
>>> b/gcc/config/rs6000/rs6000-builtins.def
>>> index 896d9686ac6..0ebc940f395 100644
>>> --- a/gcc/config/rs6000/rs6000-builtins.def
>>> +++ b/gcc/config/rs6000/rs6000-builtins.def
>>> @@ -1263,19 +1263,6 @@
>>> const signed long long __builtin_vec_ext_v2di (vsll, signed int);
>>> VEC_EXT_V2DI nothing {extract}
>>>
>>> -;; VEC_SET_V1TI, VEC_SET_V2DF and VEC_SET_V2DI are used in
>>> -;; resolve_vec_insert(), rs6000-c.cc
>>> -;; TODO: Remove VEC_SET_V1TI, VEC_SET_V2DF and VEC_SET_V2DI once the uses
>>> -;; in resolve_vec_insert are replaced by the equivalent gimple statements.
>>> - const vsq __builtin_vec_set_v1ti (vsq, signed __int128, const int<0,0>);
>>> - VEC_SET_V1TI nothing {set}
>>> -
>>> - const vd __builtin_vec_set_v2df (vd, double, const int<1>);
>>> - VEC_SET_V2DF nothing {set}
>>> -
>>> - const vsll __builtin_vec_set_v2di (vsll, signed long long, const int<1>);
>>> - VEC_SET_V2DI nothing {set}
>>> ->> Unexpected empty line removed.
> ?? I don't remove the blank line before the removed comment, so there is
> still a single blank line before the next entry. Specifically, the code with
> the above removed now looks like:
>
> ...
> const signed long long __builtin_vec_ext_v2di (vsll, signed int);
> VEC_EXT_V2DI nothing {extract}
>
> const vsc __builtin_vsx_cmpge_16qi (vsc, vsc);
> CMPGE_16QI vector_nltv16qi {}
>
> const vsll __builtin_vsx_cmpge_2di (vsll, vsll);
> CMPGE_2DI vector_nltv2di {}
> ....
>
> Which looks OK to me?
ah, I missed that, so it's fine, thanks for clarifying!
>>
>> Similar to vec_init removal, we should also get rid of set bif attribute,
>> bif_is_set and altivec_expand_vec_set_builtin etc.
> That will also require removing:
>
> const vsq __builtin_vsx_set_1ti (vsq, signed __int128, const int<0,0>);
> SET_1TI vsx_set_v1ti {set}
>
> const vd __builtin_vsx_set_2df (vd, double, const int<0,1>);
> SET_2DF vsx_set_v2df {set}
>
> const vsll __builtin_vsx_set_2di (vsll, signed long long, const int<0,1>);
> SET_2DI vsx_set_v2di {set}
I have no idea what are these three builtins for, they have the same prototypes
as the above removed builtins (just with different bif names), and also are
bif_is_set so I'd expect they are handled the same as the removed ones.
I guessed they were designed to be used as overloaded instances for vec_set but
eventually we handled vec_set differently (via bif attribute).
>
> I would assume the C-code generation for the above will be as good or better
> than the code generation for the built-ins but will need to verify that. I
> haven't looked at them specifically.
>
Yeah, it's good to verify, thanks.
BR,
Kewen
> Carl