diff mbox series

[2/3] rtl-ssa: Extend make_uses_available

Message ID 20231024175805.3359331-3-richard.sandiford@arm.com
State New
Headers show
Series rtl-ssa: Various extensions for the late-combine pass | expand

Commit Message

Richard Sandiford Oct. 24, 2023, 5:58 p.m. UTC
The first in-tree use of RTL-SSA was fwprop, and one of the goals
was to make the fwprop rewrite preserve the old behaviour as far
as possible.  The switch to RTL-SSA was supposed to be a pure
infrastructure change.  So RTL-SSA has various FIXMEs for things
that were artifically limited to faciliate the old-fwprop vs.
new-fwprop comparison.

One of the things that fwprop wants to do is extend live ranges, and
function_info::make_use_available tried to keep within the cases that
old fwprop could handle.

Since the information is built in extended basic blocks, it's easy
to handle intra-EBB queries directly.  This patch does that, and
removes the associated FIXME.

To get a flavour for how much difference this makes, I tried compiling
the testsuite at -Os for at least one target per supported CPU and OS.
For most targets, only a handful of tests changed, but the vast majority
of changes were positive.  The only target that seemed to benefit
significantly was i686-apple-darwin.

The main point of the patch is to remove the FIXME and to enable
the upcoming post-RA late-combine pass to handle more cases.

gcc/
	* rtl-ssa/functions.h (function_info::remains_available_at_insn):
	New member function.
	* rtl-ssa/accesses.cc (function_info::remains_available_at_insn):
	Likewise.
	(function_info::make_use_available): Avoid false negatives for
	queries within an EBB.
---
 gcc/rtl-ssa/accesses.cc | 37 +++++++++++++++++++++++++++++++++++--
 gcc/rtl-ssa/functions.h |  4 ++++
 2 files changed, 39 insertions(+), 2 deletions(-)

Comments

Jeff Law Oct. 24, 2023, 6:45 p.m. UTC | #1
On 10/24/23 11:58, Richard Sandiford wrote:
> The first in-tree use of RTL-SSA was fwprop, and one of the goals
> was to make the fwprop rewrite preserve the old behaviour as far
> as possible.  The switch to RTL-SSA was supposed to be a pure
> infrastructure change.  So RTL-SSA has various FIXMEs for things
> that were artifically limited to faciliate the old-fwprop vs.
> new-fwprop comparison.
> 
> One of the things that fwprop wants to do is extend live ranges, and
> function_info::make_use_available tried to keep within the cases that
> old fwprop could handle.
> 
> Since the information is built in extended basic blocks, it's easy
> to handle intra-EBB queries directly.  This patch does that, and
> removes the associated FIXME.
> 
> To get a flavour for how much difference this makes, I tried compiling
> the testsuite at -Os for at least one target per supported CPU and OS.
> For most targets, only a handful of tests changed, but the vast majority
> of changes were positive.  The only target that seemed to benefit
> significantly was i686-apple-darwin.
> 
> The main point of the patch is to remove the FIXME and to enable
> the upcoming post-RA late-combine pass to handle more cases.
> 
> gcc/
> 	* rtl-ssa/functions.h (function_info::remains_available_at_insn):
> 	New member function.
> 	* rtl-ssa/accesses.cc (function_info::remains_available_at_insn):
> 	Likewise.
> 	(function_info::make_use_available): Avoid false negatives for
> 	queries within an EBB.
OK
jeff
diff mbox series

Patch

diff --git a/gcc/rtl-ssa/accesses.cc b/gcc/rtl-ssa/accesses.cc
index c35c7efb73d..1b25ecc3e23 100644
--- a/gcc/rtl-ssa/accesses.cc
+++ b/gcc/rtl-ssa/accesses.cc
@@ -1303,6 +1303,33 @@  function_info::insert_temp_clobber (obstack_watermark &watermark,
   return insert_access (watermark, clobber, old_defs);
 }
 
+// See the comment above the declaration.
+bool
+function_info::remains_available_at_insn (const set_info *set,
+					  insn_info *insn)
+{
+  auto *ebb = set->ebb ();
+  gcc_checking_assert (ebb == insn->ebb ());
+
+  def_info *next_def = set->next_def ();
+  if (next_def && *next_def->insn () < *insn)
+    return false;
+
+  if (HARD_REGISTER_NUM_P (set->regno ())
+      && TEST_HARD_REG_BIT (m_clobbered_by_calls, set->regno ()))
+    for (ebb_call_clobbers_info *call_group : ebb->call_clobbers ())
+      {
+	if (!call_group->clobbers (set->resource ()))
+	  continue;
+
+	insn_info *call_insn = next_call_clobbers (*call_group, insn);
+	if (call_insn && *call_insn < *insn)
+	  return false;
+      }
+
+  return true;
+}
+
 // See the comment above the declaration.
 bool
 function_info::remains_available_on_exit (const set_info *set, bb_info *bb)
@@ -1354,14 +1381,20 @@  function_info::make_use_available (use_info *use, bb_info *bb,
   if (is_single_dominating_def (def))
     return use;
 
-  // FIXME: Deliberately limited for fwprop compatibility testing.
+  if (def->ebb () == bb->ebb ())
+    {
+      if (remains_available_at_insn (def, bb->head_insn ()))
+	return use;
+      return nullptr;
+    }
+
   basic_block cfg_bb = bb->cfg_bb ();
   bb_info *use_bb = use->bb ();
   if (single_pred_p (cfg_bb)
       && single_pred (cfg_bb) == use_bb->cfg_bb ()
       && remains_available_on_exit (def, use_bb))
     {
-      if (def->ebb () == bb->ebb () || will_be_debug_use)
+      if (will_be_debug_use)
 	return use;
 
       resource_info resource = use->resource ();
diff --git a/gcc/rtl-ssa/functions.h b/gcc/rtl-ssa/functions.h
index ab253e750cb..ecb40fdaf57 100644
--- a/gcc/rtl-ssa/functions.h
+++ b/gcc/rtl-ssa/functions.h
@@ -121,6 +121,10 @@  public:
   // scope until the change has been aborted or successfully completed.
   obstack_watermark new_change_attempt () { return &m_temp_obstack; }
 
+  // SET and INSN belong to the same EBB, with SET occuring before INSN.
+  // Return true if SET is still available at INSN.
+  bool remains_available_at_insn (const set_info *set, insn_info *insn);
+
   // SET either occurs in BB or is known to be available on entry to BB.
   // Return true if it is also available on exit from BB.  (The value
   // might or might not be live.)