https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95781
Bug ID: 95781
Summary: Missing dead code elimination when a recursive
function is inlined.
Product: gcc
Version: 10.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: yyc1992 at gmail dot com
Target Milestone: ---
Code,
```
static int ffff2(int *p, int k)
{
int res = 0;
if (k > 0)
res += ffff2(p, k - 1);
return *p + res;
}
int g2(int *p)
{
return ffff2(p, 3);
}
```
Compiling with -O3 the code produced for `g2` is
```
g2:
movl (%rdi), %eax
sall $2, %eax
ret
```
i.e. `*p * 4` that doesn't need to call `ffff2`. However, the code for `ffff2`
is still generated even though it is never used.
It seems that this only happens when the recursive function is sufficiently
complex. Replacing `*p` with a constant or making the `k > 0` branch returning
directly produces code that does not have `ffff2` in it. Seems that there's
some smart late optimization pass that doesn't have a global DCE pass
afterwards?
Looks similar to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80680 but I'm not
sure if they have the same root cause.