On Mon, 19 Feb 2024, Richard Sandiford wrote:

> Richard Biener <rguent...@suse.de> writes:
> >> I suppose that's better than the first version when a block has a
> >> large number of dominance frontiers.  But I can't remember whether
> >> that was the case in PR98863.  I have a feeling that I tried the above
> >> as part of the PR, since it's the obvious way of applying liveness
> >> once per block rather than once per edge.  But I think it was more
> >> just sheer weight of numbers.
> >
> > Note at least this (see below for the actual patch for trunk) is
> > in the linear part, so it shouldn't trigger any quadraticness.
> > It speeds up the testcase the same as the original one.
> 
> But some of the "quadracticness" is from O(nblocks*nregisters) or
> O(nedges*nregisters), rather than through iteration.

Yeah, that's of course what DF_LR already is subject to, though,
so we hardly make that worse here.

> >> I wonder whether we could create a new DEF bitmap on-the-fly while
> >> creating the defs and uses, restricting it to potential PHI registers.
> >> The test for potential PHI registers is constant time, and we could
> >> build the bitmaps as tree views before converting to list views.
> >> Can give it a go if that sounds OK.
> >
> > Do that within DF itself?  Not sure about that.
> 
> No, in rtl-ssa.  It would be convenient to have a version of
> bitmap_ior_and_into in which the final bitmap is an sbitmap though.
> 
> I.e., schematically:
> 
>       EXECUTE_IF_SET_IN_BITMAP (&frontiers[b1], 0, b2, bmi)
>       if (bitmap_ior_and_into (&unfiltered[b2], b1_def,
>                                bi.potential_phi_regs)
>           && !bitmap_empty_p (&frontiers[b2]))
>         // Propagate the (potential) new phi node definitions in B2.
>         bitmap_set_bit (worklist, b2);
> 
> with a new overload to make that possible.
> 
> > Anyway, I think the below is small enough that it would also qualify
> > for backporting.  Unless there's a problem with it, of course.
> >
> > Bootstrapped and tested on x86_64-unknown-linux-gnu.
> >
> > OK?
> 
> I still think this is likely to reintroduce the problem in PR98863.
> I won't object further though, so yeah, please go ahead.

The core issue there was memory-usage, that's unlikely going to be
worse with this patch.

I've pushed it to trunk and will keep an eye on our testers that
cover WRF.

Thanks,
Richard.

> Richard
> 
> > Thanks,
> > Richard.
> >
> > From d6f57f72fbbdb832b33e4ba5ccbf60a8d90ea264 Mon Sep 17 00:00:00 2001
> > From: Richard Biener <rguent...@suse.de>
> > Date: Mon, 19 Feb 2024 11:10:50 +0100
> > Subject: [PATCH] rtl-optimization/54052 - RTL SSA PHI insertion compile-time
> >  hog
> > To: gcc-patches@gcc.gnu.org
> >
> > The following tries to address the PHI insertion compile-time hog in
> > RTL fwprop observed with the PR54052 testcase where the loop computing
> > the "unfiltered" set of variables possibly needing PHI nodes for each
> > block exhibits quadratic compile-time and memory-use.
> >
> > It does so by pruning the local DEFs with LR_OUT of the block, removing
> > regs that can never be LR_IN (defined by this block) in the dominance
> > frontier.
> >
> >     PR rtl-optimization/54052
> >     * rtl-ssa/blocks.cc (function_info::place_phis): Filter
> >     local defs by LR_OUT.
> > ---
> >  gcc/rtl-ssa/blocks.cc | 7 ++++++-
> >  1 file changed, 6 insertions(+), 1 deletion(-)
> >
> > diff --git a/gcc/rtl-ssa/blocks.cc b/gcc/rtl-ssa/blocks.cc
> > index 8996443e8d5..cf4224e61ec 100644
> > --- a/gcc/rtl-ssa/blocks.cc
> > +++ b/gcc/rtl-ssa/blocks.cc
> > @@ -645,7 +645,12 @@ function_info::place_phis (build_info &bi)
> >        if (bitmap_empty_p (&frontiers[b1]))
> >     continue;
> >  
> > -      bitmap b1_def = &DF_LR_BB_INFO (BASIC_BLOCK_FOR_FN (m_fn, b1))->def;
> > +      // Defs in B1 that are possibly in LR_IN in the dominance frontier
> > +      // blocks.
> > +      auto_bitmap b1_def;
> > +      bitmap_and (b1_def, &DF_LR_BB_INFO (BASIC_BLOCK_FOR_FN (m_fn, 
> > b1))->def,
> > +             DF_LR_OUT (BASIC_BLOCK_FOR_FN (m_fn, b1)));
> > +
> >        bitmap_iterator bmi;
> >        unsigned int b2;
> >        EXECUTE_IF_SET_IN_BITMAP (&frontiers[b1], 0, b2, bmi)
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to