[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:51 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;
+ llvm_unreachable("region's parent MBB cannot be identified");
+}
+
+void PreRARematStage::finalizeGCNSchedStage() {
+ // We consider that reducing spilling is always beneficial so we never
+ // rollback rematerializations in such cases. It's also possible that
+ // rescheduling lowers occupancy over the one achieved just through remats, in
+ // which case we do not want to rollback either (the rescheduling was already
+ // reverted in PreRARematStage::shouldRevertScheduling in such cases).
+ unsigned MaxOcc = std::max(AchievedOcc, DAG.MinOccupancy);
+ if (!IncreaseOccupancy || MaxOcc >= TargetOcc)
+ return;
+
+ REMAT_DEBUG(dbgs() << "Rollbacking all rematerializations\n");
+ const auto *TII =
+ static_cast<const SIInstrInfo *>(MF.getSubtarget().getInstrInfo());
----------------
arsenm wrote:
```suggestion
const SIInstrInfo *TII = MF.getSubtarget<GCNSubtarget>().getInstrInfo();
```
https://github.com/llvm/llvm-project/pull/125885
More information about the llvm-commits
mailing list