https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118612
Bug ID: 118612 Summary: return value loaded despite noreturn attribute Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: drepper.fsp+rhbz at gmail dot com Target Milestone: --- The following code is, as can be seen, stand-alone with the definition of error from glibc inlined. The generated code for -O2 (gcc 15, 14, haven't tested others): 0000000000000000 <f>: 0: 85 ff test %edi,%edi 2: 75 03 jne 7 <f+0x7> 4: 31 c0 xor %eax,%eax 6: c3 ret 7: ba 00 00 00 00 mov $0x0,%edx c: 50 push %rax d: 31 f6 xor %esi,%esi f: bf 01 00 00 00 mov $0x1,%edi 14: 31 c0 xor %eax,%eax 16: e8 00 00 00 00 call 1b <f+0x1b> The problem is at address 0x14. This is the return value of 'f' but, as the compiler correctly determines, 'error' will not return and therefore this load is unnecessary. extern void __error_alias(int __status, int __errnum, const char *__format, ...) __asm__("error") __attribute__ ((__format__ (__printf__, 3, 4))); extern void __error_noreturn(int __status, int __errnum, const char *__format, ...) __asm__("error") __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))); extern inline __attribute__ ((__gnu_inline__)) void error (int __status, int __errnum, const char *__format, ...) { if (__builtin_constant_p (__status) && __status != 0) __error_noreturn (__status, __errnum, __format, __builtin_va_arg_pack ()); else __error_alias (__status, __errnum, __format, __builtin_va_arg_pack ()); } int f(int a) { if (a) error(1, 0, "string"); return 0; }