mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
misched: Use the TargetSchedModel interface wherever possible.
Allows the new machine model to be used for NumMicroOps and OutputLatency. Allows the HazardRecognizer to be disabled along with itineraries. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -652,6 +652,7 @@ class ConvergingScheduler : public MachineSchedStrategy {
|
||||
/// of "hazards" and other interlocks at the current cycle.
|
||||
struct SchedBoundary {
|
||||
ScheduleDAGMI *DAG;
|
||||
const TargetSchedModel *SchedModel;
|
||||
|
||||
ReadyQueue Available;
|
||||
ReadyQueue Pending;
|
||||
@ -671,13 +672,18 @@ class ConvergingScheduler : public MachineSchedStrategy {
|
||||
/// Pending queues extend the ready queues with the same ID and the
|
||||
/// PendingFlag set.
|
||||
SchedBoundary(unsigned ID, const Twine &Name):
|
||||
DAG(0), Available(ID, Name+".A"),
|
||||
DAG(0), SchedModel(0), Available(ID, Name+".A"),
|
||||
Pending(ID << ConvergingScheduler::LogMaxQID, Name+".P"),
|
||||
CheckPending(false), HazardRec(0), CurrCycle(0), IssueCount(0),
|
||||
MinReadyCycle(UINT_MAX), MaxMinLatency(0) {}
|
||||
|
||||
~SchedBoundary() { delete HazardRec; }
|
||||
|
||||
void init(ScheduleDAGMI *dag, const TargetSchedModel *smodel) {
|
||||
DAG = dag;
|
||||
SchedModel = smodel;
|
||||
}
|
||||
|
||||
bool isTop() const {
|
||||
return Available.getID() == ConvergingScheduler::TopQID;
|
||||
}
|
||||
@ -698,6 +704,7 @@ class ConvergingScheduler : public MachineSchedStrategy {
|
||||
};
|
||||
|
||||
ScheduleDAGMI *DAG;
|
||||
const TargetSchedModel *SchedModel;
|
||||
const TargetRegisterInfo *TRI;
|
||||
|
||||
// State of the top and bottom scheduled instruction boundaries.
|
||||
@ -713,7 +720,7 @@ public:
|
||||
};
|
||||
|
||||
ConvergingScheduler():
|
||||
DAG(0), TRI(0), Top(TopQID, "TopQ"), Bot(BotQID, "BotQ") {}
|
||||
DAG(0), SchedModel(0), TRI(0), Top(TopQID, "TopQ"), Bot(BotQID, "BotQ") {}
|
||||
|
||||
virtual void initialize(ScheduleDAGMI *dag);
|
||||
|
||||
@ -740,13 +747,15 @@ protected:
|
||||
|
||||
void ConvergingScheduler::initialize(ScheduleDAGMI *dag) {
|
||||
DAG = dag;
|
||||
SchedModel = DAG->getSchedModel();
|
||||
TRI = DAG->TRI;
|
||||
Top.DAG = dag;
|
||||
Bot.DAG = dag;
|
||||
Top.init(DAG, SchedModel);
|
||||
Bot.init(DAG, SchedModel);
|
||||
|
||||
// Initialize the HazardRecognizers.
|
||||
// Initialize the HazardRecognizers. If itineraries don't exist, are empty, or
|
||||
// are disabled, then these HazardRecs will be disabled.
|
||||
const InstrItineraryData *Itin = SchedModel->getInstrItineraries();
|
||||
const TargetMachine &TM = DAG->MF.getTarget();
|
||||
const InstrItineraryData *Itin = TM.getInstrItineraryData();
|
||||
Top.HazardRec = TM.getInstrInfo()->CreateTargetMIHazardRecognizer(Itin, DAG);
|
||||
Bot.HazardRec = TM.getInstrInfo()->CreateTargetMIHazardRecognizer(Itin, DAG);
|
||||
|
||||
@ -807,7 +816,8 @@ bool ConvergingScheduler::SchedBoundary::checkHazard(SUnit *SU) {
|
||||
if (HazardRec->isEnabled())
|
||||
return HazardRec->getHazardType(SU) != ScheduleHazardRecognizer::NoHazard;
|
||||
|
||||
if (IssueCount + DAG->getNumMicroOps(SU->getInstr()) > DAG->getIssueWidth())
|
||||
unsigned uops = SchedModel->getNumMicroOps(SU->getInstr());
|
||||
if (IssueCount + uops > SchedModel->getIssueWidth())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@ -828,7 +838,7 @@ void ConvergingScheduler::SchedBoundary::releaseNode(SUnit *SU,
|
||||
|
||||
/// Move the boundary of scheduled code by one cycle.
|
||||
void ConvergingScheduler::SchedBoundary::bumpCycle() {
|
||||
unsigned Width = DAG->getIssueWidth();
|
||||
unsigned Width = SchedModel->getIssueWidth();
|
||||
IssueCount = (IssueCount <= Width) ? 0 : IssueCount - Width;
|
||||
|
||||
assert(MinReadyCycle < UINT_MAX && "MinReadyCycle uninitialized");
|
||||
@ -866,8 +876,8 @@ void ConvergingScheduler::SchedBoundary::bumpNode(SUnit *SU) {
|
||||
}
|
||||
// Check the instruction group dispatch limit.
|
||||
// TODO: Check if this SU must end a dispatch group.
|
||||
IssueCount += DAG->getNumMicroOps(SU->getInstr());
|
||||
if (IssueCount >= DAG->getIssueWidth()) {
|
||||
IssueCount += SchedModel->getNumMicroOps(SU->getInstr());
|
||||
if (IssueCount >= SchedModel->getIssueWidth()) {
|
||||
DEBUG(dbgs() << "*** Max instrs at cycle " << CurrCycle << '\n');
|
||||
bumpCycle();
|
||||
}
|
||||
|
Reference in New Issue
Block a user