https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106816
Bug ID: 106816 Summary: noreturn/pure attributes are not set correctly on multiversioned functions Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ipa Assignee: unassigned at gcc dot gnu.org Reporter: gcc.gnu at vvalter dot com CC: marxin at gcc dot gnu.org Target Milestone: --- During the investigation of PR106627, Richard noted ( https://gcc.gnu.org/pipermail/gcc-patches/2022-September/600777.html ) that attributes like noreturn and pure on multiversioned functions are lost when the function declaration is replaced by the dispatcher declaration in the same way that the TREE_NOTHROW attribute got lost, which was fixed in PR106627. Example: __attribute__((noreturn,target("default"))) void f() { for (;;) {} } __attribute__((noreturn,target("sse4.2,bmi"))) void f() { for (;;) {} } int main() { f(); return 1; } Gcc should create no code after the call to f(), but the assembly output with -O3 looks like the following: call _Z5_Z1fvv@PLT movl $1, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret For a non-multiversioned function, no assembly instructions are generated after the call instruction. Similar problems happen if the function is marked pure. I reproduced this on 11.2.0 and 12.2, but this most likely affects all gcc versions.