https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96565
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> --- OK, well - but the fix exposes (IIRC I ran into this at some time in the past already) that GIMPLE_RESX does not have virtual operands but it needs to represent a use of global memory at least in the case it exits the current function. So with the fix which is simply diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c index cc93f559286..6b2f64c0250 100644 --- a/gcc/tree-ssa-dse.c +++ b/gcc/tree-ssa-dse.c @@ -888,11 +888,16 @@ dse_classify_store (ao_ref *ref, gimple *stmt, gimple *def = defs[i]; gimple *use_stmt; use_operand_p use_p; + /* If the path ends here we do not need to process it further. + This for example happens with calls to noreturn functions. */ + if (gimple_code (def) != GIMPLE_PHI + && has_zero_uses (gimple_vdef (def))) + defs.unordered_remove (i); /* If the path to check starts with a kill we do not need to process it further. ??? With byte tracking we need only kill the bytes currently live. */ - if (stmt_kills_ref_p (def, ref)) + else if (stmt_kills_ref_p (def, ref)) { if (by_clobber_p && !gimple_clobber_p (def)) *by_clobber_p = false; I see FAIL: g++.dg/eh/spec7.C -std=gnu++98 execution test FAIL: g++.dg/eh/spec7.C -std=gnu++14 execution test FAIL: g++.dg/eh/spec7.C -std=gnu++17 execution test FAIL: g++.dg/eh/spec7.C -std=gnu++2a execution test FAIL: gcc.target/i386/cleanup-1.c execution test FAIL: gcc.target/i386/cleanup-2.c execution test also (a testsuite issue) FAIL: gcc.dg/builtin-object-size-4.c execution test the RESX issue is possibly latent even without the above patch.