On Sat, Jun 20, 2020 at 11:37 AM Yichao Yu <[email protected]> wrote:
>
> On Sat, Jun 20, 2020 at 1:54 PM Yichao Yu <[email protected]> wrote:
> >
> > > > The current logic seems to be comparing the whole attribute tree
> > > > between the callee
> > > > and caller (or at least the tree starting from the target attribute).
> > > > This is unnecessary and causes strange dependency of the indirection
> > > > elimination on unrelated properties like `noinline`(PR95780) and
> > > > `visibility`(PR95778).
> > >
> > > Does it fix PR95780 and PR95778? Can you include testcases for them?
>
> OK so replacing
> https://github.com/gcc-mirror/gcc/commit/b8ce8129a560f64f8b2855c4a3812b7c3c0ebf3f#diff-e2d535917af8555baad2e9c8749e96a5
> with/adding to the test the following one should work. I still
> couldn't get test to run though......
>
Can you try the enclosed testcases?
>
> >
> > Yes it at least partially fixes them. As mentioned in the other email,
> > this still does not allow inlining but maybe that should be reported
> > as another issue?
Please open a separate bug.
> > I need to work on the test and might need some help.
> > Right now I'm not sure how to write such a test (I assume blaming on
> > the old implementation should tell me where the right test is though).
> > Also, make -k check somehow gives me some segfaults from LLVM. I was
> > wondering if it is related to that I was using an out-of-tree non
> > bootstrap build so I'm recompiling a bootstrap in-source build...
> >
> > >
> > > > This changes the comparison to be only on the `target` attribute which
> > > > should be
> > > > the intent of the code.
> > > > ---
> > > > gcc/multiple_target.c | 4 ++--
> > > > 1 file changed, 2 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c
> > > > index c1cfe8ff978..9eb0afd58cc 100644
> > > > --- a/gcc/multiple_target.c
> > > > +++ b/gcc/multiple_target.c
> > > > @@ -483,7 +483,7 @@ redirect_to_specific_clone (cgraph_node *node)
> > > > DECL_ATTRIBUTES
> > > > (e->callee->decl));
> > > >
> > > > /* Function is not calling proper target clone. */
> > > > - if (!attribute_list_equal (attr_target, attr_target2))
> > > > + if (attr_target2 == NULL_TREE || !attribute_value_equal
> > > > (attr_target, attr_target2))
> > > > {
> > > > while (fv2->prev != NULL)
> > > > fv2 = fv2->prev;
> > > > @@ -494,7 +494,7 @@ redirect_to_specific_clone (cgraph_node *node)
> > > > cgraph_node *callee = fv2->this_node;
> > > > attr_target2 = lookup_attribute ("target",
> > > > DECL_ATTRIBUTES
> > > > (callee->decl));
> > > > - if (attribute_list_equal (attr_target, attr_target2))
> > > > + if (attr_target2 != NULL_TREE && attribute_value_equal
> > > > (attr_target, attr_target2))
> > > > {
> > > > e->redirect_callee (callee);
> > > > cgraph_edge::redirect_call_stmt_to_callee (e);
> > > > --
> > > > 2.27.0
> > > >
> > >
> > >
> > > --
> > > H.J.
--
H.J.
/* { dg-do compile { target fpic } } */
/* { dg-options "-O3 -fPIC -fno-asynchronous-unwind-tables" } */
/* { dg-require-ifunc "" } */
__attribute__((target_clones("default,avx2")))
static int
f2(int *p)
{
asm volatile ("" :: "r"(p) : "memory");
return *p;
}
__attribute__((target_clones("default,avx2")))
int
g2(int *p)
{
return f2(p);
}
/* { dg-final { scan-assembler "g2.default.1:\n\tjmp\tf2.default.1\n" } } */
/* { dg-final { scan-assembler "g2.avx2.0:\n\tjmp\tf2.avx2.0\n" } } */
/* { dg-do compile { target fpic } } */
/* { dg-options "-O3 -fPIC -fno-asynchronous-unwind-tables" } */
/* { dg-require-ifunc "" } */
__attribute__((visibility("internal"),target_clones("default,avx2")))
int
f2(int *p)
{
asm volatile ("" :: "r"(p) : "memory");
return *p;
}
__attribute__((target_clones("default,avx2")))
int
g2(int *p)
{
return f2(p);
}
/* { dg-final { scan-assembler "g2.default.1:\n\tjmp\tf2.default.1\n" } } */
/* { dg-final { scan-assembler "g2.avx2.0:\n\tjmp\tf2.avx2.0\n" } } */