On Mon, 3 Mar 2025, Filip Kastl wrote:

> Hi Richard,
> 
> I almost forgot that the issue is also present on GCC 14.  Can I backport to
> releases/gcc-14 branch?

Sure.

> 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
> > > 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to