When optimize_memcpy was added in r7-5443-g7b45d0dfeb5f85, a path was added such that a statement was turned into a non-throwing statement and maybe_clean_or_replace_eh_stmt/gimple_purge_dead_eh_edges would not be called for that statement. This adds these calls to that path.
Bootstrapped and tested on x86_64-linux-gnu with no regressions. Ok? For the trunk, 14, 13 and 12 branches? PR tree-optimization/116601 gcc/ChangeLog: * tree-ssa-ccp.cc (pass_fold_builtins::execute): Cleanup eh after optimize_memcpy on a mem statement. gcc/testsuite/ChangeLog: * g++.dg/torture/except-2.C: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- gcc/testsuite/g++.dg/torture/except-2.C | 18 ++++++++++++++++++ gcc/tree-ssa-ccp.cc | 11 +++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/except-2.C diff --git a/gcc/testsuite/g++.dg/torture/except-2.C b/gcc/testsuite/g++.dg/torture/except-2.C new file mode 100644 index 00000000000..d896937a118 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/except-2.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-additional-options "-fexceptions -fnon-call-exceptions" } +// PR tree-optimization/116601 + +struct RefitOption { + char subtype; + int string; +} n; +void h(RefitOption); +void k(RefitOption *__val) +{ + try { + *__val = RefitOption{}; + RefitOption __trans_tmp_2 = *__val; + h(__trans_tmp_2); + } + catch(...){} +} diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc index 44711018e0e..3cd385f476b 100644 --- a/gcc/tree-ssa-ccp.cc +++ b/gcc/tree-ssa-ccp.cc @@ -4325,8 +4325,15 @@ pass_fold_builtins::execute (function *fun) if (gimple_code (stmt) != GIMPLE_CALL) { if (gimple_assign_load_p (stmt) && gimple_store_p (stmt)) - optimize_memcpy (&i, gimple_assign_lhs (stmt), - gimple_assign_rhs1 (stmt), NULL_TREE); + { + optimize_memcpy (&i, gimple_assign_lhs (stmt), + gimple_assign_rhs1 (stmt), NULL_TREE); + old_stmt = stmt; + stmt = gsi_stmt (i); + if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt) + && gimple_purge_dead_eh_edges (bb)) + cfg_changed = true; + } gsi_next (&i); continue; } -- 2.43.0