[Bug middle-end/56727] Recursive call goes through the PLT unnecessarily

hubicka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Feb 9 15:56:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56727

--- Comment #14 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
For the draft patch you need to check for aliases.  If global symbol is indeed
the only way to reach the function, then the transformation is IMO valid.

As for tailcall, we have recursive_call_p predicate that uses
symtab_node::semantically_equivalent_p which returns true, because it is called
for t and t. It is valid for testcase as written, because we know there is no
alias.

However

void f(int b)
{
    f(0);
}

void g(int b) __attribute__((alias(("f"))));

is indeed misopitmized and the bug is that recursive_call_p needs to check all
aliases of the function being semantically equivalent to function itself.  I
will fix that.

For the optimization redirecting to noninterposable aliases, I would be fine
with the patch if it was extended by the check verifying that there is at most
one externally visible symbol aliasing the definition or that they are all
non-interposable.

Honza


More information about the Gcc-bugs mailing list