On Tue, Mar 17, 2026 at 9:06 AM Yangyu Chen <[email protected]> wrote:
>
>
>
> > On 2 Mar 2026, at 15:09, Yangyu Chen <[email protected]> wrote:
> >
> > When a target_clones function is inlined, the resolver function's
> > assembler name must be properly registered in the symbol table.
> > Using SET_DECL_ASSEMBLER_NAME only updates the tree node without
> > notifying the symbol table, which can lead to an ICE during IPA
> > inlining when the assembler name hash becomes inconsistent.
> >
> > Replace SET_DECL_ASSEMBLER_NAME with symtab->change_decl_assembler_name
> > in make_resolver_func to properly update the symbol table's assembler
> > name mapping.
> >
> > This only happens on x86, other targets already uses
> > symtab->change_decl_assembler_name.
> >
> > Fixes: b500cd2634 ("x86: fmv: Refactor FMV name mangling.")
> > Signed-off-by: Yangyu Chen <[email protected]>
> >
>
> Ping.

I have already OK'd this patch [1].

[1] https://gcc.gnu.org/pipermail/gcc-patches/2026-March/709609.html

Please also read [2], especially the second paragraph in the "Pinging
patches, Getting patches applied" chapter.

[2] https://gcc.gnu.org/contribute.html

Uros.

>
> > gcc/ChangeLog:
> >
> > * config/i386/i386-features.cc (make_resolver_func): Use
> > symtab->change_decl_assembler_name instead of
> > SET_DECL_ASSEMBLER_NAME to properly update the symbol table.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * gcc.target/i386/tct-ipa-inline-ice.c: New test.
> > ---
> > To reproduce the ICE in the test, we need to allow inlining of
> > target_clones functions, just apply the following patch to c-attribs.cc:
> >
> > diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
> > index 10d9a51418e..8428e303f08 100644
> > --- a/gcc/c-family/c-attribs.cc
> > +++ b/gcc/c-family/c-attribs.cc
> > @@ -6439,9 +6439,6 @@ handle_target_clones_attribute (tree *node, tree 
> > name, tree ARG_UNUSED (args),
> >                     "single %<target_clones%> attribute is ignored");
> >          *no_add_attrs = true;
> >        }
> > -      else
> > -      /* Do not inline functions with multiple clone targets.  */
> > -       DECL_UNINLINABLE (*node) = 1;
> >     }
> >   else
> >     {
> >
> > ---
> > gcc/config/i386/i386-features.cc              |  2 +-
> > .../gcc.target/i386/tct-ipa-inline-ice.c      | 48 +++++++++++++++++++
> > 2 files changed, 49 insertions(+), 1 deletion(-)
> > create mode 100644 gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c
> >
> > diff --git a/gcc/config/i386/i386-features.cc 
> > b/gcc/config/i386/i386-features.cc
> > index 0e4fdcd2853..9200e0c076c 100644
> > --- a/gcc/config/i386/i386-features.cc
> > +++ b/gcc/config/i386/i386-features.cc
> > @@ -5601,7 +5601,7 @@ make_resolver_func (const tree default_decl,
> >
> >   tree id = ix86_mangle_decl_assembler_name
> >     (decl, node->function_version ()->assembler_name);
> > -  SET_DECL_ASSEMBLER_NAME (decl, id);
> > +  symtab->change_decl_assembler_name (decl, id);
> >
> >   DECL_NAME (decl) = DECL_NAME (default_decl);
> >   TREE_USED (decl) = 1;
> > diff --git a/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c 
> > b/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c
> > new file mode 100644
> > index 00000000000..b8f77372e00
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c
> > @@ -0,0 +1,48 @@
> > +/* Test function multiversioning and inlining of a function with a
> > +   target_clones attribute.  Note, we need to allow inlining of
> > +   target_clones functions, see
> > +   "Do not inline functions with multiple clone targets." in c-attribs.cc,
> > +   otherwise the test would not trigger the ICE.  */
> > +/* { dg-do assemble } */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-O3" } */
> > +
> > +struct range_state
> > +{
> > +  unsigned int n;
> > +  unsigned int s[58];
> > +  unsigned int *q[58];
> > +};
> > +
> > +struct coder_state
> > +{
> > +  struct range_state r;
> > +  unsigned int t;
> > +  unsigned int x[12];
> > +};
> > +
> > +inline void
> > +bar(struct range_state *r, unsigned int *ptr, unsigned int value)
> > +{
> > +  r->s[r->n] = value;
> > +  r->q[r->n] = ptr;
> > +  ++r->n;
> > +}
> > +
> > +__attribute__((target_clones("default", "arch=x86-64-v2")))
> > +inline void
> > +foo(struct coder_state *c, unsigned int back)
> > +{
> > +  if (back == ~0u) {
> > +    bar(&c->r, &c->x[c->t], 0);
> > +  }
> > +}
> > +
> > +__attribute__((target_clones("default", "arch=x86-64-v2")))
> > +int
> > +ice_trigger(struct coder_state *c, unsigned int back)
> > +{
> > +  while (1) {
> > +    foo(c, back);
> > +  }
> > +}
> > --
> > 2.47.3
>

Reply via email to