File indexing completed on 2026-05-10 08:43:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_CODEGEN_SCHEDULEDFS_H
0014 #define LLVM_CODEGEN_SCHEDULEDFS_H
0015
0016 #include "llvm/ADT/SmallVector.h"
0017 #include "llvm/CodeGen/ScheduleDAG.h"
0018 #include <cassert>
0019 #include <cstdint>
0020 #include <vector>
0021
0022 namespace llvm {
0023
0024 template <typename T> class ArrayRef;
0025 class raw_ostream;
0026
0027
0028
0029
0030
0031
0032
0033
0034 struct ILPValue {
0035 unsigned InstrCount;
0036
0037
0038 unsigned Length;
0039
0040 ILPValue(unsigned count, unsigned length):
0041 InstrCount(count), Length(length) {}
0042
0043
0044 bool operator<(ILPValue RHS) const {
0045 return (uint64_t)InstrCount * RHS.Length
0046 < (uint64_t)Length * RHS.InstrCount;
0047 }
0048 bool operator>(ILPValue RHS) const {
0049 return RHS < *this;
0050 }
0051 bool operator<=(ILPValue RHS) const {
0052 return (uint64_t)InstrCount * RHS.Length
0053 <= (uint64_t)Length * RHS.InstrCount;
0054 }
0055 bool operator>=(ILPValue RHS) const {
0056 return RHS <= *this;
0057 }
0058
0059 void print(raw_ostream &OS) const;
0060
0061 void dump() const;
0062 };
0063
0064
0065 class SchedDFSResult {
0066 friend class SchedDFSImpl;
0067
0068 static const unsigned InvalidSubtreeID = ~0u;
0069
0070
0071
0072
0073
0074
0075
0076 struct NodeData {
0077 unsigned InstrCount = 0;
0078 unsigned SubtreeID = InvalidSubtreeID;
0079
0080 NodeData() = default;
0081 };
0082
0083
0084 struct TreeData {
0085 unsigned ParentTreeID = InvalidSubtreeID;
0086 unsigned SubInstrCount = 0;
0087
0088 TreeData() = default;
0089 };
0090
0091
0092 struct Connection {
0093 unsigned TreeID;
0094 unsigned Level;
0095
0096 Connection(unsigned tree, unsigned level): TreeID(tree), Level(level) {}
0097 };
0098
0099 bool IsBottomUp;
0100 unsigned SubtreeLimit;
0101
0102 std::vector<NodeData> DFSNodeData;
0103
0104
0105 SmallVector<TreeData, 16> DFSTreeData;
0106
0107
0108
0109 std::vector<SmallVector<Connection, 4>> SubtreeConnections;
0110
0111
0112
0113 std::vector<unsigned> SubtreeConnectLevels;
0114
0115 public:
0116 SchedDFSResult(bool IsBU, unsigned lim)
0117 : IsBottomUp(IsBU), SubtreeLimit(lim) {}
0118
0119
0120 unsigned getSubtreeLimit() const { return SubtreeLimit; }
0121
0122
0123
0124
0125 bool empty() const { return DFSNodeData.empty(); }
0126
0127
0128 void clear() {
0129 DFSNodeData.clear();
0130 DFSTreeData.clear();
0131 SubtreeConnections.clear();
0132 SubtreeConnectLevels.clear();
0133 }
0134
0135
0136 void resize(unsigned NumSUnits) {
0137 DFSNodeData.resize(NumSUnits);
0138 }
0139
0140
0141 void compute(ArrayRef<SUnit> SUnits);
0142
0143
0144
0145 unsigned getNumInstrs(const SUnit *SU) const {
0146 return DFSNodeData[SU->NodeNum].InstrCount;
0147 }
0148
0149
0150
0151 unsigned getNumSubInstrs(unsigned SubtreeID) const {
0152 return DFSTreeData[SubtreeID].SubInstrCount;
0153 }
0154
0155
0156
0157
0158 ILPValue getILP(const SUnit *SU) const {
0159 return ILPValue(DFSNodeData[SU->NodeNum].InstrCount, 1 + SU->getDepth());
0160 }
0161
0162
0163 unsigned getNumSubtrees() const { return SubtreeConnectLevels.size(); }
0164
0165
0166
0167
0168
0169 unsigned getSubtreeID(const SUnit *SU) const {
0170 if (empty())
0171 return 0;
0172 assert(SU->NodeNum < DFSNodeData.size() && "New Node");
0173 return DFSNodeData[SU->NodeNum].SubtreeID;
0174 }
0175
0176
0177
0178
0179
0180 unsigned getSubtreeLevel(unsigned SubtreeID) const {
0181 return SubtreeConnectLevels[SubtreeID];
0182 }
0183
0184
0185
0186 void scheduleTree(unsigned SubtreeID);
0187 };
0188
0189 raw_ostream &operator<<(raw_ostream &OS, const ILPValue &Val);
0190
0191 }
0192
0193 #endif