https://gcc.gnu.org/g:41db4716a5603052df626a1ab911b0b3fab322b2

commit r13-9442-g41db4716a5603052df626a1ab911b0b3fab322b2
Author: Jason Merrill <ja...@redhat.com>
Date:   Thu Mar 20 12:57:15 2025 -0400

    ipa: target clone and mangling alias [PR114992]
    
    Since the mangling of the second lambda changed (previously we counted all
    lambdas, now we only count lambdas with the same signature), we
    generate_mangling_alias for handler<lambda2> for backward compatibility.
    Since handler is COMDAT, resolve_alias puts the alias in the same comdat
    group as handler itself.  Then create_dispatcher_calls tries to add the
    alias to the same comdat group as the dispatcher, but it's already in a
    same_comdat_group, so we ICE.
    
    It seems like we're just missing a remove_from_same_comdat_group before
    add_to_same_comdat_group.
    
            PR c++/114992
    
    gcc/ChangeLog:
    
            * multiple_target.cc (create_dispatcher_calls):
            remove_from_same_comdat_group before add_to_same_comdat_group.
    
    gcc/testsuite/ChangeLog:
    
            * g++.target/i386/mangling-alias1.C: New test.
    
    (cherry picked from commit ab716829da7c885b97ac2649c7c0ff5c7703ffa5)

Diff:
---
 gcc/multiple_target.cc                          |  6 +++++-
 gcc/testsuite/g++.target/i386/mangling-alias1.C | 16 ++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
index a2ed048d7dd2..cc9f66f2decb 100644
--- a/gcc/multiple_target.cc
+++ b/gcc/multiple_target.cc
@@ -159,7 +159,11 @@ create_dispatcher_calls (struct cgraph_node *node)
              symtab_node *source = ref->referring;
              source->create_reference (inode, IPA_REF_ALIAS);
              if (inode->get_comdat_group ())
-               source->add_to_same_comdat_group (inode);
+               {
+                 if (source->same_comdat_group)
+                   source->remove_from_same_comdat_group ();
+                 source->add_to_same_comdat_group (inode);
+               }
            }
          else
            gcc_unreachable ();
diff --git a/gcc/testsuite/g++.target/i386/mangling-alias1.C 
b/gcc/testsuite/g++.target/i386/mangling-alias1.C
new file mode 100644
index 000000000000..70264e2b64e6
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/mangling-alias1.C
@@ -0,0 +1,16 @@
+// PR c++/114992
+// { dg-do compile { target { c++11 && x86_64-*-* } } }
+// { dg-require-ifunc }
+
+template <typename Callable>
+__attribute__((target_clones("avx2", "default")))
+void handler(Callable) {}
+
+inline int func()
+{
+  auto l1 = [](int) {}; // different lambda signature
+  handler([]() {}); // so this one needs a mangling alias
+  return 42;
+}
+
+int g = func();

Reply via email to