On Sat, Jun 20, 2020 at 9:17 AM Yichao Yu via Gcc-patches
<gcc-patches@gcc.gnu.org> 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?

> 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.

Reply via email to