@@ -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+
6166const unsigned ScheduleMetrics::ScaleFactor = 100 ;
6267
6368GCNSchedStrategy::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+
529547void 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
602630DenseMap<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+
619659void 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() {
639680void 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
0 commit comments