diff options
author | Alex Coplan <alex.coplan@arm.com> | 2024-01-11 16:17:37 +0000 |
---|---|---|
committer | Alex Coplan <alex.coplan@arm.com> | 2024-01-23 13:22:11 +0000 |
commit | e0374b028a665a2ea8d6eb2b4e5862774e9e85c2 (patch) | |
tree | 80016ab92cc7fc2cd355da9c9e2d321523586a58 /gcc | |
parent | d5d43dc399bb0f15084827c59a025189c630afdd (diff) | |
download | gcc-e0374b028a665a2ea8d6eb2b4e5862774e9e85c2.zip gcc-e0374b028a665a2ea8d6eb2b4e5862774e9e85c2.tar.gz gcc-e0374b028a665a2ea8d6eb2b4e5862774e9e85c2.tar.bz2 |
rtl-ssa: Run finalize_new_accesses forwards [PR113070]
The next patch in this series exposes an interface for creating new uses
in RTL-SSA. The intent is that new user-created uses can consume new
user-created defs in the same change group. This is so that we can
correctly update uses of memory when inserting a new store pair insn in
the aarch64 load/store pair fusion pass (the affected uses need to
consume the new store pair insn).
As it stands, finalize_new_accesses is called as part of the backwards
insn placement loop within change_insns, but if we want new uses to be
able to depend on new defs in the same change group, we need
finalize_new_accesses to be called on earlier insns first. This is so
that when we process temporary uses and turn them into permanent uses,
we can follow the last_def link on the temporary def to ensure we end up
with a permanent use consuming a permanent def.
gcc/ChangeLog:
PR target/113070
* rtl-ssa/changes.cc (function_info::change_insns): Split out the call
to finalize_new_accesses from the backwards placement loop, run it
forwards in a separate loop.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rtl-ssa/changes.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gcc/rtl-ssa/changes.cc b/gcc/rtl-ssa/changes.cc index 2fac45a..e538b63 100644 --- a/gcc/rtl-ssa/changes.cc +++ b/gcc/rtl-ssa/changes.cc @@ -775,15 +775,26 @@ function_info::change_insns (array_slice<insn_change *> changes) placeholder = add_placeholder_after (after); following_insn = placeholder; } - - // Finalize the new list of accesses for the change. Don't install - // them yet, so that we still have access to the old lists below. - finalize_new_accesses (change, - placeholder ? placeholder : insn); } placeholders[i] = placeholder; } + // Finalize the new list of accesses for each change. Don't install them yet, + // so that we still have access to the old lists below. + // + // Note that we do this forwards instead of in the backwards loop above so + // that any new defs being inserted are processed before new uses of those + // defs, so that the (initially) temporary uses referring to temporary defs + // can be easily updated to become permanent uses referring to permanent defs. + for (unsigned i = 0; i < changes.size (); i++) + { + insn_change &change = *changes[i]; + insn_info *placeholder = placeholders[i]; + if (!change.is_deletion ()) + finalize_new_accesses (change, + placeholder ? placeholder : change.insn ()); + } + // Remove all definitions that are no longer needed. After the above, // the only uses of such definitions should be dead phis and now-redundant // live-out uses. |