HexagonMachineScheduler.h revision 4c60b8a78d811a5b16ae45f6957933fb479bab58
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/OwningPtr.h"
18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/PriorityQueue.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Analysis/AliasAnalysis.h"
203e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/LiveIntervalAnalysis.h"
213e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/MachineScheduler.h"
223e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/Passes.h"
233e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterClassInfo.h"
243e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/RegisterPressure.h"
253e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ResourcePriorityQueue.h"
263e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleDAGInstrs.h"
273e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
283e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/CommandLine.h"
293e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/Debug.h"
303e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/ErrorHandling.h"
313e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "llvm/Support/raw_ostream.h"
32a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetInstrInfo.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
48412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick  const TargetSchedModel *SchedModel;
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:
58412cd2f81374865dfa708bef6d5b896ca10dece0Andrew TrickVLIWResourceModel(const TargetMachine &TM, const TargetSchedModel *SM) :
59412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick    SchedModel(SM), TotalPackets(0) {
603e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    ResourcesModel = TM.getInstrInfo()->CreateTargetScheduleState(&TM,NULL);
613e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
627ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    // This hard requirement could be relaxed,
637ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    // but for now do not let it proceed.
647ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    assert(ResourcesModel && "Unimplemented CreateTargetScheduleState.");
657ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
66412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick    Packet.resize(SchedModel->getIssueWidth());
673e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    Packet.clear();
683e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    ResourcesModel->clearResources();
693e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  }
703e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
713e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  ~VLIWResourceModel() {
723e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    delete ResourcesModel;
733e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  }
743e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
753e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  void resetPacketState() {
763e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    Packet.clear();
773e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  }
783e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
793e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  void resetDFA() {
803e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin    ResourcesModel->clearResources();
813e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  }
823e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
837ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  void reset() {
847ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    Packet.clear();
857ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    ResourcesModel->clearResources();
867ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  }
877ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
883e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  bool isResourceAvailable(SUnit *SU);
897ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  bool reserveResources(SUnit *SU);
903e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  unsigned getTotalPackets() const { return TotalPackets; }
913e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin};
923e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
9378e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// Extend the standard ScheduleDAGMI to provide more context and override the
9478e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick/// top-level schedule() driver.
9578e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trickclass VLIWMachineScheduler : public ScheduleDAGMI {
963e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinpublic:
973e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  VLIWMachineScheduler(MachineSchedContext *C, MachineSchedStrategy *S):
98e5c4fe568e91a3f6571b3cf32ef4718515628a64Benjamin Kramer    ScheduleDAGMI(C, S) {}
993e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
1003e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  /// Schedule - This is called back from ScheduleDAGInstrs::Run() when it's
1013e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin  /// time to do some work.
10278e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick  virtual void schedule();
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
1237ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    SchedCandidate(): SU(NULL), 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.
1337ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  struct SchedBoundary {
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.
1557ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    SchedBoundary(unsigned ID, const Twine &Name):
156412cd2f81374865dfa708bef6d5b896ca10dece0Andrew Trick      DAG(0), SchedModel(0), Available(ID, Name+".A"),
1577ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin      Pending(ID << ConvergingVLIWScheduler::LogMaxQID, Name+".P"),
1587ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin      CheckPending(false), HazardRec(0), ResourceModel(0),
1597ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin      CurrCycle(0), IssueCount(0),
1607ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin      MinReadyCycle(UINT_MAX), MaxMinLatency(0) {}
1617ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
1627ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin    ~SchedBoundary() {
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.
1957ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  SchedBoundary Top;
1967ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  SchedBoundary 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
2067ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  ConvergingVLIWScheduler():
20754a56fad36a32f12709da5f96998336f08524be9Bill Wendling    DAG(0), SchedModel(0), Top(TopQID, "TopQ"), Bot(BotQID, "BotQ") {}
2087ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
20978e5efe1b202f71975ad93f33b1fda21d83fd1fbAndrew Trick  virtual void initialize(ScheduleDAGMI *dag);
2107ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2117ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  virtual SUnit *pickNode(bool &IsTopNode);
2127ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2137ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  virtual void schedNode(SUnit *SU, bool IsTopNode);
2147ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2157ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  virtual void releaseTopNode(SUnit *SU);
2167ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2177ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  virtual void releaseBottomNode(SUnit *SU);
2187ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
219c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin  unsigned ReportPackets() {
220c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin    return Top.ResourceModel->getTotalPackets() +
221c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin           Bot.ResourceModel->getTotalPackets();
222c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin  }
223c6a6660c6271d3309379ff439f66eb0e6ad48e3aSergei Larin
2247ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larinprotected:
2257ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  SUnit *pickNodeBidrectional(bool &IsTopNode);
2267ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2277ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  int SchedulingCost(ReadyQueue &Q,
2287ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin                     SUnit *SU, SchedCandidate &Candidate,
2297ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin                     RegPressureDelta &Delta, bool verbose);
2307ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2317ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  CandResult pickNodeFromQueue(ReadyQueue &Q,
2327ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin                               const RegPressureTracker &RPTracker,
2337ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin                               SchedCandidate &Candidate);
2347ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#ifndef NDEBUG
2357ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin  void traceCandidate(const char *Label, const ReadyQueue &Q, SUnit *SU,
2364c60b8a78d811a5b16ae45f6957933fb479bab58Andrew Trick                      PressureChange P = PressureChange());
2377ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin#endif
2387ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin};
2397ae51be2a3a56be5cf0ee4557aa13a069c96a241Sergei Larin
2403e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} // namespace
2413e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
2423e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin
2433e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#endif
244