]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/SystemZ/SystemZMachineScheduler.h
Merge ACPICA 20180105.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / SystemZ / SystemZMachineScheduler.h
1 //==- SystemZMachineScheduler.h - SystemZ Scheduler Interface ----*- C++ -*-==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // -------------------------- Post RA scheduling ---------------------------- //
11 // SystemZPostRASchedStrategy is a scheduling strategy which is plugged into
12 // the MachineScheduler. It has a sorted Available set of SUs and a pickNode()
13 // implementation that looks to optimize decoder grouping and balance the
14 // usage of processor resources.
15 //===----------------------------------------------------------------------===//
16
17 #include "SystemZHazardRecognizer.h"
18 #include "llvm/CodeGen/MachineScheduler.h"
19 #include "llvm/CodeGen/ScheduleDAG.h"
20 #include <set>
21
22 #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
23 #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H
24
25 using namespace llvm;
26
27 namespace llvm {
28   
29 /// A MachineSchedStrategy implementation for SystemZ post RA scheduling.
30 class SystemZPostRASchedStrategy : public MachineSchedStrategy {
31   ScheduleDAGMI *DAG;
32   
33   /// A candidate during instruction evaluation.
34   struct Candidate {
35     SUnit *SU = nullptr;
36
37     /// The decoding cost.
38     int GroupingCost = 0;
39
40     /// The processor resources cost.
41     int ResourcesCost = 0;
42
43     Candidate() = default;
44     Candidate(SUnit *SU_, SystemZHazardRecognizer &HazardRec);
45
46     // Compare two candidates.
47     bool operator<(const Candidate &other);
48
49     // Check if this node is free of cost ("as good as any").
50     bool noCost() const {
51       return (GroupingCost <= 0 && !ResourcesCost);
52     }
53   };
54
55   // A sorter for the Available set that makes sure that SUs are considered
56   // in the best order.
57   struct SUSorter {
58     bool operator() (SUnit *lhs, SUnit *rhs) const {
59       if (lhs->isScheduleHigh && !rhs->isScheduleHigh)
60         return true;
61       if (!lhs->isScheduleHigh && rhs->isScheduleHigh)
62         return false;
63
64       if (lhs->getHeight() > rhs->getHeight())
65         return true;
66       else if (lhs->getHeight() < rhs->getHeight())
67         return false;
68
69       return (lhs->NodeNum < rhs->NodeNum);
70     }
71   };
72   // A set of SUs with a sorter and dump method.
73   struct SUSet : std::set<SUnit*, SUSorter> {
74     #ifndef NDEBUG
75     void dump(SystemZHazardRecognizer &HazardRec) const;
76     #endif
77   };
78
79   /// The set of available SUs to schedule next.
80   SUSet Available;
81
82   // HazardRecognizer that tracks the scheduler state for the current
83   // region.
84   SystemZHazardRecognizer HazardRec;
85   
86 public:
87   SystemZPostRASchedStrategy(const MachineSchedContext *C);
88
89   /// PostRA scheduling does not track pressure.
90   bool shouldTrackPressure() const override { return false; }
91
92   /// Initialize the strategy after building the DAG for a new region.
93   void initialize(ScheduleDAGMI *dag) override;
94
95   /// Pick the next node to schedule, or return NULL.
96   SUnit *pickNode(bool &IsTopNode) override;
97
98   /// ScheduleDAGMI has scheduled an instruction - tell HazardRec
99   /// about it.
100   void schedNode(SUnit *SU, bool IsTopNode) override;
101
102   /// SU has had all predecessor dependencies resolved. Put it into
103   /// Available.
104   void releaseTopNode(SUnit *SU) override;
105
106   /// Currently only scheduling top-down, so this method is empty.
107   void releaseBottomNode(SUnit *SU) override {};
108 };
109
110 } // end namespace llvm
111
112 #endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZMACHINESCHEDULER_H