On Mon, 30 Mar 2020, Jakub Jelinek wrote:

> On Mon, Mar 30, 2020 at 12:44:40PM +0200, Richard Biener wrote:
> > >    type = TREE_TYPE (stmt_expr);
> > > +  /* For statement-expressions, force the STATEMENT_LIST
> > > +     to be preserved with side-effects, even if it contains
> > > +     just one statement or no statements.  See PR93786.  */
> > > +  TREE_SIDE_EFFECTS (stmt_expr) = 0;
> > >    result = pop_stmt_list (stmt_expr);
> > > +  gcc_assert (result == stmt_expr);
> > > +  TREE_SIDE_EFFECTS (result) = 1;
> > 
> > The original code had !TREE_SIDE_EFFECT stmt lists (empty ones?) returned
> > directly which you above change to have side-effects - are you sure
> > the fallout is not due to that?  Did you look into any of the fallout?
> 
> Some of the fallout has been from missed optimizations e.g. in initializers,
> where the TREE_SIDE_EFFECTs (sometimes for empty statement exprs like
> ({ ; ; ; }), at other times for one with a single real statement in there
> which didn't have side-effects) is with the patch now set when it wasn't
> before, but there were ICEs too.

I see.  I was thinking of

  if (TREE_SIDE_EFFECTS (stmt_expr))
    {
      TREE_SIDE_EFFECTS (stmt_expr) = 0;
      result = pop_stmt_list (stmt_expr);
      gcc_assert (result == stmt_expr);
      TREE_SIDE_EFFECTS (result) = 1;
    }
  else
    result = pop_stmt_list (stmt_expr);

which should make ({ ; ; ; }) work again, but obviously not the
single-stmt case.

> I guess another option is what Alex wrote, just throw the DEBUG_BEGIN_STMTs
> away if there would be just those or those plus a single other statement,
> perhaps limited to statement expressions (i.e. do it in the above spot).

Sure, that's another option - but of course only short-term since we
then end up with "bad" debug info.

Btw, does the above fallout already happen if you add -g?  Because
all the affected stmt-lists should end up with some DEBUG_BEGIN_STMTs
in them and thus preserved?

Richard.

Reply via email to