blob: 8a9a8d3d1e238f1e6f24d1cdec9f87266c077574 [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
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// R600 Machine Scheduler interface
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000012//
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"
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000019#include <vector>
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000020
21using namespace llvm;
22
23namespace llvm {
24
Matt Arsenault43e92fe2016-06-24 06:30:11 +000025class R600InstrInfo;
26struct R600RegisterInfo;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000027
Matt Arsenault43e92fe2016-06-24 06:30:11 +000028class R600SchedStrategy final : public MachineSchedStrategy {
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000029 const ScheduleDAGMILive *DAG = nullptr;
30 const R600InstrInfo *TII = nullptr;
31 const R600RegisterInfo *TRI = nullptr;
32 MachineRegisterInfo *MRI = nullptr;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000033
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000034 enum InstKind {
35 IDAlu,
36 IDFetch,
37 IDOther,
38 IDLast
39 };
40
41 enum AluKind {
42 AluAny,
43 AluT_X,
44 AluT_Y,
45 AluT_Z,
46 AluT_W,
47 AluT_XYZW,
Vincent Lejeune3d5118c2013-05-17 16:50:56 +000048 AluPredX,
Vincent Lejeune77a83522013-06-29 19:32:43 +000049 AluTrans,
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000050 AluDiscarded, // LLVM Instructions that are going to be eliminated
51 AluLast
52 };
53
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000054 std::vector<SUnit *> Available[IDLast], Pending[IDLast];
55 std::vector<SUnit *> AvailableAlus[AluLast];
Vincent Lejeune4b5b8492013-06-05 20:27:35 +000056 std::vector<SUnit *> PhysicalRegCopy;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000057
58 InstKind CurInstKind;
59 int CurEmitted;
60 InstKind NextInstKind;
61
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000062 unsigned AluInstCount;
63 unsigned FetchInstCount;
64
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000065 int InstKindLimit[IDLast];
66
67 int OccupedSlotsMask;
68
69public:
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000070 R600SchedStrategy() = default;
71 ~R600SchedStrategy() override = default;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000072
Craig Topper5656db42014-04-29 07:57:24 +000073 void initialize(ScheduleDAGMI *dag) override;
74 SUnit *pickNode(bool &IsTopNode) override;
75 void schedNode(SUnit *SU, bool IsTopNode) override;
76 void releaseTopNode(SUnit *SU) override;
77 void releaseBottomNode(SUnit *SU) override;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000078
79private:
Vincent Lejeune0a22bc42013-03-14 15:50:45 +000080 std::vector<MachineInstr *> InstructionsGroupCandidate;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000081 bool VLIW5;
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000082
83 int getInstKind(SUnit *SU);
84 bool regBelongsToClass(unsigned Reg, const TargetRegisterClass *RC) const;
85 AluKind getAluKind(SUnit *SU) const;
86 void LoadAlu();
Vincent Lejeuned1a9d182013-06-07 23:30:34 +000087 unsigned AvailablesAluCount() const;
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000088 SUnit *AttemptFillSlot (unsigned Slot, bool AnyAlu);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000089 void PrepareNextSlot();
Vincent Lejeune7e2c8322013-09-04 19:53:46 +000090 SUnit *PopInst(std::vector<SUnit*> &Q, bool AnyALU);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000091
92 void AssignSlot(MachineInstr *MI, unsigned Slot);
93 SUnit* pickAlu();
94 SUnit* pickOther(int QID);
Vincent Lejeune4c81d4d2013-05-17 16:50:44 +000095 void MoveUnits(std::vector<SUnit *> &QSrc, std::vector<SUnit *> &QDst);
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000096};
97
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000098} // end namespace llvm
Vincent Lejeune68b6b6d2013-03-05 18:41:32 +000099
Eugene Zelenko2bc2f332016-12-09 22:06:55 +0000100#endif // LLVM_LIB_TARGET_AMDGPU_R600MACHINESCHEDULER_H