> If the branch edge destination is a basic block with only a direct
> sibcall, change the jcc target to the sibcall target, decrement the
> destination basic block entry label use count and redirect the edge
> to the exit basic block.  Call delete_unreachable_blocks to delete
> the unreachable basic blocks at the end if edges are redirected.

Its hard to believe this needs a new pass. Could the existing middle end
tail call code handle it somehow?

Each new pass makes the compiler a little slower.

> +  FOR_EACH_BB_FN (bb, cfun)
> +    {
> +      FOR_BB_INSNS (bb, insn)
> +     {
> +       if (!JUMP_P (insn))
> +         continue;

Instead of searching all basic blocks this could search from the end
simllar to tree tailcall

> +  /* opt_pass methods: */
> +  bool gate (function *) final override
> +    {
> +      return optimize;

Thia needs to depend on the existing tail call options. I would also
add a new option because it is highly likely to break some unwinders
and static asm analysis tools like Linux objtool. Does the gcc unwinding
or gdb calltrace still work?

Andi

Reply via email to