https://gcc.gnu.org/g:ab716829da7c885b97ac2649c7c0ff5c7703ffa5
commit r15-8651-gab716829da7c885b97ac2649c7c0ff5c7703ffa5 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. 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 d8becf4d9a96..d25277c0a930 100644 --- a/gcc/multiple_target.cc +++ b/gcc/multiple_target.cc @@ -155,7 +155,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();