https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93786
--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 18 Feb 2020, jakub at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93786 > > --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > (In reply to Richard Biener from comment #2) > > Hmm, but this destructive modification of something we don't unshare doesn't > > work. Either we have to always wrap statement lists but then we're back to > > the compare-debug issue or we somehow fix the destructiveness on the > > stmt list node itself - like not setting it's type to void or marking it > > as having side-effects (why do we do this anyways, in voidify_wrapper_expr? > > is that for debugging?), we'd also need to leave the final value in the > > stmt list for a possible second gimplification round... > > > > Maybe the best thing is to kill off the debug stmts when they would cause > > a stmt list to appear and revert the previous fix. > > We might kill them only in one of the two places (say keep in the argument and > remove from the OBJ_TYPE_REF operand or vice versa), but we'd need some > function that walks the non-TREE_SIDE_EFFECTS tree and looks for such > STATEMENT_LISTs, as they might be wrapped in casts/whatever else that doesn't > have side-effects. > Another possibility would be do that in copy_if_shared_r or so (only handle > the > !TREE_SIDE_EFFECTS STATEMENT_EXPR that contain only DEBUG_STMTs + one > non-debug > one), but we wouldn't have control over which of the two or more copies gets > to > keep the STATEMENT_LIST and which don't (well, it would be whatever we > walk_tree first). Could we make those sepcifc DEBUG_STMTS appear only later (during gimplification maybe?) and represent them as expression flags in the FEs? That would avoid the stmt-list wrapping dependent on -g