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