blob: 16d5d939708cc49f2327ac278bd8438d1dbf540b [file] [log] [blame]
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +00001//===-- R600MachineScheduler.h - R600 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/// \file
11/// \brief R600 Machine Scheduler interface
12//
13//===----------------------------------------------------------------------===//
14
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015#ifndef LLVM_LIB_TARGET_AMDGPU_R600MACHINESCHEDULER_H
16#define LLVM_LIB_TARGET_AMDGPU_R600MACHINESCHEDULER_H
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000017
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000018#include "llvm/CodeGen/MachineScheduler.h"
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000019
20using namespace llvm;
21
22namespace llvm {
23
Matt Arsenault43e92fe2016-06-24 06:30:11 +000024class R600InstrInfo;
25struct R600RegisterInfo;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000026
Matt Arsenault43e92fe2016-06-24 06:30:11 +000027class R600SchedStrategy final : public MachineSchedStrategy {
Andrew Trickd7f890e2013-12-28 21:56:47 +000028 const ScheduleDAGMILive *DAG;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000029 const R600InstrInfo *TII;
30 const R600RegisterInfo *TRI;
31 MachineRegisterInfo *MRI;
32
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000033 enum InstKind {
34 IDAlu,
35 IDFetch,
36 IDOther,
37 IDLast
38 };
39
40 enum AluKind {
41 AluAny,
42 AluT_X,
43 AluT_Y,
44 AluT_Z,
45 AluT_W,
46 AluT_XYZW,
Vincent Lejeune3d5118c2013-05-17 16:50:56 +000047 AluPredX,
Vincent Lejeune77a83522013-06-29 19:32:43 +000048 AluTrans,
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000049 AluDiscarded, // LLVM Instructions that are going to be eliminated
50 AluLast
51 };
52
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000053 std::vector<SUnit *> Available[IDLast], Pending[IDLast];
54 std::vector<SUnit *> AvailableAlus[AluLast];
Vincent Lejeune4b5b8492013-06-05 20:27:35 +000055 std::vector<SUnit *> PhysicalRegCopy;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000056
57 InstKind CurInstKind;
58 int CurEmitted;
59 InstKind NextInstKind;
60
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000061 unsigned AluInstCount;
62 unsigned FetchInstCount;
63
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000064 int InstKindLimit[IDLast];
65
66 int OccupedSlotsMask;
67
68public:
69 R600SchedStrategy() :
Craig Toppere73658d2014-04-28 04:05:08 +000070 DAG(nullptr), TII(nullptr), TRI(nullptr), MRI(nullptr) {
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000071 }
72
Craig Topper5656db42014-04-29 07:57:24 +000073 virtual ~R600SchedStrategy() {}
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000074
Craig Topper5656db42014-04-29 07:57:24 +000075 void initialize(ScheduleDAGMI *dag) override;
76 SUnit *pickNode(bool &IsTopNode) override;
77 void schedNode(SUnit *SU, bool IsTopNode) override;
78 void releaseTopNode(SUnit *SU) override;
79 void releaseBottomNode(SUnit *SU) override;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000080
81private:
Vincent Lejeune0a22bc42013-03-14 15:50:45 +000082 std::vector<MachineInstr *> InstructionsGroupCandidate;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000083 bool VLIW5;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000084
85 int getInstKind(SUnit *SU);
86 bool regBelongsToClass(unsigned Reg, const TargetRegisterClass *RC) const;
87 AluKind getAluKind(SUnit *SU) const;
88 void LoadAlu();
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000089 unsigned AvailablesAluCount() const;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000090 SUnit *AttemptFillSlot (unsigned Slot, bool AnyAlu);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000091 void PrepareNextSlot();
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000092 SUnit *PopInst(std::vector<SUnit*> &Q, bool AnyALU);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000093
94 void AssignSlot(MachineInstr *MI, unsigned Slot);
95 SUnit* pickAlu();
96 SUnit* pickOther(int QID);
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000097 void MoveUnits(std::vector<SUnit *> &QSrc, std::vector<SUnit *> &QDst);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000098};
99
100} // namespace llvm
101
102#endif /* R600MACHINESCHEDULER_H_ */