On Thu, May 16, 2019 at 1:53 PM Martin Liška <mli...@suse.cz> wrote:
>
> On 5/16/19 1:42 PM, Richard Biener wrote:
> > On Thu, May 16, 2019 at 1:38 PM Martin Liška <mli...@suse.cz> wrote:
> >>
> >> On 5/16/19 1:24 PM, Richard Biener wrote:
> >>> On Thu, May 16, 2019 at 1:18 PM Martin Liška <mli...@suse.cz> wrote:
> >>>>
> >>>> Hi.
> >>>>
> >>>> We should not allow target_clones being combined with alias attribute.
> >>>>
> >>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>>>
> >>>> Ready to be installed?
> >>>
> >>> So that's because an alias cannot be turned into a dispatcher and still
> >>> be an alias, correct?  So a way around this would be to turn the
> >>> alias into the dispatcher and clone the alias target, leaving the
> >>> plain alias target as default variant not going through the dispatcher?
> >>
> >> We do allow having an alias to a target clone symbol:
> >>
> >> __attribute__((target_clones("arch=haswell", "default"))) int __tanh() {}
> >> __typeof(__tanh) tanhf64 __attribute__((alias("__tanh")));
> >>
> >> Having that tanhf64 points to the resolver, which I believe is correct.
> >
> > In this case yes.  I think the case in the PR wants to have an alias
> > to the default variant instead and that's not possible so it tries to
> > do the cloning on an alias (basically tell cloning to use an alternate
> > symbol name for the resolver, leaving the default in place).  IMHO
> > a reasonable feature, not sure if a reasonable way to achieve.
>
> I see. Agree with you that it can be handy. On the other hand, one can use 
> target
> attribute:
>
> __attribute__((target("avx","arch=core-avx2")))
> int
> bar ()
> {
>   return 2;
> }
>
> __attribute__((target("default")))
> int
> bar ()
> {
>   return 2;
> }
>
> int barrr () __attribute__((alias("_Z3barv")));
>
> Which directly identifies a concrete implementation.

Hmm.  You reference the dispatcher here via barrr?
Who knows the mangling of the default version?

I guess having

__attribute__((target("avx" (bar_avx),"default" (bar_default))))
int bar() { ... }

would be nice, creating external symbols for the individual clones?

But maybe

int bar() { ... }
__attribute__((target("avx"))) int bar();
__attribute__((target("default"), alias("bar_default"))) int bar();

could already work for this.

Meanwhile your patch is OK I think.

Richard.

>
> Martin
>
> >
> >> The PR is about an alias that has itself target_clone attribute, which
> >> does not make sense.
> >>
> >>>
> >>> Of course in the testcase the body of the alias target isn't available
> >>> but that's a general issue, not special to aliases?
> >>
> >> We do the target_clone expansion just for node->definition which is true
> >> for node->alias == true symbols.
> >
> > I see.  I guess it should be done for node->analyzed only, but yes,
> > w/o considering aliases or thunks all definitions have bodies.
> >
> > Richard.
> >
> >> Martin
> >>
> >>>
> >>> Richard.
> >>>
> >>>> Thanks,
> >>>> Martin
> >>>>
> >>>> gcc/ChangeLog:
> >>>>
> >>>> 2019-05-16  Martin Liska  <mli...@suse.cz>
> >>>>
> >>>>         PR lto/90500
> >>>>         * multiple_target.c (expand_target_clones): Do not allow
> >>>>         target_clones being used with a symbol that is an alias.
> >>>>
> >>>> gcc/testsuite/ChangeLog:
> >>>>
> >>>> 2019-05-16  Martin Liska  <mli...@suse.cz>
> >>>>
> >>>>         PR lto/90500
> >>>>         * gcc.target/i386/pr90500-1.c: New test.
> >>>>         * gcc.target/i386/pr90500-2.c: New test.
> >>>> ---
> >>>>  gcc/multiple_target.c                     | 5 ++++-
> >>>>  gcc/testsuite/gcc.target/i386/pr90500-1.c | 8 ++++++++
> >>>>  gcc/testsuite/gcc.target/i386/pr90500-2.c | 7 +++++++
> >>>>  3 files changed, 19 insertions(+), 1 deletion(-)
> >>>>  create mode 100644 gcc/testsuite/gcc.target/i386/pr90500-1.c
> >>>>  create mode 100644 gcc/testsuite/gcc.target/i386/pr90500-2.c
> >>>>
> >>>>
> >>
>

Reply via email to