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())
 
   78      return isEqual(
C, 
P->getValue());
 
   81    static bool isEqual(PoolEntry *P1, PoolEntry *P2) {
 
   82      if (P1 == getEmptyKey() || P1 == getTombstoneKey())
 
   84      return isEqual(
P1->getValue(), P2);
 
   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());
 
 
 
  119    return VectorPool.getValue(std::move(v));
 
 
  123    return MatrixPool.getValue(std::move(m));
 
 
  127  VectorCostPool VectorPool;
 
  128  MatrixCostPool MatrixPool;
 
 
 
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
 
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