public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Richard Sandiford <richard.sandiford@arm.com>,
	GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] rtl-ssa: Fix -fcompare-debug failure [PR100303]
Date: Thu, 29 Apr 2021 12:23:00 +0200	[thread overview]
Message-ID: <CAFiYyc0zqhUe1MmKTMfn+sj=dkj+qXmXh2_70Sunp-X41rtwWQ@mail.gmail.com> (raw)
In-Reply-To: <mptv986bbjv.fsf@arm.com>

On Wed, Apr 28, 2021 at 9:07 PM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> This patch fixes an oversight in the handling of debug instructions
> in rtl-ssa.  At the moment (and whether this is a good idea or not
> remains to be seen), we maintain a linear RPO sequence of definitions
> and non-debug uses.  If a register is defined more than once, we use
> a degenerate phi to reestablish a previous definition where necessary.
>
> However, debug instructions shouldn't of course affect codegen,
> so we can't create a new definition just for them.  In those situations
> we instead hang the debug use off the real definition (meaning that
> debug uses do not follow a linear order wrt definitions).  Again,
> it remains to be seen whether that's a good idea.
>
> The problem in the PR was that we weren't taking this into account
> when increasing (or potentially increasing) the live range of an
> existing definition.  We'd create the phi even if it would only
> be used by debug instructions.
>
> The patch goes for the simple but inelegant approach of passing
> a bool to say whether the use is a debug use or not.  I imagine
> this area will need some tweaking based on experience in future.
>
> Tested on aarch64-linux-gnu (where the test also failed).
> OK to install?

OK.

Thanks,
Richard.

> Richard
>
>
> gcc/
>         PR rtl-optimization/100303
>         * rtl-ssa/accesses.cc (function_info::make_use_available): Take a
>         boolean that indicates whether the use will only be used in
>         debug instructions.  Treat it in the same way that existing
>         cross-EBB debug references would be handled if so.
>         (function_info::make_uses_available): Likewise.
>         * rtl-ssa/functions.h (function_info::make_uses_available): Update
>         prototype accordingly.
>         (function_info::make_uses_available): Likewise.
>         * fwprop.c (try_fwprop_subst): Update call accordingly.
> ---
>  gcc/fwprop.c                            |   3 +-
>  gcc/rtl-ssa/accesses.cc                 |  15 ++--
>  gcc/rtl-ssa/functions.h                 |   7 +-
>  gcc/testsuite/g++.dg/torture/pr100303.C | 112 ++++++++++++++++++++++++
>  4 files changed, 129 insertions(+), 8 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/torture/pr100303.C
>
> diff --git a/gcc/fwprop.c b/gcc/fwprop.c
> index d7203672886..73284a7ae3e 100644
> --- a/gcc/fwprop.c
> +++ b/gcc/fwprop.c
> @@ -606,7 +606,8 @@ try_fwprop_subst (use_info *use, set_info *def,
>    if (def_insn->bb () != use_insn->bb ())
>      {
>        src_uses = crtl->ssa->make_uses_available (attempt, src_uses,
> -                                                use_insn->bb ());
> +                                                use_insn->bb (),
> +                                                use_insn->is_debug_insn ());
>        if (!src_uses.is_valid ())
>         return false;
>      }
> diff --git a/gcc/rtl-ssa/accesses.cc b/gcc/rtl-ssa/accesses.cc
> index de3a29edbeb..a55cc8817a7 100644
> --- a/gcc/rtl-ssa/accesses.cc
> +++ b/gcc/rtl-ssa/accesses.cc
> @@ -1242,7 +1242,10 @@ function_info::insert_temp_clobber (obstack_watermark &watermark,
>  }
>
>  // A subroutine of make_uses_available.  Try to make USE's definition
> -// available at the head of BB.  On success:
> +// available at the head of BB.  WILL_BE_DEBUG_USE is true if the
> +// definition will be used only in debug instructions.
> +//
> +// On success:
>  //
>  // - If the use would have the same def () as USE, return USE.
>  //
> @@ -1254,7 +1257,8 @@ function_info::insert_temp_clobber (obstack_watermark &watermark,
>  //
>  // Return null on failure.
>  use_info *
> -function_info::make_use_available (use_info *use, bb_info *bb)
> +function_info::make_use_available (use_info *use, bb_info *bb,
> +                                  bool will_be_debug_use)
>  {
>    set_info *def = use->def ();
>    if (!def)
> @@ -1270,7 +1274,7 @@ function_info::make_use_available (use_info *use, bb_info *bb)
>        && single_pred (cfg_bb) == use_bb->cfg_bb ()
>        && remains_available_on_exit (def, use_bb))
>      {
> -      if (def->ebb () == bb->ebb ())
> +      if (def->ebb () == bb->ebb () || will_be_debug_use)
>         return use;
>
>        resource_info resource = use->resource ();
> @@ -1314,7 +1318,8 @@ function_info::make_use_available (use_info *use, bb_info *bb)
>  // See the comment above the declaration.
>  use_array
>  function_info::make_uses_available (obstack_watermark &watermark,
> -                                   use_array uses, bb_info *bb)
> +                                   use_array uses, bb_info *bb,
> +                                   bool will_be_debug_uses)
>  {
>    unsigned int num_uses = uses.size ();
>    if (num_uses == 0)
> @@ -1323,7 +1328,7 @@ function_info::make_uses_available (obstack_watermark &watermark,
>    auto **new_uses = XOBNEWVEC (watermark, access_info *, num_uses);
>    for (unsigned int i = 0; i < num_uses; ++i)
>      {
> -      use_info *use = make_use_available (uses[i], bb);
> +      use_info *use = make_use_available (uses[i], bb, will_be_debug_uses);
>        if (!use)
>         return use_array (access_array::invalid ());
>        new_uses[i] = use;
> diff --git a/gcc/rtl-ssa/functions.h b/gcc/rtl-ssa/functions.h
> index 58755d74cc9..cf68c94647a 100644
> --- a/gcc/rtl-ssa/functions.h
> +++ b/gcc/rtl-ssa/functions.h
> @@ -126,8 +126,11 @@ public:
>    // If the operation fails, return an invalid use_array.
>    //
>    // WATERMARK is a watermark returned by new_change_attempt ().
> +  // WILL_BE_DEBUG_USES is true if the returned use_array will be
> +  // used only for debug instructions.
>    use_array make_uses_available (obstack_watermark &watermark,
> -                                use_array uses, bb_info *bb);
> +                                use_array uses, bb_info *bb,
> +                                bool will_be_debug_uses);
>
>    // If CHANGE doesn't already clobber REGNO, try to add such a clobber,
>    // limiting the movement range in order to make the clobber valid.
> @@ -196,7 +199,7 @@ private:
>    def_node *need_def_node (def_info *);
>    def_splay_tree need_def_splay_tree (def_info *);
>
> -  use_info *make_use_available (use_info *, bb_info *);
> +  use_info *make_use_available (use_info *, bb_info *, bool);
>    def_array insert_temp_clobber (obstack_watermark &, insn_info *,
>                                  unsigned int, def_array);
>
> diff --git a/gcc/testsuite/g++.dg/torture/pr100303.C b/gcc/testsuite/g++.dg/torture/pr100303.C
> new file mode 100644
> index 00000000000..5af9412df40
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/torture/pr100303.C
> @@ -0,0 +1,112 @@
> +/* { dg-additional-options "-w -fcompare-debug -fno-dce -ftracer" } */
> +
> +template < typename _T1 > struct pair
> +{
> +  _T1 first;
> +  int second;
> +};
> +struct __aligned_membuf
> +{
> +  void _M_ptr ();
> +};
> +struct _Rb_tree_node_base
> +{
> +  typedef _Rb_tree_node_base *_Base_ptr;
> +};
> +struct _Rb_tree_node:_Rb_tree_node_base
> +{
> +  __aligned_membuf _M_storage;
> +  void _M_valptr ()
> +  {
> +    _M_storage._M_ptr ();
> +  }
> +};
> +struct _Rb_tree_iterator
> +{
> +  typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
> +    _Rb_tree_iterator (_Base_ptr __x):_M_node (__x)
> +  {
> +  }
> +  void operator* ()
> +  {
> +    static_cast < _Rb_tree_node * >(_M_node)->_M_valptr ();
> +  }
> +  friend bool operator== (_Rb_tree_iterator __x, _Rb_tree_iterator)
> +  {
> +    return __x._M_node;
> +  }
> +  _Base_ptr _M_node;
> +};
> +
> +template < typename, typename, typename, typename, typename =
> +  int >class _Rb_tree
> +{
> +  typedef _Rb_tree_node_base *_Base_ptr;
> +public:
> +    pair < _Base_ptr > _M_get_insert_hint_unique_pos (int);
> +  void _M_insert_node (_Base_ptr, int);
> +    template < typename ... _Args >
> +    _Rb_tree_iterator _M_emplace_hint_unique (_Args && ...);
> +  _Rb_tree_iterator lower_bound ()
> +  {
> +    _Rb_tree_node_base __trans_tmp_2;
> +      return &__trans_tmp_2;
> +  }
> +};
> +template < typename _Key, typename _Val, typename _KeyOfValue,
> +  typename _Compare,
> +  typename _Alloc > template < typename ... _Args >
> +  _Rb_tree_iterator _Rb_tree < _Key, _Val, _KeyOfValue, _Compare,
> +  _Alloc >::_M_emplace_hint_unique (_Args && ...)
> +{
> +  int __z;
> +  try
> +  {
> +    auto __res = _M_get_insert_hint_unique_pos (0);
> +    _Rb_tree_node_base *__res_1;
> +    if (__res_1)
> +      _M_insert_node (__res.first, __z);
> +    return __res.first;
> +  }
> +  catch ( ...)
> +  {
> +  }
> +}
> +
> +class map
> +{
> +  _Rb_tree < int, int, int, int >_M_t;
> +public:
> +    _Rb_tree_iterator end ();
> +  void operator[] (int)
> +  {
> +    _Rb_tree_iterator __i = lower_bound ();
> +    if (__i == end ())
> +      __i = _M_t._M_emplace_hint_unique (__i);
> +    *__i;
> +  }
> +  _Rb_tree_iterator lower_bound ()
> +  {
> +    return _M_t.lower_bound ();
> +  }
> +};
> +
> +class FlowStat
> +{
> +public:
> +  int FlowStat_flow;
> +    FlowStat ()
> +  {
> +    shares[FlowStat_flow];
> +  }
> +  map shares;
> +};
> +
> +class LinkGraphJob
> +{
> +  ~LinkGraphJob ();
> +};
> +LinkGraphJob::~LinkGraphJob ()
> +{
> +  FlowStat ();
> +}

      reply	other threads:[~2021-04-29 10:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-28 16:48 Richard Sandiford
2021-04-29 10:23 ` Richard Biener [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFiYyc0zqhUe1MmKTMfn+sj=dkj+qXmXh2_70Sunp-X41rtwWQ@mail.gmail.com' \
    --to=richard.guenther@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=richard.sandiford@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).