On Mon, Feb 10, 2025 at 11:01 PM Martin Jambor <mjam...@suse.cz> wrote:
>
> Hi,
>
> PR 118125 is a performance regression stemming from the fact that we
> lose the cold attribute of our __builtin_unreachable.  The attribute
> is simply and silently dropped on the floor by decl_attributes (in
> attribs.cc) in the process of building decls for builtins because it
> cannot look it up in the gnu attribute name space by
> lookup_scoped_attribute_spec.  For that not to happen it must be in
> lto_gnu_attributes and this patch adds it there.
>
> In comment 13 of the bug Andrew identified other attributes which are
> in builtin-attrs.def but missing in lto_gnu_attributes but apart from
> cold it seems that they are either not used in builtins.def or are
> used in DEF_LIB_BUILTIN which I guess might be less critical?
> Eventually I decided to go for the most simple of patches and only add
> things if they are requested.  For the same reason I also did not add
> any checking to the attribute "handle" callback or any exclusion check.
> They seem to be mostly relevant before LTO FE kicks in to me, but
> again, I'm happy to add any if they seem to be useful.
>
> Since Ian fixed PR 118746, the same issue has also been fixed in the
> Go front-end and so I have added a simple checking assert to the
> redirect_to_unreachable function to make sure it has the intended
> effect.
>
> LTO-bootstrapped and tested on x86_64-linux.  OK for master?

OK.

Thanks,
Richard.

> Thanks,
>
> Martin
>
>
> gcc/ChangeLog:
>
> 2025-02-03  Martin Jambor  <mjam...@suse.cz>
>
>         PR lto/118125
>         * ipa-fnsummary.cc (redirect_to_unreachable): Add checking assert
>         that the builtin_unreachable decl has attribute cold.
>
> gcc/lto/ChangeLog:
>
> 2025-02-03  Martin Jambor  <mjam...@suse.cz>
>
>         PR lto/118125
>         * lto-lang.cc (lto_gnu_attributes): Add an entry for cold attribute.
>         (handle_cold_attribute): New function.
> ---
>  gcc/ipa-fnsummary.cc |  3 +++
>  gcc/lto/lto-lang.cc  | 13 +++++++++++++
>  2 files changed, 16 insertions(+)
>
> diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
> index 33f19365ec3..4c062fe8a0e 100644
> --- a/gcc/ipa-fnsummary.cc
> +++ b/gcc/ipa-fnsummary.cc
> @@ -255,6 +255,9 @@ redirect_to_unreachable (struct cgraph_edge *e)
>    struct cgraph_node *target
>      = cgraph_node::get_create (builtin_decl_unreachable ());
>
> +  gcc_checking_assert (lookup_attribute ("cold",
> +                                        DECL_ATTRIBUTES (target->decl)));
> +
>    if (e->speculative)
>      e = cgraph_edge::resolve_speculation (e, target->decl);
>    else if (!e->callee)
> diff --git a/gcc/lto/lto-lang.cc b/gcc/lto/lto-lang.cc
> index 652d7fc5e30..e41b548b398 100644
> --- a/gcc/lto/lto-lang.cc
> +++ b/gcc/lto/lto-lang.cc
> @@ -60,6 +60,7 @@ static tree ignore_attribute (tree *, tree, tree, int, bool 
> *);
>  static tree handle_format_attribute (tree *, tree, tree, int, bool *);
>  static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *);
>  static tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
> +static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
>
>  /* Helper to define attribute exclusions.  */
>  #define ATTR_EXCL(name, function, type, variable)      \
> @@ -128,6 +129,8 @@ static const attribute_spec lto_gnu_attributes[] =
>                               handle_sentinel_attribute, NULL },
>    { "type generic",           0, 0, false, true, true, false,
>                               handle_type_generic_attribute, NULL },
> +  { "cold",                  0, 0, false,  false, false, false,
> +                             handle_cold_attribute, NULL },
>    { "fn spec",               1, 1, false, true, true, false,
>                               handle_fnspec_attribute, NULL },
>    { "transaction_pure",              0, 0, false, true, true, false,
> @@ -598,6 +601,16 @@ handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, 
> tree ARG_UNUSED (name),
>    return NULL_TREE;
>  }
>
> +/* Handle a "cold" attribute; arguments as in
> +   struct attribute_spec.handler.  */
> +
> +static tree
> +handle_cold_attribute (tree *, tree, tree, int, bool *)
> +{
> +  /* Nothing to be done here.  */
> +  return NULL_TREE;
> +}
> +
>  /* Cribbed from c-common.cc.  */
>
>  static void
> --
> 2.47.1
>

Reply via email to