mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
Added -misched-regpressure option.
Register pressure tracking is half the complexity of the scheduler. It's useful to be able to turn it off for compile time and performance comparisons. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189987 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b4b7a52ec5
commit
42ebb3ad41
@ -227,6 +227,7 @@ protected:
|
||||
PressureDiffs SUPressureDiffs;
|
||||
|
||||
/// Register pressure in this region computed by initRegPressure.
|
||||
bool ShouldTrackPressure;
|
||||
IntervalPressure RegPressure;
|
||||
RegPressureTracker RPTracker;
|
||||
|
||||
@ -259,8 +260,9 @@ public:
|
||||
ScheduleDAGMI(MachineSchedContext *C, MachineSchedStrategy *S):
|
||||
ScheduleDAGInstrs(*C->MF, *C->MLI, *C->MDT, /*IsPostRA=*/false, C->LIS),
|
||||
AA(C->AA), RegClassInfo(C->RegClassInfo), SchedImpl(S), DFSResult(0),
|
||||
Topo(SUnits, &ExitSU), RPTracker(RegPressure), CurrentTop(),
|
||||
TopRPTracker(TopPressure), CurrentBottom(), BotRPTracker(BotPressure),
|
||||
Topo(SUnits, &ExitSU), ShouldTrackPressure(false),
|
||||
RPTracker(RegPressure), CurrentTop(), TopRPTracker(TopPressure),
|
||||
CurrentBottom(), BotRPTracker(BotPressure),
|
||||
NextClusterPred(NULL), NextClusterSucc(NULL) {
|
||||
#ifndef NDEBUG
|
||||
NumInstrsScheduled = 0;
|
||||
|
@ -288,6 +288,8 @@ public:
|
||||
MF(0), TRI(0), RCI(0), LIS(0), MBB(0), P(rp), RequireIntervals(false),
|
||||
TrackUntiedDefs(false) {}
|
||||
|
||||
void reset();
|
||||
|
||||
void init(const MachineFunction *mf, const RegisterClassInfo *rci,
|
||||
const LiveIntervals *lis, const MachineBasicBlock *mbb,
|
||||
MachineBasicBlock::const_iterator pos,
|
||||
|
@ -53,6 +53,9 @@ static cl::opt<unsigned> MISchedCutoff("misched-cutoff", cl::Hidden,
|
||||
static bool ViewMISchedDAGs = false;
|
||||
#endif // NDEBUG
|
||||
|
||||
static cl::opt<bool> EnableRegPressure("misched-regpressure", cl::Hidden,
|
||||
cl::desc("Enable register pressure scheduling."), cl::init(true));
|
||||
|
||||
static cl::opt<bool> EnableCyclicPath("misched-cyclicpath", cl::Hidden,
|
||||
cl::desc("Enable cyclic critical path analysis."), cl::init(false));
|
||||
|
||||
@ -477,6 +480,8 @@ void ScheduleDAGMI::enterRegion(MachineBasicBlock *bb,
|
||||
{
|
||||
ScheduleDAGInstrs::enterRegion(bb, begin, end, regioninstrs);
|
||||
|
||||
ShouldTrackPressure = EnableRegPressure;
|
||||
|
||||
// For convenience remember the end of the liveness region.
|
||||
LiveRegionEnd =
|
||||
(RegionEnd == bb->end()) ? RegionEnd : llvm::next(RegionEnd);
|
||||
@ -657,6 +662,13 @@ void ScheduleDAGMI::schedule() {
|
||||
|
||||
/// Build the DAG and setup three register pressure trackers.
|
||||
void ScheduleDAGMI::buildDAGWithRegPressure() {
|
||||
if (!ShouldTrackPressure) {
|
||||
RPTracker.reset();
|
||||
RegionCriticalPSets.clear();
|
||||
buildSchedGraph(AA);
|
||||
return;
|
||||
}
|
||||
|
||||
// Initialize the register pressure tracker used by buildSchedGraph.
|
||||
RPTracker.init(&MF, RegClassInfo, LIS, BB, LiveRegionEnd,
|
||||
/*TrackUntiedDefs=*/true);
|
||||
@ -820,11 +832,13 @@ void ScheduleDAGMI::initQueues(ArrayRef<SUnit*> TopRoots,
|
||||
SchedImpl->registerRoots();
|
||||
|
||||
// Advance past initial DebugValues.
|
||||
assert(TopRPTracker.getPos() == RegionBegin && "bad initial Top tracker");
|
||||
CurrentTop = nextIfDebug(RegionBegin, RegionEnd);
|
||||
TopRPTracker.setPos(CurrentTop);
|
||||
|
||||
CurrentBottom = RegionEnd;
|
||||
|
||||
if (ShouldTrackPressure) {
|
||||
assert(TopRPTracker.getPos() == RegionBegin && "bad initial Top tracker");
|
||||
TopRPTracker.setPos(CurrentTop);
|
||||
}
|
||||
}
|
||||
|
||||
/// Move an instruction and update register pressure.
|
||||
@ -841,10 +855,12 @@ void ScheduleDAGMI::scheduleMI(SUnit *SU, bool IsTopNode) {
|
||||
TopRPTracker.setPos(MI);
|
||||
}
|
||||
|
||||
// Update top scheduled pressure.
|
||||
TopRPTracker.advance();
|
||||
assert(TopRPTracker.getPos() == CurrentTop && "out of sync");
|
||||
updateScheduledPressure(TopRPTracker.getPressure().MaxSetPressure);
|
||||
if (ShouldTrackPressure) {
|
||||
// Update top scheduled pressure.
|
||||
TopRPTracker.advance();
|
||||
assert(TopRPTracker.getPos() == CurrentTop && "out of sync");
|
||||
updateScheduledPressure(TopRPTracker.getPressure().MaxSetPressure);
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(SU->isBottomReady() && "node still has unscheduled dependencies");
|
||||
@ -860,12 +876,14 @@ void ScheduleDAGMI::scheduleMI(SUnit *SU, bool IsTopNode) {
|
||||
moveInstruction(MI, CurrentBottom);
|
||||
CurrentBottom = MI;
|
||||
}
|
||||
// Update bottom scheduled pressure.
|
||||
SmallVector<unsigned, 8> LiveUses;
|
||||
BotRPTracker.recede(&LiveUses);
|
||||
assert(BotRPTracker.getPos() == CurrentBottom && "out of sync");
|
||||
updatePressureDiffs(LiveUses);
|
||||
updateScheduledPressure(BotRPTracker.getPressure().MaxSetPressure);
|
||||
if (ShouldTrackPressure) {
|
||||
// Update bottom scheduled pressure.
|
||||
SmallVector<unsigned, 8> LiveUses;
|
||||
BotRPTracker.recede(&LiveUses);
|
||||
assert(BotRPTracker.getPos() == CurrentBottom && "out of sync");
|
||||
updatePressureDiffs(LiveUses);
|
||||
updateScheduledPressure(BotRPTracker.getPressure().MaxSetPressure);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,6 +153,24 @@ const LiveInterval *RegPressureTracker::getInterval(unsigned Reg) const {
|
||||
return LIS->getCachedRegUnit(Reg);
|
||||
}
|
||||
|
||||
void RegPressureTracker::reset() {
|
||||
MBB = 0;
|
||||
LIS = 0;
|
||||
|
||||
CurrSetPressure.clear();
|
||||
LiveThruPressure.clear();
|
||||
P.MaxSetPressure.clear();
|
||||
|
||||
if (RequireIntervals)
|
||||
static_cast<IntervalPressure&>(P).reset();
|
||||
else
|
||||
static_cast<RegionPressure&>(P).reset();
|
||||
|
||||
LiveRegs.PhysRegs.clear();
|
||||
LiveRegs.VirtRegs.clear();
|
||||
UntiedDefs.clear();
|
||||
}
|
||||
|
||||
/// Setup the RegPressureTracker.
|
||||
///
|
||||
/// TODO: Add support for pressure without LiveIntervals.
|
||||
@ -163,6 +181,8 @@ void RegPressureTracker::init(const MachineFunction *mf,
|
||||
MachineBasicBlock::const_iterator pos,
|
||||
bool ShouldTrackUntiedDefs)
|
||||
{
|
||||
reset();
|
||||
|
||||
MF = mf;
|
||||
TRI = MF->getTarget().getRegisterInfo();
|
||||
RCI = rci;
|
||||
@ -177,19 +197,11 @@ void RegPressureTracker::init(const MachineFunction *mf,
|
||||
|
||||
CurrPos = pos;
|
||||
CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0);
|
||||
LiveThruPressure.clear();
|
||||
|
||||
if (RequireIntervals)
|
||||
static_cast<IntervalPressure&>(P).reset();
|
||||
else
|
||||
static_cast<RegionPressure&>(P).reset();
|
||||
P.MaxSetPressure = CurrSetPressure;
|
||||
|
||||
LiveRegs.PhysRegs.clear();
|
||||
LiveRegs.PhysRegs.setUniverse(TRI->getNumRegs());
|
||||
LiveRegs.VirtRegs.clear();
|
||||
LiveRegs.VirtRegs.setUniverse(MRI->getNumVirtRegs());
|
||||
UntiedDefs.clear();
|
||||
if (TrackUntiedDefs)
|
||||
UntiedDefs.setUniverse(MRI->getNumVirtRegs());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user