On 7/29/19 11:59 AM, Richard Biener wrote: > On Sun, Jul 28, 2019 at 4:57 PM Martin Liška <mli...@suse.cz> wrote: >> >> Hi. >> >> And there's one more patch that deals with delete operator >> which has a second argument (size). That definition GIMPLE >> statement of the size must be also properly marked. >> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed? > > This isn't a proper fix. You can't mark a random operand as necessary > during elimination - this only works in very constraint cases. Here > it will break down if the stmt you just marked depends on another stmt > only used by the stmt you just marked (and thus also not necessary).
Ah, I see. > > The fix is to propagate_necessity where you either have to excempt > the two-operator delete from handling We want to process also these delete operators. > or to mark its second operand > as necessary despite eventually deleting the call. Really marking that as necessary? Why? > You can avoid > this in case the allocation function used the exact same size argument. That's not the case as the operator new happens in a loop: <bb 5> : # iftmp.0_15 = PHI <iftmp.0_21(3), iftmp.0_20(4)> _23 = operator new [] (iftmp.0_15); _24 = _23; MEM[(sizetype *)_24] = _19; _26 = _24 + 8; _27 = _26; _2 = _19 + 18446744073709551615; _28 = (long int) _2; <bb 6> : # _12 = PHI <_27(5), _29(7)> # _13 = PHI <_28(5), _30(7)> if (_13 < 0) goto <bb 8>; [INV] else goto <bb 7>; [INV] Btw. is the hunk moved to propagate_necessity still wrong: diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index cf507fa0453..1c890889932 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -803,7 +803,23 @@ propagate_necessity (bool aggressive) || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC)) || DECL_IS_REPLACEABLE_OPERATOR_NEW_P (def_callee))) - continue; + { + /* Some delete operators have 2 arguments, where + the second argument is size of the deallocated memory. */ + if (gimple_call_num_args (stmt) == 2) + { + tree ptr = gimple_call_arg (stmt, 1); + if (TREE_CODE (ptr) == SSA_NAME) + { + gimple *def_stmt = SSA_NAME_DEF_STMT (ptr); + if (!gimple_nop_p (def_stmt) + && !gimple_plf (def_stmt, STMT_NECESSARY)) + gimple_set_plf (stmt, STMT_NECESSARY, false); + } + } + + continue; + } } FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) Thanks, Martin > > Richard. > >> Thanks, >> Martin