Skip to content

Commit 3e18216

Browse files
authored
[AMDGPU][Scheduler] Delete RescheduleRegions bitvector from scheduler (NFC) (#141595)
The `GCNScheduleDAGMILive`'s `RescheduleRegions` bitvector is only used by the rematerialization stage (`PreRARematStage`). Its presence in the scheduler's state forces us to maintain its value throughout scheduling even though it is of no use to the iterative scheduling process itself, which instead relies on each stage's `initGCNRegion` hook to determine whether the current region should be rescheduled. This moves the bitvector to the `PreRARematStage`, which uses it to store the set of regions that must be rescheduled between stage initialization and region initialization. This NFC also swaps a call to `GCNRegPressure::getArchVGPRNum(false)` for a call to `GCNRegPressure::getArchVGPRNum()`---which is equivalent but simpler in the context---and makes `GCNSchedStage::finalizeGCNRegion` use its own API to advance to the next region.
1 parent e90ea09 commit 3e18216

File tree

2 files changed

+8
-19
lines changed

2 files changed

+8
-19
lines changed

llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -937,12 +937,10 @@ void GCNScheduleDAGMILive::finalizeSchedule() {
937937
// GCNScheduleDAGMILive::schedule().
938938
LiveIns.resize(Regions.size());
939939
Pressure.resize(Regions.size());
940-
RescheduleRegions.resize(Regions.size());
941940
RegionsWithHighRP.resize(Regions.size());
942941
RegionsWithExcessRP.resize(Regions.size());
943942
RegionsWithMinOcc.resize(Regions.size());
944943
RegionsWithIGLPInstrs.resize(Regions.size());
945-
RescheduleRegions.set();
946944
RegionsWithHighRP.reset();
947945
RegionsWithExcessRP.reset();
948946
RegionsWithMinOcc.reset();
@@ -1236,10 +1234,7 @@ bool ClusteredLowOccStage::initGCNRegion() {
12361234
}
12371235

12381236
bool PreRARematStage::initGCNRegion() {
1239-
if (!DAG.RescheduleRegions[RegionIdx])
1240-
return false;
1241-
1242-
return GCNSchedStage::initGCNRegion();
1237+
return RescheduleRegions[RegionIdx] && GCNSchedStage::initGCNRegion();
12431238
}
12441239

12451240
void GCNSchedStage::setupNewBlock() {
@@ -1258,7 +1253,6 @@ void GCNSchedStage::setupNewBlock() {
12581253

12591254
void GCNSchedStage::finalizeGCNRegion() {
12601255
DAG.Regions[RegionIdx] = std::pair(DAG.RegionBegin, DAG.RegionEnd);
1261-
DAG.RescheduleRegions[RegionIdx] = false;
12621256
if (S.HasHighPressure)
12631257
DAG.RegionsWithHighRP[RegionIdx] = true;
12641258

@@ -1271,7 +1265,7 @@ void GCNSchedStage::finalizeGCNRegion() {
12711265
SavedMutations.swap(DAG.Mutations);
12721266

12731267
DAG.exitRegion();
1274-
RegionIdx++;
1268+
advanceRegion();
12751269
}
12761270

12771271
void GCNSchedStage::checkScheduling() {
@@ -1332,10 +1326,9 @@ void GCNSchedStage::checkScheduling() {
13321326
unsigned MaxSGPRs = ST.getMaxNumSGPRs(MF);
13331327

13341328
if (PressureAfter.getVGPRNum(ST.hasGFX90AInsts()) > MaxVGPRs ||
1335-
PressureAfter.getVGPRNum(false) > MaxArchVGPRs ||
1329+
PressureAfter.getArchVGPRNum() > MaxArchVGPRs ||
13361330
PressureAfter.getAGPRNum() > MaxArchVGPRs ||
13371331
PressureAfter.getSGPRNum() > MaxSGPRs) {
1338-
DAG.RescheduleRegions[RegionIdx] = true;
13391332
DAG.RegionsWithHighRP[RegionIdx] = true;
13401333
DAG.RegionsWithExcessRP[RegionIdx] = true;
13411334
}
@@ -1577,9 +1570,6 @@ void GCNSchedStage::revertScheduling() {
15771570
DAG.RegionsWithMinOcc[RegionIdx] =
15781571
PressureBefore.getOccupancy(ST) == DAG.MinOccupancy;
15791572
LLVM_DEBUG(dbgs() << "Attempting to revert scheduling.\n");
1580-
DAG.RescheduleRegions[RegionIdx] =
1581-
S.hasNextStage() &&
1582-
S.getNextStage() != GCNSchedStageID::UnclusteredHighRPReschedule;
15831573
DAG.RegionEnd = DAG.RegionBegin;
15841574
int SkippedDebugInstr = 0;
15851575
for (MachineInstr *MI : Unsched) {
@@ -2154,7 +2144,7 @@ void PreRARematStage::rematerialize() {
21542144
AchievedOcc = TargetOcc;
21552145
for (auto &[I, OriginalRP] : ImpactedRegions) {
21562146
bool IsEmptyRegion = DAG.Regions[I].first == DAG.Regions[I].second;
2157-
DAG.RescheduleRegions[I] = !IsEmptyRegion;
2147+
RescheduleRegions[I] = !IsEmptyRegion;
21582148
if (!RecomputeRP.contains(I))
21592149
continue;
21602150

llvm/lib/Target/AMDGPU/GCNSchedStrategy.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,6 @@ class GCNScheduleDAGMILive final : public ScheduleDAGMILive {
243243
// Vector of regions recorder for later rescheduling
244244
SmallVector<RegionBoundaries, 32> Regions;
245245

246-
// Records if a region is not yet scheduled, or schedule has been reverted,
247-
// or we generally desire to reschedule it.
248-
BitVector RescheduleRegions;
249-
250246
// Record regions with high register pressure.
251247
BitVector RegionsWithHighRP;
252248

@@ -476,6 +472,9 @@ class PreRARematStage : public GCNSchedStage {
476472
/// In case we need to rollback rematerializations, save lane masks for all
477473
/// rematerialized registers in all regions in which they are live-ins.
478474
DenseMap<std::pair<unsigned, Register>, LaneBitmask> RegMasks;
475+
/// After successful stage initialization, indicates which regions should be
476+
/// rescheduled.
477+
BitVector RescheduleRegions;
479478
/// Target occupancy the stage estimates is reachable through
480479
/// rematerialization. Greater than or equal to the pre-stage min occupancy.
481480
unsigned TargetOcc;
@@ -520,7 +519,7 @@ class PreRARematStage : public GCNSchedStage {
520519
bool shouldRevertScheduling(unsigned WavesAfter) override;
521520

522521
PreRARematStage(GCNSchedStageID StageID, GCNScheduleDAGMILive &DAG)
523-
: GCNSchedStage(StageID, DAG) {}
522+
: GCNSchedStage(StageID, DAG), RescheduleRegions(DAG.Regions.size()) {}
524523
};
525524

526525
class ILPInitialScheduleStage : public GCNSchedStage {

0 commit comments

Comments
 (0)