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;
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// 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