[2/3] rtl-ssa: Extend make_uses_available
Checks
Commit Message
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
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
@@ -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 ();
@@ -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.)