> On 6 May 2025, at 17:49, Alfie Richards <alfie.richa...@arm.com> wrote:
> 
> On 06/05/2025 09:36, Yangyu Chen wrote:
>>> On 6 May 2025, at 16:01, Alfie Richards <alfie.richa...@arm.com> wrote:
>>> 
>>> Hello,
>>> 
>>> I like this idea. I have a couple thoughts to add.
>>> 
>>> On 05/05/2025 09:46, Yangyu Chen wrote:
>>>>> On 5 May 2025, at 16:34, Kyrylo Tkachov <ktkac...@nvidia.com> wrote:
>>>>> 
>>>>>> On 4 May 2025, at 19:19, Yangyu Chen <c...@cyyself.name> wrote:
>>>>>> 
>>>>>> Hi everyone,
>>>>>> 
>>>>>> This patch series introduces support for the target_clones profile
>>>>>> option in GCC. This option enables users to specify target_clones
>>>>>> attributes in a separate file, allowing GCC to generate multiple
>>>>>> versions of the function with different ISA extensions based on the
>>>>>> specified profile. This is achieved using the -ftarget-profile
>>>>>> option.
>>>>> 
>>>>> Interesting idea, but the terminology is confusing as is.
>>>>> In GCC “profile” usually refers to an execution profile gathered through 
>>>>> PGO instrumentation or perf.
>>>>> Whereas here I think you use “profile” to mean a “RISC-V profile” which 
>>>>> is something like a set of target architecture extensions?
>>>>> Thanks,
>>>>> Kyrill
>>>>> 
>>>> Sorry for the unclear information. The target profile here refers
>>>> to the target_clones attribute for each function. You can find an
>>>> example in the second patch.
>>> 
>>> I was also confused by the naming initially. Maybe something like
>>> "-ffunction-clone-table" instead?
>> Indeed. I will change that in the next revision.
>>> 
>>>> For instance, we want a function foo to generate default and RISC-V
>>>> vector targets, while a function bar should generate default and
>>>> zba,zbb targets. The corresponding source code could be as follows:
>>>> ```
>>>> __attribute__((target_clones("default","arch=+v")))
>>>> void foo();
>>>> __attribute__((target_clones("default","arch=+zba,+zbb")))
>>>> void bar();
>>>> ```
>>>> But if we have a target profile, we can describe it as follows in
>>>> a separate file:
>>>> ```
>>>> foo:default#arch=+v
>>>> bar:default#arch=+zba,+zbb
>>>> ```
>>> 
>>> As every function needs the default version it might be nice to make that 
>>> implicit. We can then avoid representing and subsequently diagnosing 
>>> invalid files. This could then be:
>>> 
>>> ```
>>> foo:arch=+v
>>> bar:arch=+zba,+zbb#+v
>>> ```
>> Great idea! This will make the table simpler.
>>> 
>>> Additionally, I think ideally the file can express functions disambiguated 
>>> by file, signature, and namespace.
>>> I imagine we could use similar syntax to gdb supports?
>>> 
>>> For example:
>>> 
>>> ```
>>> foo              |arch=+v
>>> bar(int, char)   |arch=+zba,+zbb
>>> file.C:baz(char) |arch=+zba,+zbb#arch=+v
>>> namespace::qux   |arch=+v
>>> ```
>> Also a great idea. However, I think it's not easy to use to implement
>> it now in GCC. But I would like to accept any further feedback if
>> we have such a simple API in GCC to do so, or if it will be implemented
>> by the community.
>> And something behind this idea is that I'm researching auto-generating
>> target clones attributes for developers. Only accepting the ASM
>> name is enough to implement this.
> 
> Ah that makes sense, apologies I missed that.
> 
> I think accepting the assembler name is good, and solves the overloading 
> ambiguity issue.
> 
> Maybe we can use the pipe '|' instead of ':' in the file format to leave room 
> for both in future?


I will consider using the pipe '|' in the next revision. Thanks for
the advice.

> I think as function name == assembler name in C and C++ mangled assembler 
> names are necessarily not valid C++ function names we should be safe to leave 
> that as further expansion? (I’m not sure about Fortran and other frontends 
> though?)
> 

Yeah, I should also check other frontends. And I should also check
other architectures that use the '|' character in their target
attribute strings.

Thanks,
Yangyu Chen

> Kind regards,
> Alfie Richards
> 
>> Thanks,
>> Yangyu Chen
>>> 
>>> Thanks,
>>> Alfie Richards
>>> 
>>>> Thanks,
>>>> Yangyu Chen
>>>>>> 
>>>>>> The primary objective of this patch series is to provide a
>>>>>> user-friendly way to specify target_clones attributes without
>>>>>> modifying the source code. This approach enhances the source code's
>>>>>> cleanliness, facilitates easier maintenance, and ensures portability
>>>>>> across different architectures and compiler versions.
>>>>>> 
>>>>>> The example usage of the target_clones profile option is detailed in
>>>>>> the commit message of the second patch.
>>>>>> 
>>>>>> I understand that this patch lacks comprehensive documentation and
>>>>>> test cases, as I am still in the process of writing them.
>>>>>> However, I would appreciate feedback on the implementation before
>>>>>> adding them. If the implementation is deemed acceptable, I
>>>>>> will proceed with writing the documentation and test cases.
>>>>>> 
>>>>>> Yangyu Chen (2):
>>>>>> Fortran: Do not make_decl_rtl in trans_function_start
>>>>>> Add target_clones profile option support
>>>>>> 
>>>>>> gcc/common.opt            |  7 +++++++
>>>>>> gcc/fortran/trans-decl.cc |  3 ---
>>>>>> gcc/multiple_target.cc    | 24 +++++++++++++++++++++++-
>>>>>> gcc/opts.cc               | 23 +++++++++++++++++++++++
>>>>>> 4 files changed, 53 insertions(+), 4 deletions(-)
>>>>>> 
>>>>>> -- 
>>>>>> 2.49.0


Reply via email to