Hi Richard, I almost forgot that the issue is also present on GCC 14. Can I backport to releases/gcc-14 branch?
Thanks, Filip Kastl On Fri 2025-02-28 17:46:42, Richard Biener wrote: > > > > Am 28.02.2025 um 17:02 schrieb Filip Kastl <fka...@suse.cz>: > > > > Hi, > > > > bootstrapped and regtested on x86_64 linux. Ok to be pushed? > > Ok > > Richard > > > Thanks, > > Filip Kastl > > > > > > -- 8< -- > > > > > > While writing the sccopy pass I didn't realize that 'replace_uses_by ()' can > > remove portions of the CFG. This happens when replacing arguments of some > > statement results in the removal of an EH edge. Because of this sccopy can > > then work with GIMPLE statements that aren't part of the IR anymore. In > > PR117919 this triggered an assertion within the pass which assumes that > > statements the pass works with are reachable. > > > > This patch tells the pass to notice when a statement isn't in the IR anymore > > and remove it from it's worklist. > > > > PR tree-optimization/117919 > > > > gcc/ChangeLog: > > > > * gimple-ssa-sccopy.cc (scc_copy_prop::propagate): Prune > > statements that 'replace_uses_by ()' removed. > > > > gcc/testsuite/ChangeLog: > > > > * g++.dg/pr117919.C: New test. > > > > Signed-off-by: Filip Kastl <fka...@suse.cz> > > --- > > gcc/gimple-ssa-sccopy.cc | 13 +++++++++ > > gcc/testsuite/g++.dg/pr117919.C | 52 +++++++++++++++++++++++++++++++++ > > 2 files changed, 65 insertions(+) > > create mode 100644 gcc/testsuite/g++.dg/pr117919.C > > > > diff --git a/gcc/gimple-ssa-sccopy.cc b/gcc/gimple-ssa-sccopy.cc > > index 9f25fbaff36..7ffb5718ab6 100644 > > --- a/gcc/gimple-ssa-sccopy.cc > > +++ b/gcc/gimple-ssa-sccopy.cc > > @@ -568,6 +568,19 @@ scc_copy_prop::propagate () > > { > > vec<gimple *> scc = worklist.pop (); > > > > + /* When we do 'replace_scc_by_value' it may happen that some EH edges > > + get removed. That means parts of CFG get removed. Those may > > + contain copy statements. For that reason we prune SCCs here. */ > > + unsigned i; > > + for (i = 0; i < scc.length (); i++) > > + if (gimple_bb (scc[i]) == NULL) > > + scc.unordered_remove (i); > > + if (scc.is_empty ()) > > + { > > + scc.release (); > > + continue; > > + } > > + > > auto_vec<gimple *> inner; > > hash_set<tree> outer_ops; > > tree last_outer_op = NULL_TREE; > > diff --git a/gcc/testsuite/g++.dg/pr117919.C > > b/gcc/testsuite/g++.dg/pr117919.C > > new file mode 100644 > > index 00000000000..fa2d9c9cd1e > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/pr117919.C > > @@ -0,0 +1,52 @@ > > +/* PR tree-optimization/117919 */ > > +/* { dg-do compile } */ > > +/* { dg-options "-O1 -fno-tree-forwprop -fnon-call-exceptions > > --param=early-inlining-insns=192 -std=c++20" } */ > > + > > +char _M_p, _M_construct___beg; > > +struct _Alloc_hider { > > + _Alloc_hider(char); > > +}; > > +long _M_string_length; > > +void _M_destroy(); > > +void _S_copy_chars(char *, char *, char *) noexcept; > > +char _M_local_data(); > > +struct Trans_NS___cxx11_basic_string { > > + _Alloc_hider _M_dataplus; > > + bool _M_is_local() { > > + if (_M_local_data()) > > + if (_M_string_length) > > + return true; > > + return false; > > + } > > + void _M_dispose() { > > + if (!_M_is_local()) > > + _M_destroy(); > > + } > > + char *_M_construct___end; > > + Trans_NS___cxx11_basic_string(Trans_NS___cxx11_basic_string &) > > + : _M_dataplus(0) { > > + struct _Guard { > > + ~_Guard() { _M_guarded->_M_dispose(); } > > + Trans_NS___cxx11_basic_string *_M_guarded; > > + } __guard0; > > + _S_copy_chars(&_M_p, &_M_construct___beg, _M_construct___end); > > + } > > +}; > > +namespace filesystem { > > +struct path { > > + path(); > > + Trans_NS___cxx11_basic_string _M_pathname; > > +}; > > +} // namespace filesystem > > +struct FileWriter { > > + filesystem::path path; > > + FileWriter() : path(path) {} > > +}; > > +struct LanguageFileWriter : FileWriter { > > + LanguageFileWriter(filesystem::path) {} > > +}; > > +int > > +main() { > > + filesystem::path output_file; > > + LanguageFileWriter writer(output_file); > > +} > > -- > > 2.47.1 > >