https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101696
Bug ID: 101696 Summary: Function multiversioning not usable with new x86-64-v* Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: h2+bugs at fsfe dot org Target Milestone: --- I really like the new feature levels, so I have created the respective binaries for an application. I now want to dispatch to the correct one, so I thought the easiest thing would be to have a small "arch_detect" program that gives me the feature level as return value: __attribute__ ((target ("default"))) int foo () { // The default version of foo. return 0; } __attribute__ ((target ("arch=x86-64"))) int foo () { return 1; } __attribute__ ((target ("arch=x86-64-v2"))) int foo () { return 2; } __attribute__ ((target ("arch=x86-64-v3"))) int foo () { return 3; } __attribute__ ((target ("arch=x86-64-v4"))) int foo () { return 4; } int main () { return foo(); } This builds fine but always returns 0 -- independent of whether I build the binary without -march or with -march=x86-64-v4. Curiously, if I add the following overload: __attribute__ ((target ("sse4.2"))) int foo () { // The default version of foo. return 7; } it will no longer build without -march=x86-64-v4, complaining that "no dispatcher was found for the versioning attributes". If I add -march=x86-64-v4, it will build without errors but always return 7 and not the feature level. What am I missing?