From: Dan Gohman Date: Thu, 20 Nov 2008 03:30:37 +0000 (+0000) Subject: Factor out the SethiUllman numbering logic from the list-burr and X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=117f3e9ee426ab7eb120b5ca1b65763baae2a824;p=oota-llvm.git Factor out the SethiUllman numbering logic from the list-burr and list-tdrr schedulers into a common base class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp index a143d351501..aecd2ce2aa2 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp @@ -1209,10 +1209,10 @@ static inline bool isCopyFromLiveIn(const SUnit *SU) { N->getOperand(N->getNumOperands()-1).getValueType() != MVT::Flag; } -/// CalcNodeBUSethiUllmanNumber - Compute Sethi Ullman number for bottom up -/// scheduling. Smaller number is the higher priority. +/// CalcNodeSethiUllmanNumber - Compute Sethi Ullman number. +/// Smaller number is the higher priority. static unsigned -CalcNodeBUSethiUllmanNumber(const SUnit *SU, std::vector &SUNumbers) { +CalcNodeSethiUllmanNumber(const SUnit *SU, std::vector &SUNumbers) { unsigned &SethiUllmanNumber = SUNumbers[SU->NodeNum]; if (SethiUllmanNumber != 0) return SethiUllmanNumber; @@ -1222,7 +1222,7 @@ CalcNodeBUSethiUllmanNumber(const SUnit *SU, std::vector &SUNumbers) { I != E; ++I) { if (I->isCtrl) continue; // ignore chain preds SUnit *PredSU = I->Dep; - unsigned PredSethiUllman = CalcNodeBUSethiUllmanNumber(PredSU, SUNumbers); + unsigned PredSethiUllman = CalcNodeSethiUllmanNumber(PredSU, SUNumbers); if (PredSethiUllman > SethiUllmanNumber) { SethiUllmanNumber = PredSethiUllman; Extra = 0; @@ -1238,47 +1238,6 @@ CalcNodeBUSethiUllmanNumber(const SUnit *SU, std::vector &SUNumbers) { return SethiUllmanNumber; } -/// CalcNodeTDSethiUllmanNumber - Compute Sethi Ullman number for top down -/// scheduling. Smaller number is the higher priority. -static unsigned -CalcNodeTDSethiUllmanNumber(const SUnit *SU, std::vector &SUNumbers) { - unsigned &SethiUllmanNumber = SUNumbers[SU->NodeNum]; - if (SethiUllmanNumber != 0) - return SethiUllmanNumber; - - unsigned Opc = SU->getNode() ? SU->getNode()->getOpcode() : 0; - if (Opc == ISD::TokenFactor || Opc == ISD::CopyToReg) - SethiUllmanNumber = 0xffff; - else if (SU->NumSuccsLeft == 0) - // If SU does not have a use, i.e. it doesn't produce a value that would - // be consumed (e.g. store), then it terminates a chain of computation. - // Give it a small SethiUllman number so it will be scheduled right before - // its predecessors that it doesn't lengthen their live ranges. - SethiUllmanNumber = 0; - else if (SU->NumPredsLeft == 0 && - (Opc != ISD::CopyFromReg || isCopyFromLiveIn(SU))) - SethiUllmanNumber = 0xffff; - else { - int Extra = 0; - for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); - I != E; ++I) { - if (I->isCtrl) continue; // ignore chain preds - SUnit *PredSU = I->Dep; - unsigned PredSethiUllman = CalcNodeTDSethiUllmanNumber(PredSU, SUNumbers); - if (PredSethiUllman > SethiUllmanNumber) { - SethiUllmanNumber = PredSethiUllman; - Extra = 0; - } else if (PredSethiUllman == SethiUllmanNumber && !I->isCtrl) - ++Extra; - } - - SethiUllmanNumber += Extra; - } - - return SethiUllmanNumber; -} - - namespace { template class VISIBILITY_HIDDEN RegReductionPriorityQueue @@ -1294,6 +1253,9 @@ namespace { const TargetRegisterInfo *TRI; ScheduleDAGRRList *scheduleDAG; + // SethiUllmanNumbers - The SethiUllman number for each node. + std::vector SethiUllmanNumbers; + public: RegReductionPriorityQueue(const TargetInstrInfo *tii, const TargetRegisterInfo *tri) : @@ -1302,69 +1264,6 @@ namespace { void initNodes(std::vector &sunits) { SUnits = &sunits; - } - - virtual void addNode(const SUnit *SU) = 0; - - virtual void updateNode(const SUnit *SU) = 0; - - virtual void releaseState() { - SUnits = 0; - } - - virtual unsigned getNodePriority(const SUnit *SU) const = 0; - - unsigned size() const { return Queue.size(); } - - bool empty() const { return Queue.empty(); } - - void push(SUnit *U) { - assert(!U->NodeQueueId && "Node in the queue already"); - U->NodeQueueId = ++currentQueueId; - Queue.push(U); - } - - void push_all(const std::vector &Nodes) { - for (unsigned i = 0, e = Nodes.size(); i != e; ++i) - push(Nodes[i]); - } - - SUnit *pop() { - if (empty()) return NULL; - SUnit *V = Queue.top(); - Queue.pop(); - V->NodeQueueId = 0; - return V; - } - - void remove(SUnit *SU) { - assert(!Queue.empty() && "Queue is empty!"); - assert(SU->NodeQueueId != 0 && "Not in queue!"); - Queue.erase_one(SU); - SU->NodeQueueId = 0; - } - - void setScheduleDAG(ScheduleDAGRRList *scheduleDag) { - scheduleDAG = scheduleDag; - } - - protected: - bool canClobber(const SUnit *SU, const SUnit *Op); - void AddPseudoTwoAddrDeps(); - }; - - class VISIBILITY_HIDDEN BURegReductionPriorityQueue - : public RegReductionPriorityQueue { - // SethiUllmanNumbers - The SethiUllman number for each node. - std::vector SethiUllmanNumbers; - - public: - BURegReductionPriorityQueue(const TargetInstrInfo *tii, - const TargetRegisterInfo *tri) - : RegReductionPriorityQueue(tii, tri) {} - - void initNodes(std::vector &sunits) { - RegReductionPriorityQueue::initNodes(sunits); // Add pseudo dependency edges for two-address nodes. AddPseudoTwoAddrDeps(); // Calculate node priorities. @@ -1375,16 +1274,16 @@ namespace { unsigned SUSize = SethiUllmanNumbers.size(); if (SUnits->size() > SUSize) SethiUllmanNumbers.resize(SUSize*2, 0); - CalcNodeBUSethiUllmanNumber(SU, SethiUllmanNumbers); + CalcNodeSethiUllmanNumber(SU, SethiUllmanNumbers); } void updateNode(const SUnit *SU) { SethiUllmanNumbers[SU->NodeNum] = 0; - CalcNodeBUSethiUllmanNumber(SU, SethiUllmanNumbers); + CalcNodeSethiUllmanNumber(SU, SethiUllmanNumbers); } void releaseState() { - RegReductionPriorityQueue::releaseState(); + SUnits = 0; SethiUllmanNumbers.clear(); } @@ -1418,55 +1317,52 @@ namespace { else return SethiUllmanNumbers[SU->NodeNum]; } + + unsigned size() const { return Queue.size(); } - private: - void CalculateSethiUllmanNumbers(); - }; - - - class VISIBILITY_HIDDEN TDRegReductionPriorityQueue - : public RegReductionPriorityQueue { - // SethiUllmanNumbers - The SethiUllman number for each node. - std::vector SethiUllmanNumbers; - - public: - TDRegReductionPriorityQueue(const TargetInstrInfo *tii, - const TargetRegisterInfo *tri) - : RegReductionPriorityQueue(tii, tri) {} - - void initNodes(std::vector &sunits) { - RegReductionPriorityQueue::initNodes(sunits); - // Add pseudo dependency edges for two-address nodes. - AddPseudoTwoAddrDeps(); - // Calculate node priorities. - CalculateSethiUllmanNumbers(); + bool empty() const { return Queue.empty(); } + + void push(SUnit *U) { + assert(!U->NodeQueueId && "Node in the queue already"); + U->NodeQueueId = ++currentQueueId; + Queue.push(U); } - void addNode(const SUnit *SU) { - unsigned SUSize = SethiUllmanNumbers.size(); - if (SUnits->size() > SUSize) - SethiUllmanNumbers.resize(SUSize*2, 0); - CalcNodeTDSethiUllmanNumber(SU, SethiUllmanNumbers); + void push_all(const std::vector &Nodes) { + for (unsigned i = 0, e = Nodes.size(); i != e; ++i) + push(Nodes[i]); } - - void updateNode(const SUnit *SU) { - SethiUllmanNumbers[SU->NodeNum] = 0; - CalcNodeTDSethiUllmanNumber(SU, SethiUllmanNumbers); + + SUnit *pop() { + if (empty()) return NULL; + SUnit *V = Queue.top(); + Queue.pop(); + V->NodeQueueId = 0; + return V; } - void releaseState() { - RegReductionPriorityQueue::releaseState(); - SethiUllmanNumbers.clear(); + void remove(SUnit *SU) { + assert(!Queue.empty() && "Queue is empty!"); + assert(SU->NodeQueueId != 0 && "Not in queue!"); + Queue.erase_one(SU); + SU->NodeQueueId = 0; } - unsigned getNodePriority(const SUnit *SU) const { - assert(SU->NodeNum < SethiUllmanNumbers.size()); - return SethiUllmanNumbers[SU->NodeNum]; + void setScheduleDAG(ScheduleDAGRRList *scheduleDag) { + scheduleDAG = scheduleDag; } - private: + protected: + bool canClobber(const SUnit *SU, const SUnit *Op); + void AddPseudoTwoAddrDeps(); void CalculateSethiUllmanNumbers(); }; + + typedef RegReductionPriorityQueue + BURegReductionPriorityQueue; + + typedef RegReductionPriorityQueue + TDRegReductionPriorityQueue; } /// closestSucc - Returns the scheduled cycle of the successor which is @@ -1701,11 +1597,12 @@ void RegReductionPriorityQueue::AddPseudoTwoAddrDeps() { /// CalculateSethiUllmanNumbers - Calculate Sethi-Ullman numbers of all /// scheduling units. -void BURegReductionPriorityQueue::CalculateSethiUllmanNumbers() { +template +void RegReductionPriorityQueue::CalculateSethiUllmanNumbers() { SethiUllmanNumbers.assign(SUnits->size(), 0); for (unsigned i = 0, e = SUnits->size(); i != e; ++i) - CalcNodeBUSethiUllmanNumber(&(*SUnits)[i], SethiUllmanNumbers); + CalcNodeSethiUllmanNumber(&(*SUnits)[i], SethiUllmanNumbers); } /// LimitedSumOfUnscheduledPredsOfSuccs - Compute the sum of the unscheduled @@ -1771,15 +1668,6 @@ bool td_ls_rr_sort::operator()(const SUnit *left, const SUnit *right) const { return (left->NodeQueueId > right->NodeQueueId); } -/// CalculateSethiUllmanNumbers - Calculate Sethi-Ullman numbers of all -/// scheduling units. -void TDRegReductionPriorityQueue::CalculateSethiUllmanNumbers() { - SethiUllmanNumbers.assign(SUnits->size(), 0); - - for (unsigned i = 0, e = SUnits->size(); i != e; ++i) - CalcNodeTDSethiUllmanNumber(&(*SUnits)[i], SethiUllmanNumbers); -} - //===----------------------------------------------------------------------===// // Public Constructor Functions //===----------------------------------------------------------------------===//