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.
This commit is contained in:
parent
d5d43dc399
commit
e0374b028a
1 changed files with 16 additions and 5 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue