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 template <
typename ValueKeyT>
51 static unsigned getHashValue(
const ValueKeyT &
C) {
55 static unsigned getHashValue(PoolEntry *
P) {
56 return getHashValue(
P->getValue());
59 static unsigned getHashValue(
const PoolEntry *
P) {
60 return getHashValue(
P->getValue());
63 template <
typename ValueKeyT1,
typename ValueKeyT2>
64 static bool isEqual(
const ValueKeyT1 &C1,
const ValueKeyT2 &C2) {
68 template <
typename ValueKeyT>
69 static bool isEqual(
const ValueKeyT &
C, PoolEntry *
P) {
70 return isEqual(
C,
P->getValue());
73 static bool isEqual(PoolEntry *P1, PoolEntry *P2) {
74 return isEqual(
P1->getValue(), P2);
78 using EntrySetT = DenseSet<PoolEntry *, PoolEntryDSInfo>;
82 void removeEntry(PoolEntry *
P) { EntrySet.erase(
P); }
88 if (
I != EntrySet.end())
89 return PoolRef((*I)->shared_from_this(), &(*I)->getValue());
91 auto P = std::make_shared<PoolEntry>(*
this, std::move(ValueKey));
92 EntrySet.insert(
P.get());
109 return VectorPool.getValue(std::move(v));
113 return MatrixPool.getValue(std::move(m));
117 VectorCostPool VectorPool;
118 MatrixCostPool MatrixPool;
This file defines the DenseSet and SmallDenseSet classes.
VectorPtr getVector(VectorKeyT v)
typename MatrixCostPool::PoolRef MatrixPtr
MatrixPtr getMatrix(MatrixKeyT m)
typename VectorCostPool::PoolRef VectorPtr
PoolRef getValue(ValueKeyT ValueKey)
std::shared_ptr< const ValueT > PoolRef
LLVM Value Representation.
DenseSetIterator< false > iterator
@ C
The default llvm calling convention, compatible with C.
hash_code hash_value(const Vector &V)
Return a hash_value for the given vector.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value