https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118614
Bug ID: 118614
Summary: [riscv] Naked function attribute on riscv optimizes
away C conditional
Product: gcc
Version: 14.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: charlie at rivosinc dot com
Target Milestone: ---
riscv GCC assumes that the when the s0 register is used as a function pointer
it will always be non-zero. This causes the body of an if statement that is
predicated on this s0 variable to always execute.
I understand that the wording in the docs for naked functions say:
"While using extended asm or a mixture of basic asm and C code may appear to
work, they cannot be depended upon to work reliably and are not supported."
However, since this issue appears to be constrained to the sp and s0 registers,
I was wondering what was going on here.
Here is the code:
void __attribute__((__naked__)) ret_from_fork()
{
register int (*fn)(void *) asm("s0");
register void *fn_arg asm("s1");
if (fn)
fn(fn_arg);
}
outputs:
ret_from_fork:
mv a0,s1
jalr s0
A godbolt link containing this: https://godbolt.org/z/h3cv6e18K.