diff options
Diffstat (limited to 'llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h')
| -rw-r--r-- | llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h index d6dbb1feda3e..ccc284b62331 100644 --- a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h +++ b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h @@ -207,9 +207,48 @@ using namespace llvm; /// Type for a table of values in a block. using ValueTable = SmallVector<ValueIDNum, 0>; -/// Type for a table-of-table-of-values, i.e., the collection of either -/// live-in or live-out values for each block in the function. -using FuncValueTable = SmallVector<ValueTable, 0>; +/// A collection of ValueTables, one per BB in a function, with convenient +/// accessor methods. +struct FuncValueTable { + FuncValueTable(int NumBBs, int NumLocs) { + Storage.reserve(NumBBs); + for (int i = 0; i != NumBBs; ++i) + Storage.push_back( + std::make_unique<ValueTable>(NumLocs, ValueIDNum::EmptyValue)); + } + + /// Returns the ValueTable associated with MBB. + ValueTable &operator[](const MachineBasicBlock &MBB) const { + return (*this)[MBB.getNumber()]; + } + + /// Returns the ValueTable associated with the MachineBasicBlock whose number + /// is MBBNum. + ValueTable &operator[](int MBBNum) const { + auto &TablePtr = Storage[MBBNum]; + assert(TablePtr && "Trying to access a deleted table"); + return *TablePtr; + } + + /// Returns the ValueTable associated with the entry MachineBasicBlock. + ValueTable &tableForEntryMBB() const { return (*this)[0]; } + + /// Returns true if the ValueTable associated with MBB has not been freed. + bool hasTableFor(MachineBasicBlock &MBB) const { + return Storage[MBB.getNumber()] != nullptr; + } + + /// Frees the memory of the ValueTable associated with MBB. + void ejectTableForBlock(const MachineBasicBlock &MBB) { + Storage[MBB.getNumber()].reset(); + } + +private: + /// ValueTables are stored as unique_ptrs to allow for deallocation during + /// LDV; this was measured to have a significant impact on compiler memory + /// usage. + SmallVector<std::unique_ptr<ValueTable>, 0> Storage; +}; /// Thin wrapper around an integer -- designed to give more type safety to /// spill location numbers. |
