https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78188
--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> --- Testcase is alongside int a; static void __attribute__((noinline)) foo () { a = 1; } static void __attribute__((noinline)) foo2 () { a = 2; } struct X { virtual void bar (int i) { if (!i) { foo (); __builtin_abort (); } } }; void baz (int i) { if (!i) { foo2 (); __builtin_abort (); } } X xx; which should make both foo and foo2 .text.unlikely and ipa-comdat should move foo into bars comdat group. On x86_64-linux it happens that we can have both .text.unlikely and comdat membership: .section .text.unlikely._ZL3foov,"axG",@progbits,_ZN1X3barEi,comdat .type _ZL3foov, @function _ZL3foov: .LFB0: .cfi_startproc movl $1, a(%rip) ret and it doesn't conflict with: .section .text.unlikely,"ax",@progbits .type _ZL4foo2v, @function _ZL4foo2v: .LFB1: .cfi_startproc movl $2, a(%rip) ret .cfi_endproc With the cross to AIX I get ./../trunk-g/gcc/t.C: In function ‘void foo2()’: ../../trunk-g/gcc/t.C:3:39: error: void foo2() causes a section type conflict with void foo() static void __attribute__((noinline)) foo2 () { a = 2; } ^~~~ ../../trunk-g/gcc/t.C:2:39: note: ‘void foo()’ was declared here static void __attribute__((noinline)) foo () { a = 1; } ^~~