On Thu, 17 Feb 2022, Richard Biener wrote:

> On Tue, 15 Feb 2022, Jan Hubicka wrote:
> 
> > > @@ -1272,7 +1275,7 @@ maybe_optimize_arith_overflow (gimple_stmt_iterator 
> > > *gsi,
> > >     contributes nothing to the program, and can be deleted.  */
> > >  
> > >  static bool
> > > -eliminate_unnecessary_stmts (void)
> > > +eliminate_unnecessary_stmts (bool aggressive)
> > >  {
> > >    bool something_changed = false;
> > >    basic_block bb;
> > > @@ -1366,7 +1369,9 @@ eliminate_unnecessary_stmts (void)
> > >                     break;
> > >                   }
> > >               }
> > > -           if (!dead)
> > > +           if (!dead
> > > +               && (!aggressive
> > > +                   || bitmap_bit_p (visited_control_parents, bb->index)))
> > 
> > It seems to me that it may be worth to consider case where
> > visited_control_parents is 0 while all basic blocks in the CD relation
> > are live for different reasons.  I suppose this can happen in more
> > complex CFGs when the other arms of conditionals are live...
> 
> It's a bit difficult to do in this place though since we might already
> have altered those blocks (and we need to check not for the block being
> live but for its control stmt).  I suppose we could use the
> last_stmt_necessary bitmap.  I'll do some statistics to see whether
> this helps.

So it does help.  The visited_control_parents catches
44010 from 44033 candidates and the remaining 23 are catched by doing

                      EXECUTE_IF_SET_IN_BITMAP (cd->get_edges_dependent_on 
(bb->index),
                                                0, edge_number, bi)
                        {
                          basic_block cd_bb = cd->get_edge_src 
(edge_number);
                          if (cd_bb != bb
                              && !bitmap_bit_p (last_stmt_necessary, 
cd_bb->index))
                            {
                              dead = true;
                              break;
                            }
                        }

in addition to that simple check.  That means for all files in gcc/
the patch would be a no-op but it still fixes the problematical case.

I'll put an adjusted patch to testing.

Richard.

Reply via email to