Skip to content

Commit 4abac2f

Browse files
jambormMartin Jambor
authored andcommitted
lto: Add an entry for cold attribute to lto_gnu_attributes
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. gcc/ChangeLog: 2025-02-03 Martin Jambor <mjambor@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 <mjambor@suse.cz> PR lto/118125 * lto-lang.cc (lto_gnu_attributes): Add an entry for cold attribute. (handle_cold_attribute): New function.
1 parent c74e7f6 commit 4abac2f

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

gcc/ipa-fnsummary.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ redirect_to_unreachable (struct cgraph_edge *e)
255255
struct cgraph_node *target
256256
= cgraph_node::get_create (builtin_decl_unreachable ());
257257

258+
gcc_checking_assert (lookup_attribute ("cold",
259+
DECL_ATTRIBUTES (target->decl)));
260+
258261
if (e->speculative)
259262
e = cgraph_edge::resolve_speculation (e, target->decl);
260263
else if (!e->callee)

gcc/lto/lto-lang.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ static tree ignore_attribute (tree *, tree, tree, int, bool *);
6060
static tree handle_format_attribute (tree *, tree, tree, int, bool *);
6161
static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *);
6262
static tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
63+
static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
6364

6465
/* Helper to define attribute exclusions. */
6566
#define ATTR_EXCL(name, function, type, variable) \
@@ -128,6 +129,8 @@ static const attribute_spec lto_gnu_attributes[] =
128129
handle_sentinel_attribute, NULL },
129130
{ "type generic", 0, 0, false, true, true, false,
130131
handle_type_generic_attribute, NULL },
132+
{ "cold", 0, 0, false, false, false, false,
133+
handle_cold_attribute, NULL },
131134
{ "fn spec", 1, 1, false, true, true, false,
132135
handle_fnspec_attribute, NULL },
133136
{ "transaction_pure", 0, 0, false, true, true, false,
@@ -598,6 +601,16 @@ handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
598601
return NULL_TREE;
599602
}
600603

604+
/* Handle a "cold" attribute; arguments as in
605+
struct attribute_spec.handler. */
606+
607+
static tree
608+
handle_cold_attribute (tree *, tree, tree, int, bool *)
609+
{
610+
/* Nothing to be done here. */
611+
return NULL_TREE;
612+
}
613+
601614
/* Cribbed from c-common.cc. */
602615

603616
static void

0 commit comments

Comments
 (0)