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