Skip to content

Commit f5423ab

Browse files
committed
[AMDGPU] NFC: Add BBLiveOutMap & LiveOut Cache
Change-Id: I63cfd44e635cc4bee0e6780ca43b692c46e940b7
1 parent 470aefb commit f5423ab

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ static cl::opt<bool>
5858
"Wave Limited (amdgpu-limit-wave-threshold)."),
5959
cl::init(false));
6060

61+
static cl::opt<bool> GCNTrackers(
62+
"amdgpu-use-amdgpu-trackers", cl::Hidden,
63+
cl::desc("Use the AMDGPU specific RPTrackers during scheduling"),
64+
cl::init(false));
65+
6166
const unsigned ScheduleMetrics::ScaleFactor = 100;
6267

6368
GCNSchedStrategy::GCNSchedStrategy(const MachineSchedContext *C)
@@ -526,6 +531,19 @@ GCNScheduleDAGMILive::getRealRegPressure(unsigned RegionIdx) const {
526531
return RPTracker.moveMaxPressure();
527532
}
528533

534+
static MachineInstr *getLastMIForRegion(MachineBasicBlock::iterator RegionBegin,
535+
MachineBasicBlock::iterator RegionEnd) {
536+
MachineInstr *LastMI;
537+
auto *BB = RegionBegin->getParent();
538+
if (RegionEnd != BB->end() && !RegionEnd->isDebugInstr())
539+
LastMI = &*RegionEnd;
540+
else if (RegionEnd == BB->end())
541+
LastMI = &*prev_nodbg(RegionEnd, RegionBegin);
542+
else
543+
LastMI = &*skipDebugInstructionsBackward(RegionEnd, RegionBegin);
544+
return LastMI;
545+
}
546+
529547
void GCNScheduleDAGMILive::computeBlockPressure(unsigned RegionIdx,
530548
const MachineBasicBlock *MBB) {
531549
GCNDownwardRPTracker RPTracker(*LIS);
@@ -597,6 +615,16 @@ void GCNScheduleDAGMILive::computeBlockPressure(unsigned RegionIdx,
597615
RPTracker.advanceBeforeNext();
598616
MBBLiveIns[OnlySucc] = RPTracker.moveLiveRegs();
599617
}
618+
619+
if (GCNTrackers) {
620+
assert(LiveOuts.size() == Regions.size());
621+
for (unsigned RegionIdx = 0; RegionIdx < Regions.size(); RegionIdx++) {
622+
auto RegionBegin = Regions[RegionIdx].first;
623+
auto RegionEnd = Regions[RegionIdx].second;
624+
MachineInstr *LastMI = getLastMIForRegion(RegionBegin, RegionEnd);
625+
LiveOuts[RegionIdx] = BBLiveOutMap.lookup(LastMI);
626+
}
627+
}
600628
}
601629

602630
DenseMap<MachineInstr *, GCNRPTracker::LiveRegSet>
@@ -616,11 +644,24 @@ GCNScheduleDAGMILive::getBBLiveInMap() const {
616644
return getLiveRegMap(BBStarters, false /*After*/, *LIS);
617645
}
618646

647+
DenseMap<MachineInstr *, GCNRPTracker::LiveRegSet>
648+
GCNScheduleDAGMILive::getBBLiveOutMap() const {
649+
assert(!Regions.empty());
650+
std::vector<MachineInstr *> BBEnders;
651+
BBEnders.reserve(Regions.size());
652+
auto I = Regions.rbegin(), E = Regions.rend();
653+
for (; I != E; I++)
654+
BBEnders.push_back(getLastMIForRegion(I->first, I->second));
655+
656+
return getLiveRegMap(BBEnders, true /*After*/, *LIS);
657+
}
658+
619659
void GCNScheduleDAGMILive::finalizeSchedule() {
620660
// Start actual scheduling here. This function is called by the base
621661
// MachineScheduler after all regions have been recorded by
622662
// GCNScheduleDAGMILive::schedule().
623663
LiveIns.resize(Regions.size());
664+
LiveOuts.resize(Regions.size());
624665
Pressure.resize(Regions.size());
625666
RescheduleRegions.resize(Regions.size());
626667
RegionsWithHighRP.resize(Regions.size());
@@ -639,8 +680,12 @@ void GCNScheduleDAGMILive::finalizeSchedule() {
639680
void GCNScheduleDAGMILive::runSchedStages() {
640681
LLVM_DEBUG(dbgs() << "All regions recorded, starting actual scheduling.\n");
641682

642-
if (!Regions.empty())
683+
if (!Regions.empty()) {
643684
BBLiveInMap = getBBLiveInMap();
685+
if (GCNTrackers) {
686+
BBLiveOutMap = getBBLiveOutMap();
687+
}
688+
}
644689

645690
GCNSchedStrategy &S = static_cast<GCNSchedStrategy &>(*SchedImpl);
646691
while (S.advanceStage()) {
@@ -1499,6 +1544,15 @@ bool PreRARematStage::sinkTriviallyRematInsts(const GCNSubtarget &ST,
14991544
DAG.Regions = NewRegions;
15001545
DAG.RescheduleRegions = NewRescheduleRegions;
15011546

1547+
if (GCNTrackers) {
1548+
DAG.BBLiveOutMap = DAG.getBBLiveOutMap();
1549+
auto I = DAG.Regions.begin(), E = DAG.Regions.end();
1550+
for (; I != E; I++) {
1551+
MachineInstr *LastMI = getLastMIForRegion(I->first, I->second);
1552+
DAG.LiveOuts.push_back(DAG.BBLiveOutMap.lookup(LastMI));
1553+
}
1554+
}
1555+
15021556
SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
15031557
MFI.increaseOccupancy(MF, ++DAG.MinOccupancy);
15041558

llvm/lib/Target/AMDGPU/GCNSchedStrategy.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ class GCNScheduleDAGMILive final : public ScheduleDAGMILive {
205205
// Region live-in cache.
206206
SmallVector<GCNRPTracker::LiveRegSet, 32> LiveIns;
207207

208+
// Region live-out cache.
209+
SmallVector<GCNRPTracker::LiveRegSet, 32> LiveOuts;
210+
208211
// Region pressure cache.
209212
SmallVector<GCNRegPressure, 32> Pressure;
210213

@@ -215,6 +218,10 @@ class GCNScheduleDAGMILive final : public ScheduleDAGMILive {
215218

216219
DenseMap<MachineInstr *, GCNRPTracker::LiveRegSet> getBBLiveInMap() const;
217220

221+
DenseMap<MachineInstr *, GCNRPTracker::LiveRegSet> BBLiveOutMap;
222+
223+
DenseMap<MachineInstr *, GCNRPTracker::LiveRegSet> getBBLiveOutMap() const;
224+
218225
// Return current region pressure.
219226
GCNRegPressure getRealRegPressure(unsigned RegionIdx) const;
220227

0 commit comments

Comments
 (0)