https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95790
--- Comment #2 from Yichao Yu <yyc1992 at gmail dot com> --- The C++ code attached above produces the following incorrect code with `g++ -O2 -S` .file "a.c" .text .p2align 4 .globl _Z3barv .type _Z3barv, @function _Z3barv: .LFB3: .cfi_startproc movl $4096, %eax ret .cfi_endproc .LFE3: .size _Z3barv, .-_Z3barv .p2align 4 .globl _Z3barv.avx .type _Z3barv.avx, @function _Z3barv.avx: .LFB4: .cfi_startproc movl $8192, %eax ret .cfi_endproc .LFE4: .size _Z3barv.avx, .-_Z3barv.avx .ident "GCC: (GNU) 10.1.0" .section .note.GNU-stack,"",@progbits Triggering the bug PR95778 with __attribute__ ((flatten,target ("default"))) static unsigned foo(const char *buf, unsigned size) { return 1; } __attribute__ ((flatten,target ("avx"))) static unsigned foo(const char *buf, unsigned size) { return 2; } __attribute__ ((flatten,target ("avx512f"))) static unsigned foo(const char *buf, unsigned size) { return 3; } __attribute__ ((target ("default"))) unsigned bar() { char buf[4096]; unsigned acc = 0; for (int i = 0; i < sizeof(buf); i++) { acc += foo(&buf[i], 1); } return acc; } __attribute__ ((target ("avx"))) unsigned bar() { char buf[4096]; unsigned acc = 0; for (int i = 0; i < sizeof(buf); i++) { acc += foo(&buf[i], 1); } return acc; } produces the correct code.