mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
mi-sched: cleanup register pressure update, remove a FIXME.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -413,7 +413,8 @@ protected:
|
|||||||
|
|
||||||
void updatePressureDiffs(ArrayRef<unsigned> LiveUses);
|
void updatePressureDiffs(ArrayRef<unsigned> LiveUses);
|
||||||
|
|
||||||
void updateScheduledPressure(const std::vector<unsigned> &NewMaxPressure);
|
void updateScheduledPressure(const SUnit *SU,
|
||||||
|
const std::vector<unsigned> &NewMaxPressure);
|
||||||
|
|
||||||
bool checkSchedLimit();
|
bool checkSchedLimit();
|
||||||
|
|
||||||
|
@ -145,6 +145,8 @@ public:
|
|||||||
typedef const PressureChange* const_iterator;
|
typedef const PressureChange* const_iterator;
|
||||||
iterator begin() { return &PressureChanges[0]; }
|
iterator begin() { return &PressureChanges[0]; }
|
||||||
iterator end() { return &PressureChanges[MaxPSets]; }
|
iterator end() { return &PressureChanges[MaxPSets]; }
|
||||||
|
const_iterator begin() const { return &PressureChanges[0]; }
|
||||||
|
const_iterator end() const { return &PressureChanges[MaxPSets]; }
|
||||||
|
|
||||||
void addPressureChange(unsigned RegUnit, bool IsDec,
|
void addPressureChange(unsigned RegUnit, bool IsDec,
|
||||||
const MachineRegisterInfo *MRI);
|
const MachineRegisterInfo *MRI);
|
||||||
@ -159,6 +161,8 @@ public:
|
|||||||
PressureDiffs(): PDiffArray(0), Size(0), Max(0) {}
|
PressureDiffs(): PDiffArray(0), Size(0), Max(0) {}
|
||||||
~PressureDiffs() { free(PDiffArray); }
|
~PressureDiffs() { free(PDiffArray); }
|
||||||
|
|
||||||
|
void clear() { Size = 0; }
|
||||||
|
|
||||||
void init(unsigned N);
|
void init(unsigned N);
|
||||||
|
|
||||||
PressureDiff &operator[](unsigned Idx) {
|
PressureDiff &operator[](unsigned Idx) {
|
||||||
|
@ -484,6 +484,8 @@ void ScheduleDAGMI::enterRegion(MachineBasicBlock *bb,
|
|||||||
LiveRegionEnd =
|
LiveRegionEnd =
|
||||||
(RegionEnd == bb->end()) ? RegionEnd : llvm::next(RegionEnd);
|
(RegionEnd == bb->end()) ? RegionEnd : llvm::next(RegionEnd);
|
||||||
|
|
||||||
|
SUPressureDiffs.clear();
|
||||||
|
|
||||||
SchedImpl->initPolicy(begin, end, regioninstrs);
|
SchedImpl->initPolicy(begin, end, regioninstrs);
|
||||||
|
|
||||||
ShouldTrackPressure = SchedImpl->shouldTrackPressure();
|
ShouldTrackPressure = SchedImpl->shouldTrackPressure();
|
||||||
@ -551,25 +553,30 @@ void ScheduleDAGMI::initRegPressure() {
|
|||||||
dbgs() << "\n");
|
dbgs() << "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: When the pressure tracker deals in pressure differences then we won't
|
|
||||||
// iterate over all RegionCriticalPSets[i].
|
|
||||||
void ScheduleDAGMI::
|
void ScheduleDAGMI::
|
||||||
updateScheduledPressure(const std::vector<unsigned> &NewMaxPressure) {
|
updateScheduledPressure(const SUnit *SU,
|
||||||
for (unsigned i = 0, e = RegionCriticalPSets.size(); i < e; ++i) {
|
const std::vector<unsigned> &NewMaxPressure) {
|
||||||
unsigned ID = RegionCriticalPSets[i].getPSet();
|
const PressureDiff &PDiff = getPressureDiff(SU);
|
||||||
if ((int)NewMaxPressure[ID] > RegionCriticalPSets[i].getUnitInc()
|
unsigned CritIdx = 0, CritEnd = RegionCriticalPSets.size();
|
||||||
|
for (PressureDiff::const_iterator I = PDiff.begin(), E = PDiff.end();
|
||||||
|
I != E; ++I) {
|
||||||
|
if (!I->isValid())
|
||||||
|
break;
|
||||||
|
unsigned ID = I->getPSet();
|
||||||
|
while (CritIdx != CritEnd && RegionCriticalPSets[CritIdx].getPSet() < ID)
|
||||||
|
++CritIdx;
|
||||||
|
if (CritIdx != CritEnd && RegionCriticalPSets[CritIdx].getPSet() == ID) {
|
||||||
|
if ((int)NewMaxPressure[ID] > RegionCriticalPSets[CritIdx].getUnitInc()
|
||||||
&& NewMaxPressure[ID] <= INT16_MAX)
|
&& NewMaxPressure[ID] <= INT16_MAX)
|
||||||
RegionCriticalPSets[i].setUnitInc(NewMaxPressure[ID]);
|
RegionCriticalPSets[CritIdx].setUnitInc(NewMaxPressure[ID]);
|
||||||
|
}
|
||||||
|
unsigned Limit = RegClassInfo->getRegPressureSetLimit(ID);
|
||||||
|
if (NewMaxPressure[ID] >= Limit - 2) {
|
||||||
|
DEBUG(dbgs() << " " << TRI->getRegPressureSetName(ID) << ": "
|
||||||
|
<< NewMaxPressure[ID] << " > " << Limit << "(+ "
|
||||||
|
<< BotRPTracker.getLiveThru()[ID] << " livethru)\n");
|
||||||
}
|
}
|
||||||
DEBUG(
|
|
||||||
for (unsigned i = 0, e = NewMaxPressure.size(); i < e; ++i) {
|
|
||||||
unsigned Limit = RegClassInfo->getRegPressureSetLimit(i);
|
|
||||||
if (NewMaxPressure[i] > Limit ) {
|
|
||||||
dbgs() << " " << TRI->getRegPressureSetName(i) << ": "
|
|
||||||
<< NewMaxPressure[i] << " > " << Limit << "(+ "
|
|
||||||
<< BotRPTracker.getLiveThru()[i] << " livethru)\n";
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the PressureDiff array for liveness after scheduling this
|
/// Update the PressureDiff array for liveness after scheduling this
|
||||||
@ -866,7 +873,7 @@ void ScheduleDAGMI::scheduleMI(SUnit *SU, bool IsTopNode) {
|
|||||||
// Update top scheduled pressure.
|
// Update top scheduled pressure.
|
||||||
TopRPTracker.advance();
|
TopRPTracker.advance();
|
||||||
assert(TopRPTracker.getPos() == CurrentTop && "out of sync");
|
assert(TopRPTracker.getPos() == CurrentTop && "out of sync");
|
||||||
updateScheduledPressure(TopRPTracker.getPressure().MaxSetPressure);
|
updateScheduledPressure(SU, TopRPTracker.getPressure().MaxSetPressure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -888,8 +895,8 @@ void ScheduleDAGMI::scheduleMI(SUnit *SU, bool IsTopNode) {
|
|||||||
SmallVector<unsigned, 8> LiveUses;
|
SmallVector<unsigned, 8> LiveUses;
|
||||||
BotRPTracker.recede(&LiveUses);
|
BotRPTracker.recede(&LiveUses);
|
||||||
assert(BotRPTracker.getPos() == CurrentBottom && "out of sync");
|
assert(BotRPTracker.getPos() == CurrentBottom && "out of sync");
|
||||||
|
updateScheduledPressure(SU, BotRPTracker.getPressure().MaxSetPressure);
|
||||||
updatePressureDiffs(LiveUses);
|
updatePressureDiffs(LiveUses);
|
||||||
updateScheduledPressure(BotRPTracker.getPressure().MaxSetPressure);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user