On Wed, Aug 20, 2025 at 2:16 PM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> Richard Biener <richard.guent...@gmail.com> writes:
> > On Wed, Aug 20, 2025 at 1:03 PM Richard Sandiford
> > <richard.sandif...@arm.com> wrote:
> >>
> >> While testing a later patch, I found that create_degenerate_phi
> >> had an inverted test for bitmap_set_bit.  It was assuming that
> >> the return value was the previous bit value, rather than a
> >> "something changed" value. :(
> >>
> >> Also, the call to add_live_out_use shouldn't be conditional
> >> on the DF_LR_OUT operation, since the register could be live-out
> >> because of uses later in the same EBB (which do not require a
> >> live-out use to be added to the rtl-ssa instruction).  Instead,
> >> add_live_out should itself check whether a live-out use already exists.
> >>
> >> Tested on aarch64-linux-gnu, powerpc64le-linux-gnu and
> >> x86_64-linux-gnu.  OK to install?
> >
> > OK.  Is the inverted test worth backporting?
>
> I was wondering that as well.  I'm a bit nervous about backporting
> just the removal of !, since without the other part of the fix,
> it could just be substituting one problem for another.  But the
> combination of this patch and the find_use patch might be worth
> backporting if there is no fallout.
>
> So how about backporting both patches to GCC 14 and GCC 15 if there
> is no fallout in the next couple of weeks?

That works for me (even just GCC 15).

>  I'm reluctant to change
> GCC 13 without a motivating testcase.

Yeah.

Richard.

> Thanks,
> Richard
>
> >
> >> Richard
> >>
> >>
> >> gcc/
> >>         * rtl-ssa/blocks.cc (function_info::create_degenerate_phi): Fix
> >>         inverted test of bitmap_set_bit.  Call add_live_out_use even
> >>         if the register was previously live-out from the predecessor block.
> >>         Instead...
> >>         (function_info::add_live_out_use): ...check here whether a live-out
> >>         use already exists.
> >> ---
> >>  gcc/rtl-ssa/blocks.cc | 11 +++++------
> >>  1 file changed, 5 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/gcc/rtl-ssa/blocks.cc b/gcc/rtl-ssa/blocks.cc
> >> index 953fd9e516e..a57b9e15f13 100644
> >> --- a/gcc/rtl-ssa/blocks.cc
> >> +++ b/gcc/rtl-ssa/blocks.cc
> >> @@ -315,15 +315,14 @@ function_info::add_live_out_use (bb_info *bb, 
> >> set_info *def)
> >>
> >>    // If the end of the block already has an artificial use, that use
> >>    // acts to make DEF live at the appropriate point.
> >> -  use_info *use = def->last_nondebug_insn_use ();
> >> -  if (use && use->insn () == bb->end_insn ())
> >> +  if (find_use (def, bb->end_insn ()).matching_use ())
> >>      return;
> >>
> >>    // Currently there is no need to maintain a backward link from the end
> >>    // instruction to the list of live-out uses.  Such a list would be
> >>    // expensive to update if it was represented using the usual insn_info
> >>    // access arrays.
> >> -  use = allocate<use_info> (bb->end_insn (), def->resource (), def);
> >> +  auto *use = allocate<use_info> (bb->end_insn (), def->resource (), def);
> >>    use->set_is_live_out_use (true);
> >>    add_use (use);
> >>  }
> >> @@ -540,12 +539,12 @@ function_info::create_degenerate_phi (ebb_info *ebb, 
> >> set_info *def)
> >>        basic_block pred_cfg_bb = single_pred (ebb->first_bb ()->cfg_bb ());
> >>        bb_info *pred_bb = this->bb (pred_cfg_bb);
> >>
> >> -      if (!bitmap_set_bit (DF_LR_IN (ebb->first_bb ()->cfg_bb ()), regno))
> >> +      if (bitmap_set_bit (DF_LR_IN (ebb->first_bb ()->cfg_bb ()), regno))
> >>         {
> >>           // The register was not previously live on entry to EBB and
> >>           // might not have been live on exit from PRED_BB either.
> >> -         if (bitmap_set_bit (DF_LR_OUT (pred_cfg_bb), regno))
> >> -           add_live_out_use (pred_bb, def);
> >> +         bitmap_set_bit (DF_LR_OUT (pred_cfg_bb), regno);
> >> +         add_live_out_use (pred_bb, def);
> >>         }
> >>        else
> >>         {
> >> --
> >> 2.43.0
> >>

Reply via email to