On Thu, Aug 28, 2025 at 1:32 AM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Fri, Aug 22, 2025 at 4:04 PM Andrew Pinski
> <andrew.pin...@oss.qualcomm.com> wrote:
> >
> > So the current pass order is:
> > ```
> >           NEXT_PASS (pass_tail_recursion);
> >           NEXT_PASS (pass_if_to_switch);
> >           NEXT_PASS (pass_convert_switch);
> >           NEXT_PASS (pass_cleanup_eh);
> > ```
> > But nothing in if_to_switch nor convert_switch will change the IR
> > such that cleanup eh will take into account.
> > tail_recusion benifits the most by not having "almost" empty landing pads.
> > This order was originally done when cleanup_eh was added in 
> > r0-92178-ga8da523f8a442f
> > but it looks like it was just done just before inlining rather than 
> > thinking it
> > could improve passes before hand.
> >
> > An example where this helps is PR 115201 where we have:
> > ```
> > ;;   basic block 5, loop depth 0, maybe hot
> > ;;    prev block 4, next block 6, flags: (NEW, REACHABLE, VISITED)
> > ;;    pred:       4 (TRUE_VALUE,EXECUTABLE)
> >   [LP 1] # .MEM_19 = VDEF <.MEM_45>
> >   # USE = nonlocal escaped
> >   # CLB = nonlocal escaped
> >   D.4770 = _Z12binarySearchIi2itIiEET0_RKT_S2_S2_D.4690 (item_15(D), 
> > startD.4711, midD.4717);
> >   goto <bb 7>; [INV]
> > ;;    succ:       8 (EH,EXECUTABLE)
> > ;;                7 (FALLTHRU,EXECUTABLE)
> > ...
> >
> > ;;   basic block 8, loop depth 0, maybe hot
> > ;;    prev block 7, next block 1, flags: (NEW, REACHABLE, VISITED)
> > ;;    pred:       5 (EH,EXECUTABLE)
> > ;;                6 (EH,EXECUTABLE)
> >   # .MEM_7 = PHI <.MEM_19(5), .MEM_18(6)>
> > <L6>: [LP 1]
> >   # .MEM_20 = VDEF <.MEM_7>
> >   midD.4717 ={v} {CLOBBER(eos)};
> >   resx 1
> > ;;    succ:
> > ```
> >
> > As you can see the empty landing pad should be able to remove away and
> > then a tail recursion can happen.
> >
> > Bootstrapped and tested x86_64-linux-gnu.
> >
> >         PR tree-optimization/115201
> > gcc/ChangeLog:
> >
> >         * passes.def: Move cleanup_eh before first tail_recursion.
> >
> > Signed-off-by: Andrew Pinski <andrew.pin...@oss.qualcomm.com>
> > ---
> >  gcc/passes.def | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/gcc/passes.def b/gcc/passes.def
> > index 68ce53baa0f..6349abb5360 100644
> > --- a/gcc/passes.def
> > +++ b/gcc/passes.def
> > @@ -97,10 +97,10 @@ along with GCC; see the file COPYING3.  If not see
> >            NEXT_PASS (pass_dse);
> >           NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */, true 
> > /* remove_unused_locals */);
> >           NEXT_PASS (pass_phiopt, true /* early_p */);
> > +         NEXT_PASS (pass_cleanup_eh);
>
> Can you add a comment here indicating why we do this specifically before
> tail recursion?

I added this comment:
          /* Cleanup eh is done before tail recusision to remove empty
(only clobbers)
             finally blocks which would block tail recursion.  */

Thanks,
Andrew

>
> OK with that change.
> Richard.
>
> >           NEXT_PASS (pass_tail_recursion);
> >           NEXT_PASS (pass_if_to_switch);
> >           NEXT_PASS (pass_convert_switch);
> > -         NEXT_PASS (pass_cleanup_eh);
> >           NEXT_PASS (pass_sccopy);
> >           NEXT_PASS (pass_profile);
> >           NEXT_PASS (pass_local_pure_const);
> > --
> > 2.43.0
> >

Reply via email to