mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
mi-sched: update PressureDiffs on-the-fly for liveness.
This removes all expensive pressure tracking logic from the scheduling critical path of node comparison. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189643 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -156,8 +156,9 @@ static ScheduleDAGInstrs *createConvergingSched(MachineSchedContext *C);
|
||||
|
||||
|
||||
/// Decrement this iterator until reaching the top or a non-debug instr.
|
||||
static MachineBasicBlock::iterator
|
||||
priorNonDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator Beg) {
|
||||
static MachineBasicBlock::const_iterator
|
||||
priorNonDebug(MachineBasicBlock::const_iterator I,
|
||||
MachineBasicBlock::const_iterator Beg) {
|
||||
assert(I != Beg && "reached the top of the region, cannot decrement");
|
||||
while (--I != Beg) {
|
||||
if (!I->isDebugValue())
|
||||
@ -166,6 +167,14 @@ priorNonDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator Beg) {
|
||||
return I;
|
||||
}
|
||||
|
||||
/// Non-const version.
|
||||
static MachineBasicBlock::iterator
|
||||
priorNonDebug(MachineBasicBlock::iterator I,
|
||||
MachineBasicBlock::const_iterator Beg) {
|
||||
return const_cast<MachineInstr*>(
|
||||
&*priorNonDebug(MachineBasicBlock::const_iterator(I), Beg));
|
||||
}
|
||||
|
||||
/// If this iterator is a debug value, increment until reaching the End or a
|
||||
/// non-debug instruction.
|
||||
static MachineBasicBlock::iterator
|
||||
@ -488,9 +497,16 @@ void ScheduleDAGMI::initRegPressure() {
|
||||
dumpRegSetPressure(BotRPTracker.getLiveThru(), TRI));
|
||||
};
|
||||
|
||||
// For each live out vreg reduce the pressure change associated with other
|
||||
// uses of the same vreg below the live-out reaching def.
|
||||
updatePressureDiffs(RPTracker.getPressure().LiveOutRegs);
|
||||
|
||||
// Account for liveness generated by the region boundary.
|
||||
if (LiveRegionEnd != RegionEnd)
|
||||
BotRPTracker.recede();
|
||||
if (LiveRegionEnd != RegionEnd) {
|
||||
SmallVector<unsigned, 8> LiveUses;
|
||||
BotRPTracker.recede(&LiveUses);
|
||||
updatePressureDiffs(LiveUses);
|
||||
}
|
||||
|
||||
assert(BotRPTracker.getPos() == RegionEnd && "Can't find the region bottom");
|
||||
|
||||
@ -535,6 +551,42 @@ updateScheduledPressure(const std::vector<unsigned> &NewMaxPressure) {
|
||||
});
|
||||
}
|
||||
|
||||
/// Update the PressureDiff array for liveness after scheduling this
|
||||
/// instruction.
|
||||
void ScheduleDAGMI::updatePressureDiffs(ArrayRef<unsigned> LiveUses) {
|
||||
for (unsigned LUIdx = 0, LUEnd = LiveUses.size(); LUIdx != LUEnd; ++LUIdx) {
|
||||
/// FIXME: Currently assuming single-use physregs.
|
||||
unsigned Reg = LiveUses[LUIdx];
|
||||
if (!TRI->isVirtualRegister(Reg))
|
||||
continue;
|
||||
// This may be called before CurrentBottom has been initialized. However,
|
||||
// BotRPTracker must have a valid position. We want the value live into the
|
||||
// instruction or live out of the block, so ask for the previous
|
||||
// instruction's live-out.
|
||||
const LiveInterval &LI = LIS->getInterval(Reg);
|
||||
VNInfo *VNI;
|
||||
if (BotRPTracker.getPos() == BB->end())
|
||||
VNI = LI.getVNInfoBefore(LIS->getMBBEndIdx(BB));
|
||||
else {
|
||||
LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(BotRPTracker.getPos()));
|
||||
VNI = LRQ.valueIn();
|
||||
}
|
||||
// RegisterPressureTracker guarantees that readsReg is true for LiveUses.
|
||||
assert(VNI && "No live value at use.");
|
||||
for (VReg2UseMap::iterator
|
||||
UI = VRegUses.find(Reg); UI != VRegUses.end(); ++UI) {
|
||||
SUnit *SU = UI->SU;
|
||||
// If this use comes before the reaching def, it cannot be a last use, so
|
||||
// descrease its pressure change.
|
||||
if (!SU->isScheduled && SU != &ExitSU) {
|
||||
LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(SU->getInstr()));
|
||||
if (LRQ.valueIn() == VNI)
|
||||
getPressureDiff(SU).addPressureChange(Reg, true, &MRI);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// schedule - Called back from MachineScheduler::runOnMachineFunction
|
||||
/// after setting up the current scheduling region. [RegionBegin, RegionEnd)
|
||||
/// only includes instructions that have DAG nodes, not scheduling boundaries.
|
||||
@ -794,8 +846,10 @@ void ScheduleDAGMI::scheduleMI(SUnit *SU, bool IsTopNode) {
|
||||
CurrentBottom = MI;
|
||||
}
|
||||
// Update bottom scheduled pressure.
|
||||
BotRPTracker.recede();
|
||||
SmallVector<unsigned, 8> LiveUses;
|
||||
BotRPTracker.recede(&LiveUses);
|
||||
assert(BotRPTracker.getPos() == CurrentBottom && "out of sync");
|
||||
updatePressureDiffs(LiveUses);
|
||||
updateScheduledPressure(BotRPTracker.getPressure().MaxSetPressure);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user