17 #ifndef LLVM_CODEGEN_PBQP_COSTALLOCATOR_H
18 #define LLVM_CODEGEN_PBQP_COSTALLOCATOR_H
30 using PoolRef = std::shared_ptr<const ValueT>;
33 class PoolEntry :
public std::enable_shared_from_this<PoolEntry> {
35 template <
typename ValueKeyT>
39 ~PoolEntry() { Pool.removeEntry(
this); }
48 class PoolEntryDSInfo {
50 static inline PoolEntry *getEmptyKey() {
return nullptr; }
52 static inline PoolEntry *getTombstoneKey() {
53 return reinterpret_cast<PoolEntry *
>(
static_cast<uintptr_t
>(1));
56 template <
typename ValueKeyT>
57 static unsigned getHashValue(
const ValueKeyT &
C) {
61 static unsigned getHashValue(PoolEntry *
P) {
62 return getHashValue(
P->getValue());
65 static unsigned getHashValue(
const PoolEntry *
P) {
66 return getHashValue(
P->getValue());
69 template <
typename ValueKeyT1,
typename ValueKeyT2>
70 static bool isEqual(
const ValueKeyT1 &
C1,
const ValueKeyT2 &C2) {
74 template <
typename ValueKeyT>
75 static bool isEqual(
const ValueKeyT &
C, PoolEntry *
P) {
76 if (
P == getEmptyKey() ||
P == getTombstoneKey())
81 static bool isEqual(PoolEntry *P1, PoolEntry *
P2) {
82 if (P1 == getEmptyKey() || P1 == getTombstoneKey())
88 using EntrySetT = DenseSet<PoolEntry *, PoolEntryDSInfo>;
92 void removeEntry(PoolEntry *
P) { EntrySet.erase(
P); }
98 if (
I != EntrySet.end())
99 return PoolRef((*I)->shared_from_this(), &(*I)->getValue());
101 auto P = std::make_shared<PoolEntry>(*
this,
std::move(ValueKey));
102 EntrySet.insert(
P.get());
127 VectorCostPool VectorPool;
128 MatrixCostPool MatrixPool;
134 #endif // LLVM_CODEGEN_PBQP_COSTALLOCATOR_H