On 2025-05-06 09:48, H.J. Lu wrote:
On Mon, May 5, 2025 at 9:56 PM Andi Kleen <a...@firstfloor.org> wrote:
On Mon, May 05, 2025 at 06:20:40AM -0700, Andi Kleen wrote:
> > 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?
On further thought it absolutely needs to be in calls.c, otherwise it
cannot work with musttail. Currently musttail would error out before
this pass runs.
Do you have a testcase? Since this pass is run just before
pass_convert_to_eh_region_ranges, I think it should work with
musttail.
I can't try it right now, but since the RTL musttail checks are in RTL
expand it is clear any RTL pass is too late. Put it into a target hook
and call it from calls.cc when it expands sibcalls. At that point the
sibcall discovery is already done so it will need less code too
Andi
> > + 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?
It should be invisible to unwinders so that part is probably ok.
Andi