[llvm] [AMDGPU][Scheduler] Refactor ArchVGPR rematerialization during scheduling (PR #125885)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon May 5 04:38:50 PDT 2025
================
@@ -2004,46 +2197,99 @@ bool PreRARematStage::isTriviallyReMaterializable(const MachineInstr &MI) {
return true;
}
-// When removing, we will have to check both beginning and ending of the region.
-// When inserting, we will only have to check if we are inserting NewMI in front
-// of a scheduling region and do not need to check the ending since we will only
-// ever be inserting before an already existing MI.
-void GCNScheduleDAGMILive::updateRegionBoundaries(
- SmallVectorImpl<std::pair<MachineBasicBlock::iterator,
- MachineBasicBlock::iterator>> &RegionBoundaries,
- MachineBasicBlock::iterator MI, MachineInstr *NewMI, bool Removing) {
- unsigned I = 0, E = RegionBoundaries.size();
- // Search for first region of the block where MI is located
- while (I != E && MI->getParent() != RegionBoundaries[I].first->getParent())
- ++I;
-
- for (; I != E; ++I) {
- if (MI->getParent() != RegionBoundaries[I].first->getParent())
- return;
-
- if (Removing && MI == RegionBoundaries[I].first &&
- MI == RegionBoundaries[I].second) {
- // MI is in a region with size 1, after removing, the region will be
- // size 0, set RegionBegin and RegionEnd to pass end of block iterator.
- RegionBoundaries[I] =
- std::pair(MI->getParent()->end(), MI->getParent()->end());
- return;
- }
- if (MI == RegionBoundaries[I].first) {
- if (Removing)
- RegionBoundaries[I] =
- std::pair(std::next(MI), RegionBoundaries[I].second);
- else
- // Inserted NewMI in front of region, set new RegionBegin to NewMI
- RegionBoundaries[I] = std::pair(MachineBasicBlock::iterator(NewMI),
- RegionBoundaries[I].second);
- return;
- }
- if (Removing && MI == RegionBoundaries[I].second) {
- RegionBoundaries[I] = std::pair(RegionBoundaries[I].first, std::prev(MI));
- return;
+/// Identifies the parent MBB of a \p Region. For an empty region, this runs in
+/// linear time in the number of MBBs in \p MF; otherwise it runs in constant
+/// time.
+static MachineBasicBlock *getRegionMBB(MachineFunction &MF,
+ RegionBoundaries &Region) {
+ if (Region.first != Region.second)
+ return Region.first->getParent();
+ // The boundaries of an empty region may not point to a valid MI from which we
+ // can get the parent MBB, so we have to iterate over all the MF's MBBs.
+ for (MachineBasicBlock &MBB : MF)
+ if (MBB.end() == Region.second)
+ return &MBB;
----------------
arsenm wrote:
```suggestion
for (MachineBasicBlock &MBB : MF) {
if (Region.second == MBB.end())
return &MBB;
}
```
https://github.com/llvm/llvm-project/pull/125885
More information about the llvm-commits
mailing list