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.

> > > +  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



-- 
H.J.

Reply via email to