[Bug rtl-optimization/93605] New: GCC suboptimal tail call optimization in trivial function forwarding with __attribute__((noinline))
mike.k at digitalcarbide dot com
gcc-bugzilla@gcc.gnu.org
Wed Feb 5 21:08:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93605
Bug ID: 93605
Summary: GCC suboptimal tail call optimization in trivial
function forwarding with __attribute__((noinline))
Product: gcc
Version: 9.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: mike.k at digitalcarbide dot com
Target Milestone: ---
In a trivial function-forwarder where `__attribute__((noinline))` is specified
on the forwardee, an extra `movzx` instruction is generated (on x86-64) prior
to the tail call. This does not occur on Clang.
Observe (https://godbolt.org/z/kFGCpW):
```
namespace impl {
__attribute__((noinline))
static int func (bool v, int a, int b) {
return v ? a/b : b/a;
}
}
int func(bool v, int a, int b) {
return impl::func(v, a, b);
}
```
On all tested versions (trunk (10) to GCC 4), this produces the following
assembly for `func`:
```
func(bool, int, int):
movzx edi, dil
jmp impl::func(bool, int, int)
```
On Clang trunk (10) until Clang 5.0.0, this produces the following assembly for
`func`:
```
func(bool, int, int): # @func(bool, int, int)
jmp impl::func(bool, int, int) # TAILCALL
```
Clang 5.0.0 and below produce identical assembly to GCC:
```
func(bool, int, int): # @func(bool, int, int)
movzx edi, dil
jmp impl::func(bool, int, int) # TAILCALL
```
More information about the Gcc-bugs
mailing list