https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118430
Bug ID: 118430
Summary: musttail false positive on how locals are used
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: kenjin4096 at gmail dot com
Target Milestone: ---
Dear GCC maintainers,
The following code gives a compilation error, when compiling with GCC 15.0
(experimental) commit c1729df6ec1eff4815a9cdd71392691ce21da028, on Ubuntu 22.04
AMD64. In Clang 19.1.0, this compiles successfully, producing working code:
test.c
```
#include "stdio.h"
__attribute__((noinline))
int tail_call2(int opcode) {
printf("%d\n", opcode);
return 1;
}
__attribute__((noinline))
int non_tail_call(int *ptr) {
printf("%d\n", *ptr);
return 2;
}
int tail_call1(int opcode) {
int val;
printf("%d\n", opcode);
non_tail_call(&val); // Trigger the bug by passing in a local.
[[gnu::musttail]]
return tail_call2(opcode);
}
int main(int argc, char **argv) {
tail_call1(argc);
}
```
Compilation error depends on options passed.
gcc test.c gives:
test.c: In function ‘tail_call1’:
test.c:19:12: error: cannot tail-call: call invocation refers to locals
19 | return tail_call2(opcode);
| ^~~~~~~~~~~~~~~~~~
gcc -O1 test.c passes
gcc -O2/3 test.c gives:
test.c: In function ‘tail_call1’:
test.c:19:12: error: cannot tail-call: call uses return slot
19 | return tail_call2(opcode);
| ^~~~~~~~~~~~~~~~~~
Output in first case and third case don't seem correct. In the first error, the
tail call itself is not referring to a local, only a previous non-function tail
call is. In the 3rd case, I don't see how it's using a return slot: the return
value is not being assigned. I might be mistaken on what a "return slot" is in
this case as I'm not a GCC expert though.
My background use case is implementing an optimization for CPython's
interpreter. I have a PR that implements a nontrivial amount of code using
musttail. The following PR works fully on clang-19, but fails to compile on GCC
after applying patches to make it detect GCC:
https://github.com/python/cpython/pull/128718
Thank you for your time and help.
Possibly related: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115979
Regards,
Ken Jin