LLVM: include/llvm/ADT/DenseMapInfo.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef LLVM_ADT_DENSEMAPINFO_H
15#define LLVM_ADT_DENSEMAPINFO_H
16
17#include
18#include
19#include
20#include
21#include
22#include
23#include <type_traits>
24#include
25
26namespace llvm {
27
29
30
32 x *= 0xbf58476d1ce4e5b9u;
33 x ^= x >> 31;
34 return x;
35}
36}
37
39
40
45
46}
47
48
49
50
51
52
53template<typename T, typename Enable = void>
60
61
62
63
64
65
66template
68
69
70
71
73
75 uintptr_t Val = static_cast<uintptr_t>(-1);
77 return reinterpret_cast<T*>(Val);
78 }
79
81 uintptr_t Val = static_cast<uintptr_t>(-2);
83 return reinterpret_cast<T*>(Val);
84 }
85
87 return (unsigned((uintptr_t)PtrVal) >> 4) ^
88 (unsigned((uintptr_t)PtrVal) >> 9);
89 }
90
92};
93
94
104
105
106
107
108
109
110
111template
113 T, std::enable_if_t<std::is_integral_v && !std::is_same_v<T, char>>> {
114 static constexpr T getEmptyKey() { return std::numeric_limits::max(); }
115
117 if constexpr (std::is_unsigned_v || std::is_same_v<T, long>)
118 return std::numeric_limits::max() - 1;
119 else
120 return std::numeric_limits::min();
121 }
122
124 if constexpr (std::is_unsigned_v && sizeof(T) > sizeof(unsigned))
126 else
127 return static_cast<unsigned>(Val *
128 static_cast<std::make_unsigned_t>(37U));
129 }
130
132};
133
134
135template<typename T, typename U>
137 using Pair = std::pair<T, U>;
140
142 return {FirstInfo::getEmptyKey(), SecondInfo::getEmptyKey()};
143 }
144
146 return {FirstInfo::getTombstoneKey(), SecondInfo::getTombstoneKey()};
147 }
148
151 SecondInfo::getHashValue(PairVal.second));
152 }
153
154
155
156
159 SecondInfo::getHashValue(Second));
160 }
161
163 return FirstInfo::isEqual(LHS.first, RHS.first) &&
164 SecondInfo::isEqual(LHS.second, RHS.second);
165 }
166};
167
168
170 using Tuple = std::tuple<Ts...>;
171
175
179
181 if constexpr (I == sizeof...(Ts)) {
182 return 0;
183 } else {
184 using EltType = std::tuple_element_t<I, Tuple>;
188 }
189 }
190
194
195 template <std::size_t... Is>
197 std::index_sequence<Is...>) {
199 std::get(lhs), std::get(rhs)) &&
200 ...);
201 }
202
204 return isEqualImpl(lhs, rhs, std::index_sequence_for<Ts...>{});
205 }
206};
207
208
209template
213
214
215
216
217
218
219
220
221
223 constexpr Enum V = static_cast<Enum>(Info::getEmptyKey());
224 return V;
225 }
226
228 constexpr Enum V = static_cast<Enum>(Info::getTombstoneKey());
229 return V;
230 }
231
233 return Info::getHashValue(static_cast<UnderlyingType>(Val));
234 }
235
237};
238
242
244
246 return {Info::getTombstoneKey()};
247 }
248
251 OptionalVal.has_value(),
252 Info::getHashValue(OptionalVal.value_or(Info::getEmptyKey())));
253 }
254
257 return Info::isEqual(LHS.value(), RHS.value());
258 }
260 }
261};
262}
263
264#endif
static unsigned getHashValueImpl(SimpleValue Val)
static bool isEqualImpl(SimpleValue LHS, SimpleValue RHS)
Definition DenseMapInfo.h:28
uint64_t mix(uint64_t x)
Definition DenseMapInfo.h:31
unsigned combineHashValue(unsigned a, unsigned b)
Simplistic combination of 32-bit hash values into 32-bit hash values.
Definition DenseMapInfo.h:41
This is an optimization pass for GlobalISel generic memory operations.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Implement std::hash so that hash_code can be used in STL containers.
static constexpr Enum getTombstoneKey()
Definition DenseMapInfo.h:227
std::underlying_type_t< Enum > UnderlyingType
Definition DenseMapInfo.h:211
static bool isEqual(const Enum &LHS, const Enum &RHS)
Definition DenseMapInfo.h:236
DenseMapInfo< UnderlyingType > Info
Definition DenseMapInfo.h:212
static unsigned getHashValue(const Enum &Val)
Definition DenseMapInfo.h:232
static constexpr Enum getEmptyKey()
Definition DenseMapInfo.h:222
static unsigned getHashValue(const T &Val)
Definition DenseMapInfo.h:123
static bool isEqual(const T &LHS, const T &RHS)
Definition DenseMapInfo.h:131
static constexpr T getEmptyKey()
Definition DenseMapInfo.h:114
static constexpr T getTombstoneKey()
Definition DenseMapInfo.h:116
static constexpr T * getTombstoneKey()
Definition DenseMapInfo.h:80
static constexpr uintptr_t Log2MaxAlign
Definition DenseMapInfo.h:72
static constexpr T * getEmptyKey()
Definition DenseMapInfo.h:74
static unsigned getHashValue(const T *PtrVal)
Definition DenseMapInfo.h:86
static bool isEqual(const T *LHS, const T *RHS)
Definition DenseMapInfo.h:91
static bool isEqual(const char &LHS, const char &RHS)
Definition DenseMapInfo.h:100
static constexpr char getEmptyKey()
Definition DenseMapInfo.h:96
static unsigned getHashValue(const char &Val)
Definition DenseMapInfo.h:98
static constexpr char getTombstoneKey()
Definition DenseMapInfo.h:97
DenseMapInfo< T > Info
Definition DenseMapInfo.h:241
static constexpr Optional getEmptyKey()
Definition DenseMapInfo.h:243
static constexpr Optional getTombstoneKey()
Definition DenseMapInfo.h:245
std::optional< T > Optional
Definition DenseMapInfo.h:240
static unsigned getHashValue(const Optional &OptionalVal)
Definition DenseMapInfo.h:249
static bool isEqual(const Optional &LHS, const Optional &RHS)
Definition DenseMapInfo.h:255
static unsigned getHashValuePiecewise(const T &First, const U &Second)
Definition DenseMapInfo.h:157
static constexpr Pair getEmptyKey()
Definition DenseMapInfo.h:141
std::pair< T, U > Pair
Definition DenseMapInfo.h:137
static unsigned getHashValue(const Pair &PairVal)
Definition DenseMapInfo.h:149
DenseMapInfo< T > FirstInfo
Definition DenseMapInfo.h:138
static constexpr Pair getTombstoneKey()
Definition DenseMapInfo.h:145
DenseMapInfo< U > SecondInfo
Definition DenseMapInfo.h:139
static bool isEqual(const Pair &LHS, const Pair &RHS)
Definition DenseMapInfo.h:162
std::tuple< Ts... > Tuple
Definition DenseMapInfo.h:170
static constexpr Tuple getTombstoneKey()
Definition DenseMapInfo.h:176
static bool isEqualImpl(const Tuple &lhs, const Tuple &rhs, std::index_sequence< Is... >)
Definition DenseMapInfo.h:196
static unsigned getHashValue(const std::tuple< Ts... > &values)
Definition DenseMapInfo.h:191
static bool isEqual(const Tuple &lhs, const Tuple &rhs)
Definition DenseMapInfo.h:203
static constexpr Tuple getEmptyKey()
Definition DenseMapInfo.h:172
static unsigned getHashValueImpl(const Tuple &values)
Definition DenseMapInfo.h:180
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition DenseMapInfo.h:54