HexagonMachineScheduler.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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 17a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/PriorityQueue.h" 18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Analysis/AliasAnalysis.h" 193e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/LiveIntervalAnalysis.h" 203e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/MachineScheduler.h" 213e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/Passes.h" 223e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterClassInfo.h" 233e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterPressure.h" 243e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ResourcePriorityQueue.h" 253e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleDAGInstrs.h" 263e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleHazardRecognizer.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" 31a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetInstrInfo.h" 323e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 333e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinusing namespace llvm; 343e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 353e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinnamespace llvm { 363e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 377ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin// ConvergingVLIWScheduler - Implementation of the standard 387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin// MachineSchedStrategy. 393e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin//===----------------------------------------------------------------------===// 403e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 413e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinclass VLIWResourceModel { 423e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// ResourcesModel - Represents VLIW state. 433e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Not limited to VLIW targets per say, but assumes 443e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// definition of DFA by a target. 453e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin DFAPacketizer *ResourcesModel; 463e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 47412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick const TargetSchedModel *SchedModel; 483e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 493e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Local packet/bundle model. Purely 503e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// internal to the MI schedulre at the time. 513e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin std::vector<SUnit*> Packet; 523e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 533e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Total packets created. 543e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin unsigned TotalPackets; 553e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 563e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinpublic: 57412cd2f81374865dfa708bef6d5b896ca10dece0Andrew TrickVLIWResourceModel(const TargetMachine &TM, const TargetSchedModel *SM) : 58412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick SchedModel(SM), TotalPackets(0) { 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ResourcesModel = TM.getInstrInfo()->CreateTargetScheduleState(&TM, nullptr); 603e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 617ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // This hard requirement could be relaxed, 627ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // but for now do not let it proceed. 637ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin assert(ResourcesModel && "Unimplemented CreateTargetScheduleState."); 647ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 65412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick Packet.resize(SchedModel->getIssueWidth()); 663e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin Packet.clear(); 673e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ResourcesModel->clearResources(); 683e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 693e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 703e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ~VLIWResourceModel() { 713e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin delete ResourcesModel; 723e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 733e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 743e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin void resetPacketState() { 753e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin Packet.clear(); 763e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 773e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 783e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin void resetDFA() { 793e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin ResourcesModel->clearResources(); 803e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 813e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 827ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void reset() { 837ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Packet.clear(); 847ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ResourcesModel->clearResources(); 857ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 867ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 873e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin bool isResourceAvailable(SUnit *SU); 887ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool reserveResources(SUnit *SU); 893e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin unsigned getTotalPackets() const { return TotalPackets; } 903e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin}; 913e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 9278e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// Extend the standard ScheduleDAGMI to provide more context and override the 9378e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// top-level schedule() driver. 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass VLIWMachineScheduler : public ScheduleDAGMILive { 953e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinpublic: 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines VLIWMachineScheduler(MachineSchedContext *C, 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<MachineSchedStrategy> S) 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : ScheduleDAGMILive(C, std::move(S)) {} 993e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 1003e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's 1013e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin /// time to do some work. 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void schedule() override; 103c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin /// Perform platform specific DAG postprocessing. 104c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin void postprocessDAG(); 1053e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin}; 1067ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1077ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin/// ConvergingVLIWScheduler shrinks the unscheduled zone using heuristics 1087ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin/// to balance the schedule. 1097ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinclass ConvergingVLIWScheduler : public MachineSchedStrategy { 1107ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1117ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Store the state used by ConvergingVLIWScheduler heuristics, required 1127ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// for the lifetime of one invocation of pickNode(). 1137ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin struct SchedCandidate { 1147ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // The best SUnit candidate. 1157ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *SU; 1167ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1177ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Register pressure values for the best candidate. 1187ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin RegPressureDelta RPDelta; 1197ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1207ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Best scheduling cost. 1217ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin int SCost; 1227ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SchedCandidate(): SU(nullptr), SCost(0) {} 1247ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 1257ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Represent the type of SchedCandidate found within a single queue. 1267ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin enum CandResult { 1277ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin NoCand, NodeOrder, SingleExcess, SingleCritical, SingleMax, MultiPressure, 1287ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin BestCost}; 1297ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1307ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Each Scheduling boundary is associated with ready queues. It tracks the 1317ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// current cycle in whichever direction at has moved, and maintains the state 1327ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// of "hazards" and other interlocks at the current cycle. 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct VLIWSchedBoundary { 1347ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWMachineScheduler *DAG; 135412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick const TargetSchedModel *SchedModel; 1367ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1377ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ReadyQueue Available; 1387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ReadyQueue Pending; 1397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool CheckPending; 1407ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1417ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin ScheduleHazardRecognizer *HazardRec; 1427ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWResourceModel *ResourceModel; 1437ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1447ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned CurrCycle; 1457ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned IssueCount; 1467ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1477ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// MinReadyCycle - Cycle of the soonest available instruction. 1487ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned MinReadyCycle; 1497ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1507ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // Remember the greatest min operand latency. 1517ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin unsigned MaxMinLatency; 1527ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1537ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// Pending queues extend the ready queues with the same ID and the 1547ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// PendingFlag set. 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VLIWSchedBoundary(unsigned ID, const Twine &Name): 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DAG(nullptr), SchedModel(nullptr), Available(ID, Name+".A"), 1577ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin Pending(ID << ConvergingVLIWScheduler::LogMaxQID, Name+".P"), 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CheckPending(false), HazardRec(nullptr), ResourceModel(nullptr), 1597ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin CurrCycle(0), IssueCount(0), 1607ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin MinReadyCycle(UINT_MAX), MaxMinLatency(0) {} 1617ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ~VLIWSchedBoundary() { 1637ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin delete ResourceModel; 1647ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin delete HazardRec; 1657ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 1667ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 167412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick void init(VLIWMachineScheduler *dag, const TargetSchedModel *smodel) { 168412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick DAG = dag; 169412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick SchedModel = smodel; 170412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick } 171412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick 1727ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool isTop() const { 1737ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin return Available.getID() == ConvergingVLIWScheduler::TopQID; 1747ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin } 1757ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1767ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin bool checkHazard(SUnit *SU); 1777ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1787ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void releaseNode(SUnit *SU, unsigned ReadyCycle); 1797ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1807ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void bumpCycle(); 1817ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1827ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void bumpNode(SUnit *SU); 1837ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1847ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void releasePending(); 1857ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1867ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void removeReady(SUnit *SU); 1877ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1887ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *pickOnlyChoice(); 1897ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 1907ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1917ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin VLIWMachineScheduler *DAG; 192412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick const TargetSchedModel *SchedModel; 1937ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1947ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin // State of the top and bottom scheduled instruction boundaries. 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VLIWSchedBoundary Top; 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines VLIWSchedBoundary Bot; 1977ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 1987ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinpublic: 1997ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin /// SUnit::NodeQueueId: 0 (none), 1 (top), 2 (bot), 3 (both) 2007ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin enum { 2017ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin TopQID = 1, 2027ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin BotQID = 2, 2037ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin LogMaxQID = 2 2047ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin }; 2057ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ConvergingVLIWScheduler() 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : DAG(nullptr), SchedModel(nullptr), Top(TopQID, "TopQ"), 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Bot(BotQID, "BotQ") {} 2097ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void initialize(ScheduleDAGMI *dag) override; 2117ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual SUnit *pickNode(bool &IsTopNode) override; 2137ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void schedNode(SUnit *SU, bool IsTopNode) override; 2157ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void releaseTopNode(SUnit *SU) override; 2177ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void releaseBottomNode(SUnit *SU) override; 2197ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 220c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin unsigned ReportPackets() { 221c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin return Top.ResourceModel->getTotalPackets() + 222c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin Bot.ResourceModel->getTotalPackets(); 223c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin } 224c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin 2257ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinprotected: 2267ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *pickNodeBidrectional(bool &IsTopNode); 2277ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2287ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin int SchedulingCost(ReadyQueue &Q, 2297ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SUnit *SU, SchedCandidate &Candidate, 2307ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin RegPressureDelta &Delta, bool verbose); 2317ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2327ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin CandResult pickNodeFromQueue(ReadyQueue &Q, 2337ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin const RegPressureTracker &RPTracker, 2347ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin SchedCandidate &Candidate); 2357ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#ifndef NDEBUG 2367ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin void traceCandidate(const char *Label, const ReadyQueue &Q, SUnit *SU, 2374c60b8a78d811a5b16ae45f6957933fb479bab58Andrew Trick PressureChange P = PressureChange()); 2387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#endif 2397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin}; 2407ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin 2413e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} // namespace 2423e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 2433e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 2443e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#endif 245