On 6/20/24 7:34 AM, Richard Sandiford wrote:
rtl-ssa has routines for scanning forwards or backwards for something
under the control of an exclusion set.  These searches are currently
used for two main things:

- to work out where an instruction can be moved within its EBB
- to work out whether recog can add a new hard register clobber

The exclusion set was originally a callback function that returned
true for insns that should be ignored.  However, for the late-combine
work, I'd also like to be able to skip an entire definition, along
with all its uses.

This patch prepares for that by turning the exclusion set into an
object that provides predicate member functions.  Currently the
only two member functions are:

- should_ignore_insn: what the old callback did
- should_ignore_def: the new functionality

but more could be added later.

Doing this also makes it easy to remove some assymmetry that I think
in hindsight was a mistake: in forward scans, ignoring an insn meant
ignoring all definitions in that insn (ok) and all uses of those
definitions (non-obvious).  The new interface makes it possible
to select the required behaviour, with that behaviour being applied
consistently in both directions.

Now that the exclusion set is a dedicated object, rather than
just a "random" function, I think it makes sense to remove the
_ignoring suffix from the function names.  The suffix was originally
there to describe the callback, and in particular to emphasise that
a true return meant "ignore" rather than "heed".

gcc/
        * rtl-ssa.h: Include predicates.h.
        * rtl-ssa/predicates.h: New file.
        * rtl-ssa/access-utils.h (prev_call_clobbers_ignoring): Rename to...
        (prev_call_clobbers): ...this and treat the ignore parameter as an
        object with the same interface as ignore_nothing.
        (next_call_clobbers_ignoring): Rename to...
        (next_call_clobbers): ...this and treat the ignore parameter as an
        object with the same interface as ignore_nothing.
        (first_nondebug_insn_use_ignoring): Rename to...
        (first_nondebug_insn_use): ...this and treat the ignore parameter as
        an object with the same interface as ignore_nothing.
        (last_nondebug_insn_use_ignoring): Rename to...
        (last_nondebug_insn_use): ...this and treat the ignore parameter as
        an object with the same interface as ignore_nothing.
        (last_access_ignoring): Rename to...
        (last_access): ...this and treat the ignore parameter as an object
        with the same interface as ignore_nothing.  Conditionally skip
        definitions.
        (prev_access_ignoring): Rename to...
        (prev_access): ...this and treat the ignore parameter as an object
        with the same interface as ignore_nothing.
        (first_def_ignoring): Replace with...
        (first_access): ...this new function.
        (next_access_ignoring): Rename to...
        (next_access): ...this and treat the ignore parameter as an object
        with the same interface as ignore_nothing.  Conditionally skip
        definitions.
        * rtl-ssa/change-utils.h (insn_is_changing): Delete.
        (restrict_movement_ignoring): Rename to...
        (restrict_movement): ...this and treat the ignore parameter as an
        object with the same interface as ignore_nothing.
        (recog_ignoring): Rename to...
        (recog): ...this and treat the ignore parameter as an object with
        the same interface as ignore_nothing.
        * rtl-ssa/changes.h (insn_is_changing_closure): Delete.
        * rtl-ssa/functions.h (function_info::add_regno_clobber): Treat
        the ignore parameter as an object with the same interface as
        ignore_nothing.
        * rtl-ssa/insn-utils.h (insn_is): Delete.
        * rtl-ssa/insns.h (insn_is_closure): Delete.
        * rtl-ssa/member-fns.inl
        (insn_is_changing_closure::insn_is_changing_closure): Delete.
        (insn_is_changing_closure::operator()): Likewise.
        (function_info::add_regno_clobber): Treat the ignore parameter
        as an object with the same interface as ignore_nothing.
        (ignore_changing_insns::ignore_changing_insns): New function.
        (ignore_changing_insns::should_ignore_insn): Likewise.
        * rtl-ssa/movement.h (restrict_movement_for_dead_range): Treat
        the ignore parameter as an object with the same interface as
        ignore_nothing.
        (restrict_movement_for_defs_ignoring): Rename to...
        (restrict_movement_for_defs): ...this and treat the ignore parameter
        as an object with the same interface as ignore_nothing.
        (restrict_movement_for_uses_ignoring): Rename to...
        (restrict_movement_for_uses): ...this and treat the ignore parameter
        as an object with the same interface as ignore_nothing.  Conditionally
        skip definitions.
        * doc/rtl.texi: Update for above name changes.  Use
        ignore_changing_insns instead of insn_is_changing.
        * config/aarch64/aarch64-cc-fusion.cc (cc_fusion::parallelize_insns):
        Likewise.
        * pair-fusion.cc (no_ignore): Delete.
        (latest_hazard_before, first_hazard_after): Update for above name
        changes.  Use ignore_nothing instead of no_ignore.
        (pair_fusion_bb_info::fuse_pair): Update for above name changes.
        Use ignore_changing_insns instead of insn_is_changing.
        (pair_fusion::try_promote_writeback): Likewise.
---

OK.

jeff

Reply via email to