HexagonMachineScheduler.h revision c6a6660c6271d3309379ff439f66eb0e6ad48e3a
13e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===-- HexagonMachineScheduler.h - Custom Hexagon MI scheduler. ----===// 23e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// 33e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// The LLVM Compiler Infrastructure 43e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// 53e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// This file is distributed under the University of Illinois Open Source 63e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// License. See LICENSE.TXT for details. 73e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// 83e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 93e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// 103e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// Custom Hexagon MI scheduler. 113e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin// 123e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 133e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 143e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#ifndef HEXAGONASMPRINTER_H 153e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#define HEXAGONASMPRINTER_H 163e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 173e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/LiveIntervalAnalysis.h" 183e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/MachineScheduler.h" 193e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/Passes.h" 203e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterClassInfo.h" 213e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterPressure.h" 223e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ResourcePriorityQueue.h" 233e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleDAGInstrs.h" 243e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleHazardRecognizer.h" 253e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Analysis/AliasAnalysis.h" 263e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Target/TargetInstrInfo.h" 273e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/CommandLine.h" 283e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/Debug.h" 293e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/ErrorHandling.h" 303e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/raw_ostream.h" 313e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/ADT/OwningPtr.h" 323e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/ADT/PriorityQueue.h" 333e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 343e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinusing namespace llvm; 353e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 363e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinnamespace llvm { 373e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin// ConvergingVLIWScheduler - Implementation of the standard 397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin// MachineSchedStrategy. 403e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 413e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 423e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinclass VLIWResourceModel { 433e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// ResourcesModel - Represents VLIW state. 443e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Not limited to VLIW targets per say, but assumes 453e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// definition of DFA by a target. 463e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin DFAPacketizer *ResourcesModel; 473e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 483e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin const InstrItineraryData *InstrItins; 493e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 503e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Local packet/bundle model. Purely 513e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// internal to the MI schedulre at the time. 523e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin std::vector<SUnit*> Packet; 533e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 543e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Total packets created. 553e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin unsigned TotalPackets; 563e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 573e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinpublic: 583e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin VLIWResourceModel(MachineSchedContext *C, const InstrItineraryData *IID) : 593e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin InstrItins(IID), TotalPackets(0) { 603e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin const TargetMachine &TM = C->MF->getTarget(); 613e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ResourcesModel = TM.getInstrInfo()->CreateTargetScheduleState(&TM,NULL); 623e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 637ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // This hard requirement could be relaxed, 647ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // but for now do not let it proceed. 657ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin assert(ResourcesModel && "Unimplemented CreateTargetScheduleState."); 667ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 677ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Packet.resize(InstrItins->SchedModel->IssueWidth); 687ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Packet.clear(); 697ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ResourcesModel->clearResources(); 707ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 717ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 727ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWResourceModel(const TargetMachine &TM) : 737ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin InstrItins(TM.getInstrItineraryData()), TotalPackets(0) { 747ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ResourcesModel = TM.getInstrInfo()->CreateTargetScheduleState(&TM,NULL); 757ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 767ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // This hard requirement could be relaxed, 777ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // but for now do not let it proceed. 783e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin assert(ResourcesModel && "Unimplemented CreateTargetScheduleState."); 793e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 803e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin Packet.resize(InstrItins->SchedModel->IssueWidth); 813e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin Packet.clear(); 823e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ResourcesModel->clearResources(); 833e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 843e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 853e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ~VLIWResourceModel() { 863e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin delete ResourcesModel; 873e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 883e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 893e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin void resetPacketState() { 903e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin Packet.clear(); 913e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 923e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 933e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin void resetDFA() { 943e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ResourcesModel->clearResources(); 953e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 963e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 977ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void reset() { 987ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Packet.clear(); 997ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ResourcesModel->clearResources(); 1007ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 1017ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1023e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin bool isResourceAvailable(SUnit *SU); 1037ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool reserveResources(SUnit *SU); 1043e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin unsigned getTotalPackets() const { return TotalPackets; } 1053e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin}; 1063e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 10778e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// Extend the standard ScheduleDAGMI to provide more context and override the 10878e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// top-level schedule() driver. 10978e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trickclass VLIWMachineScheduler : public ScheduleDAGMI { 1103e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinpublic: 1113e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin VLIWMachineScheduler(MachineSchedContext *C, MachineSchedStrategy *S): 112e5c4fe568e91a3f6571b3cf32ef4718515628a64Benjamin Kramer ScheduleDAGMI(C, S) {} 1133e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 1143e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's 1153e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// time to do some work. 11678e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick virtual void schedule(); 117c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin /// Perform platform specific DAG postprocessing. 118c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin void postprocessDAG(); 1193e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin}; 1207ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1217ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin/// ConvergingVLIWScheduler shrinks the unscheduled zone using heuristics 1227ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin/// to balance the schedule. 1237ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinclass ConvergingVLIWScheduler : public MachineSchedStrategy { 1247ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1257ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Store the state used by ConvergingVLIWScheduler heuristics, required 1267ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// for the lifetime of one invocation of pickNode(). 1277ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin struct SchedCandidate { 1287ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // The best SUnit candidate. 1297ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *SU; 1307ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1317ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Register pressure values for the best candidate. 1327ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin RegPressureDelta RPDelta; 1337ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1347ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Best scheduling cost. 1357ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin int SCost; 1367ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1377ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedCandidate(): SU(NULL), SCost(0) {} 1387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 1397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Represent the type of SchedCandidate found within a single queue. 1407ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin enum CandResult { 1417ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin NoCand, NodeOrder, SingleExcess, SingleCritical, SingleMax, MultiPressure, 1427ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin BestCost}; 1437ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1447ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Each Scheduling boundary is associated with ready queues. It tracks the 1457ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// current cycle in whichever direction at has moved, and maintains the state 1467ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// of "hazards" and other interlocks at the current cycle. 1477ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin struct SchedBoundary { 1487ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWMachineScheduler *DAG; 1497ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1507ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ReadyQueue Available; 1517ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ReadyQueue Pending; 1527ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool CheckPending; 1537ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1547ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ScheduleHazardRecognizer *HazardRec; 1557ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWResourceModel *ResourceModel; 1567ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1577ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned CurrCycle; 1587ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned IssueCount; 1597ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1607ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// MinReadyCycle - Cycle of the soonest available instruction. 1617ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned MinReadyCycle; 1627ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1637ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Remember the greatest min operand latency. 1647ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned MaxMinLatency; 1657ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1667ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Pending queues extend the ready queues with the same ID and the 1677ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// PendingFlag set. 1687ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedBoundary(unsigned ID, const Twine &Name): 1697ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin DAG(0), Available(ID, Name+".A"), 1707ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Pending(ID << ConvergingVLIWScheduler::LogMaxQID, Name+".P"), 1717ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin CheckPending(false), HazardRec(0), ResourceModel(0), 1727ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin CurrCycle(0), IssueCount(0), 1737ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin MinReadyCycle(UINT_MAX), MaxMinLatency(0) {} 1747ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1757ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ~SchedBoundary() { 1767ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin delete ResourceModel; 1777ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin delete HazardRec; 1787ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 1797ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1807ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool isTop() const { 1817ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin return Available.getID() == ConvergingVLIWScheduler::TopQID; 1827ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 1837ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1847ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool checkHazard(SUnit *SU); 1857ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1867ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void releaseNode(SUnit *SU, unsigned ReadyCycle); 1877ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1887ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void bumpCycle(); 1897ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1907ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void bumpNode(SUnit *SU); 1917ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1927ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void releasePending(); 1937ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1947ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void removeReady(SUnit *SU); 1957ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1967ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *pickOnlyChoice(); 1977ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 1987ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1997ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWMachineScheduler *DAG; 2007ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin const TargetRegisterInfo *TRI; 2017ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2027ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // State of the top and bottom scheduled instruction boundaries. 2037ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedBoundary Top; 2047ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedBoundary Bot; 2057ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2067ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinpublic: 2077ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// SUnit::NodeQueueId: 0 (none), 1 (top), 2 (bot), 3 (both) 2087ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin enum { 2097ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin TopQID = 1, 2107ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin BotQID = 2, 2117ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin LogMaxQID = 2 2127ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 2137ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2147ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ConvergingVLIWScheduler(): 2157ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin DAG(0), TRI(0), Top(TopQID, "TopQ"), Bot(BotQID, "BotQ") {} 2167ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21778e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick virtual void initialize(ScheduleDAGMI *dag); 2187ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2197ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin virtual SUnit *pickNode(bool &IsTopNode); 2207ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2217ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin virtual void schedNode(SUnit *SU, bool IsTopNode); 2227ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2237ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin virtual void releaseTopNode(SUnit *SU); 2247ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2257ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin virtual void releaseBottomNode(SUnit *SU); 2267ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 227c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin unsigned ReportPackets() { 228c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin return Top.ResourceModel->getTotalPackets() + 229c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin Bot.ResourceModel->getTotalPackets(); 230c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin } 231c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin 2327ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinprotected: 2337ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *pickNodeBidrectional(bool &IsTopNode); 2347ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2357ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin int SchedulingCost(ReadyQueue &Q, 2367ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *SU, SchedCandidate &Candidate, 2377ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin RegPressureDelta &Delta, bool verbose); 2387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin CandResult pickNodeFromQueue(ReadyQueue &Q, 2407ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin const RegPressureTracker &RPTracker, 2417ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedCandidate &Candidate); 2427ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#ifndef NDEBUG 2437ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void traceCandidate(const char *Label, const ReadyQueue &Q, SUnit *SU, 2447ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin PressureElement P = PressureElement()); 2457ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#endif 2467ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin}; 2477ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2483e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} // namespace 2493e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 2503e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 2513e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#endif 252