From 7d22102b81be0d8a0d5c081bb2f1ed6b9a0663a1 Mon Sep 17 00:00:00 2001 From: Dirk Steinke Date: Sat, 26 Jul 2014 18:49:32 +0200 Subject: [PATCH] Changed uses of std::vector in BBlockImpl and FunctionImpl to TmpVector. Allocation for temporary objects should be using TempAllocator as much as possible. (FunctionImpl was leaking the BBlocks anyway...) --- src/jitcs_int_adt_array.h | 1 + src/jitcs_int_adt_tmpvector.h | 19 ++++++++++++++++--- src/jitcs_int_bblock_impl.h | 6 +++--- src/jitcs_int_function_impl.h | 9 +++++---- src/src/bblock_impl.cpp | 13 ++++++++----- src/src/function_impl.cpp | 13 ++++++++----- 6 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/jitcs_int_adt_array.h b/src/jitcs_int_adt_array.h index 6468609..2935bd0 100644 --- a/src/jitcs_int_adt_array.h +++ b/src/jitcs_int_adt_array.h @@ -30,6 +30,7 @@ struct ArrayRefBase { ArrayRefBase(ItemType *ptr, size_t no) : _data(ptr), _size(no) {} size_t size() const { return _size; } + bool isEmpty() const { return _size == 0; } bool isValidIndex(size_t r) const { return r < size(); } diff --git a/src/jitcs_int_adt_tmpvector.h b/src/jitcs_int_adt_tmpvector.h index 9215d91..6105efc 100644 --- a/src/jitcs_int_adt_tmpvector.h +++ b/src/jitcs_int_adt_tmpvector.h @@ -9,6 +9,7 @@ #ifndef _JITCS_INT_ADT_TMPVECTOR_H_ #define _JITCS_INT_ADT_TMPVECTOR_H_ +#include "jitcs_adt_slice.h" #include "jitcs_base.h" #include "jitcs_int_adt_array.h" #include "jitcs_tmpalloc.h" @@ -30,13 +31,25 @@ struct TmpVector : public ArrayRef { TmpVector& operator =(const TmpVector&) = delete; void push_back(ItemType i) { - if (this->_size >= _capacity) _resize(); + if (this->_size >= _capacity) _resize(1); this->_data[this->_size++] = i; } + void append(Slice items) { + if (this->_size + items.size() > _capacity) _resize(items.size()); + std::copy(items.begin(), items.end(), this->_data + this->_size); + this->_size += items.size(); + } bool isLocalData() const { return this->_data == _short_data; } + + void initSizeAndClear(size_t sz, const ItemType& filler) { + if (sz > _capacity) _resize(sz); + this->_size = sz; + std::fill(this->_data, this->_data + sz, filler); + } + private: - void _resize() { - size_t newsize = (_capacity | 3) * 2 + 2; + void _resize(size_t g) { + size_t newsize = (_capacity | g) * 2 + 2; ItemType* newdata = _alloc.allocTypedArray(newsize); std::copy(this->_data, this->_data + this->_size, newdata); this->_data = newdata; diff --git a/src/jitcs_int_bblock_impl.h b/src/jitcs_int_bblock_impl.h index eeb8ee8..32b59d0 100644 --- a/src/jitcs_int_bblock_impl.h +++ b/src/jitcs_int_bblock_impl.h @@ -8,9 +8,9 @@ #define _JITCS_INT_BBLOCK_IMPL_H_ #include "jitcs_adt_range.h" +#include "jitcs_int_adt_tmpvector.h" #include "jitcs_base.h" #include "jitcs_instruction.h" -#include namespace jitcs { class FunctionImpl; @@ -20,8 +20,8 @@ class TempAllocator; class BasicBlockImpl { public: // TODO: use structures that use TempAllocator - typedef std::vector BasicBlockList; - typedef std::vector InstructionList; + typedef TmpVector BasicBlockList; + typedef TmpVector InstructionList; typedef BasicBlockList::iterator bb_iterator; typedef BasicBlockList::const_iterator const_bb_iterator; diff --git a/src/jitcs_int_function_impl.h b/src/jitcs_int_function_impl.h index 0724ca4..8c11af5 100644 --- a/src/jitcs_int_function_impl.h +++ b/src/jitcs_int_function_impl.h @@ -12,8 +12,8 @@ #include "jitcs_adt_refcounter.h" #include "jitcs_base.h" #include "jitcs_ids.h" +#include "jitcs_int_adt_tmpvector.h" #include "jitcs_memmgr.h" -#include namespace jitcs { class BasicBlockImpl; @@ -27,7 +27,8 @@ struct VirtualRegister; class FunctionImpl { public: - typedef std::vector BasicBlockList; + typedef TmpVector BasicBlockList; + typedef TmpVector VirtualRegisterList; typedef BasicBlockList::iterator bb_iterator; typedef BasicBlockList::const_iterator const_bb_iterator; @@ -150,8 +151,8 @@ private: RefCounter _allocator; std::shared_ptr _cc; RefCounter _mi; - std::vector _bblocks; - std::vector _parregs, _vregs; + BasicBlockList _bblocks; + VirtualRegisterList _parregs, _vregs; //std::vector< std::vector > _tempvregs; //struct FrameInfo { // VRegRef reg; diff --git a/src/src/bblock_impl.cpp b/src/src/bblock_impl.cpp index b437ec7..c97a4c4 100644 --- a/src/src/bblock_impl.cpp +++ b/src/src/bblock_impl.cpp @@ -13,7 +13,10 @@ jitcs::BasicBlockImpl::BasicBlockImpl(FunctionImpl& f, BBId id) , _bbFallThruFrom(nullptr) , _bbFallThruTo(nullptr) , _alloc(f.getAllocator()) - , _hasCFIns(false) { + , _hasCFIns(false) + , _successors(f.getAllocator()) + , _predecessors(f.getAllocator()) + , _listOfIns(f.getAllocator()) { } void jitcs::BasicBlockImpl::BuildEdge(BasicBlockImpl* fromBB, BasicBlockImpl* toBB, bool isFallthru) { assert(fromBB && toBB); @@ -29,7 +32,7 @@ void jitcs::BasicBlockImpl::BuildEdge(BasicBlockImpl* fromBB, BasicBlockImpl* to void jitcs::BasicBlockImpl::dump(MachineDumper& o) const { o.writef("BB(%d):", _bbId); - if (!_predecessors.empty()) { + if (!_predecessors.isEmpty()) { o.write(" IN("); bool first = true; for (const_bb_range r = pred_crange(); !!r; ++r) { @@ -39,7 +42,7 @@ void jitcs::BasicBlockImpl::dump(MachineDumper& o) const { } o.write(")"); } - if (!_successors.empty()) { + if (!_successors.isEmpty()) { o.write(" OUT("); bool first = true; for (const_bb_range r = succ_crange(); !!r; ++r) { @@ -77,7 +80,7 @@ size_t jitcs::BasicBlockImpl::append(iptr* p, size_t N) { assert(n <= N); _hasCFIns = (result & 2) != 0; if (inscnt == INSN) { - _listOfIns.insert(_listOfIns.end(), insblock, insblock + INSN); + _listOfIns.append(Slice(insblock, INSN)); instotal += INSN; inscnt = 0; } @@ -86,7 +89,7 @@ size_t jitcs::BasicBlockImpl::append(iptr* p, size_t N) { N -= n; } if (inscnt > 0) { - _listOfIns.insert(_listOfIns.end(), insblock, insblock + inscnt); + _listOfIns.append(Slice(insblock, inscnt)); instotal += inscnt; } return instotal; diff --git a/src/src/function_impl.cpp b/src/src/function_impl.cpp index 0d0741f..2c70d2c 100644 --- a/src/src/function_impl.cpp +++ b/src/src/function_impl.cpp @@ -13,7 +13,10 @@ jitcs::FunctionImpl::FunctionImpl //, _m(M_Construct) //, _frameInfoCnt(2) , _cc(cc) - , _mi(cc->getMachineInfo()) { + , _mi(cc->getMachineInfo()) + , _bblocks(*ins) + , _parregs(*ins) + , _vregs(*ins) { // create vregs for parameters and results // ins.setAlignment(16); @@ -79,14 +82,14 @@ jitcs::Ref jitcs::FunctionImpl::getStartBlock() { jitcs::Ref jitcs::FunctionImpl::createBasicBlock() { // TODO: allocate from TempAllocator - BasicBlockImpl* bb = new BasicBlockImpl(*this, BBId(_bblocks.size())); + BasicBlockImpl* bb = _allocator->allocTyped(); + new (bb) BasicBlockImpl(*this, BBId(_bblocks.size())); + //BasicBlockImpl* bb = new BasicBlockImpl(*this, BBId(_bblocks.size())); _bblocks.push_back(bb); return bb; } void jitcs::FunctionImpl::_prepareArgumentAndResultRegisterSpace() { - _parregs.resize(((_cc->getResultCount() + _cc->getParamCount())|1)); - for (auto i = _parregs.begin(), e = _parregs.end(); i != e; ++i) - *i = nullptr; + _parregs.initSizeAndClear((_cc->getResultCount() + _cc->getParamCount())|1, nullptr); } jitcs::Ref jitcs::FunctionImpl::getArgumentRegister(uint n, RegClassId rc) { -- 2.11.4.GIT