blob: 57640fc3025bff0a5afdcf6e159e7fe9156b5996 [file] [log] [blame]
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +00001//===--- InfoByHwMode.h -----------------------------------------*- 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// Classes that implement data parameterized by HW modes for instruction
10// selection. Currently it is ValueTypeByHwMode (parameterized ValueType),
11// and RegSizeInfoByHwMode (parameterized register/spill size and alignment
12// data).
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_UTILS_TABLEGEN_INFOBYHWMODE_H
16#define LLVM_UTILS_TABLEGEN_INFOBYHWMODE_H
17
18#include "CodeGenHwModes.h"
19#include "llvm/CodeGen/MachineValueType.h"
20
21#include <map>
22#include <set>
23#include <string>
24#include <vector>
25
26namespace llvm {
27
28struct CodeGenHwModes;
29class Record;
30
31template <typename InfoT> struct InfoByHwMode;
32
33std::string getModeName(unsigned Mode);
34
35enum : unsigned {
36 DefaultMode = CodeGenHwModes::DefaultMode,
37};
38
39template <typename InfoT>
40std::vector<unsigned> union_modes(const InfoByHwMode<InfoT> &A,
41 const InfoByHwMode<InfoT> &B) {
42 std::vector<unsigned> V;
43 std::set<unsigned> U;
44 for (const auto &P : A)
45 U.insert(P.first);
46 for (const auto &P : B)
47 U.insert(P.first);
48 // Make sure that the default mode is last on the list.
49 bool HasDefault = U.count(DefaultMode);
50 for (unsigned M : U)
51 if (M != DefaultMode)
52 V.push_back(M);
53 if (HasDefault)
54 V.push_back(DefaultMode);
55 return V;
56}
57
58template <typename InfoT>
59struct InfoByHwMode {
60 typedef std::map<unsigned,InfoT> MapType;
61 typedef typename MapType::value_type PairType;
62 typedef typename MapType::iterator iterator;
63 typedef typename MapType::const_iterator const_iterator;
64
65 InfoByHwMode() = default;
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000066 InfoByHwMode(const MapType &M) : Map(M) {}
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000067
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000068 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000069 iterator begin() { return Map.begin(); }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000070 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000071 iterator end() { return Map.end(); }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000072 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000073 const_iterator begin() const { return Map.begin(); }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000074 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000075 const_iterator end() const { return Map.end(); }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000076 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000077 bool empty() const { return Map.empty(); }
78
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000079 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000080 bool hasMode(unsigned M) const { return Map.find(M) != Map.end(); }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000081 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000082 bool hasDefault() const { return hasMode(DefaultMode); }
83
84 InfoT &get(unsigned Mode) {
85 if (!hasMode(Mode)) {
86 assert(hasMode(DefaultMode));
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000087 Map.insert({Mode, Map.at(DefaultMode)});
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000088 }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000089 return Map.at(Mode);
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +000090 }
91 const InfoT &get(unsigned Mode) const {
92 auto F = Map.find(Mode);
93 if (Mode != DefaultMode && F == Map.end())
94 F = Map.find(DefaultMode);
95 assert(F != Map.end());
96 return F->second;
97 }
98
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +000099 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000100 bool isSimple() const {
101 return Map.size() == 1 && Map.begin()->first == DefaultMode;
102 }
Krzysztof Parzyszekaffd2012017-09-19 18:42:34 +0000103 LLVM_ATTRIBUTE_ALWAYS_INLINE
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000104 InfoT getSimple() const {
105 assert(isSimple());
106 return Map.begin()->second;
107 }
108 void makeSimple(unsigned Mode) {
109 assert(hasMode(Mode) || hasDefault());
110 InfoT I = get(Mode);
111 Map.clear();
112 Map.insert(std::make_pair(DefaultMode, I));
113 }
114
115 MapType Map;
116};
117
118struct ValueTypeByHwMode : public InfoByHwMode<MVT> {
119 ValueTypeByHwMode(Record *R, const CodeGenHwModes &CGH);
120 ValueTypeByHwMode(MVT T) { Map.insert({DefaultMode,T}); }
121 ValueTypeByHwMode() = default;
122
123 bool operator== (const ValueTypeByHwMode &T) const;
124 bool operator< (const ValueTypeByHwMode &T) const;
125
126 bool isValid() const {
127 return !Map.empty();
128 }
129 MVT getType(unsigned Mode) const { return get(Mode); }
130 MVT &getOrCreateTypeForMode(unsigned Mode, MVT Type);
131
Simon Pilgrim6f05a742017-09-22 13:32:26 +0000132 static StringRef getMVTName(MVT T);
Krzysztof Parzyszek9b64c512017-09-22 16:18:35 +0000133 std::string getAsString() const;
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000134 void dump() const;
135};
136
137ValueTypeByHwMode getValueTypeByHwMode(Record *Rec,
138 const CodeGenHwModes &CGH);
139
140struct RegSizeInfo {
141 unsigned RegSize;
142 unsigned SpillSize;
143 unsigned SpillAlignment;
144
145 RegSizeInfo(Record *R, const CodeGenHwModes &CGH);
146 RegSizeInfo() = default;
147 bool operator< (const RegSizeInfo &I) const;
148 bool operator== (const RegSizeInfo &I) const {
149 return std::tie(RegSize, SpillSize, SpillAlignment) ==
150 std::tie(I.RegSize, I.SpillSize, I.SpillAlignment);
151 }
152 bool operator!= (const RegSizeInfo &I) const {
153 return !(*this == I);
154 }
155
156 bool isSubClassOf(const RegSizeInfo &I) const;
Krzysztof Parzyszek9b64c512017-09-22 16:18:35 +0000157 std::string getAsString() const;
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000158};
159
160struct RegSizeInfoByHwMode : public InfoByHwMode<RegSizeInfo> {
161 RegSizeInfoByHwMode(Record *R, const CodeGenHwModes &CGH);
162 RegSizeInfoByHwMode() = default;
163 bool operator< (const RegSizeInfoByHwMode &VI) const;
164 bool operator== (const RegSizeInfoByHwMode &VI) const;
165 bool operator!= (const RegSizeInfoByHwMode &VI) const {
166 return !(*this == VI);
167 }
168
169 bool isSubClassOf(const RegSizeInfoByHwMode &I) const;
170 bool hasStricterSpillThan(const RegSizeInfoByHwMode &I) const;
171
Krzysztof Parzyszek9b64c512017-09-22 16:18:35 +0000172 std::string getAsString() const;
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000173};
Krzysztof Parzyszek779d98e2017-09-14 16:56:21 +0000174} // namespace llvm
175
176#endif // LLVM_UTILS_TABLEGEN_INFOBYHWMODE_H