25 #ifndef _JIT_COMPILER2_MACHINEBASICBLOCK
26 #define _JIT_COMPILER2_MACHINEBASICBLOCK
45 class MachineInstruction;
46 class MachineInstructionSchedule;
66 : block_it(block_it), it(_end()) {}
69 : block_it(block_it), it(it) {}
72 : block_it(other.block_it), it(other.it) {}
92 if (it == _end() && rhs.
it == _end())
101 if (rhs.
it == _end())
124 return !(lhs <= rhs);
165 :
id(id_counter++), my_it(my_it) {};
169 std::size_t
size()
const;
184 template<
class InputIt>
187 template<
class InputIt>
190 iterator erase(iterator
pos);
192 iterator erase(iterator first, iterator last);
198 const_iterator begin()
const;
200 const_iterator end()
const;
202 reverse_iterator rbegin();
204 reverse_iterator rend();
206 const_reverse_iterator rbegin()
const;
208 const_reverse_iterator rend()
const;
210 const_reference front()
const;
212 const_reference back()
const;
221 const_phi_iterator phi_begin()
const;
223 const_phi_iterator phi_end()
const;
225 std::size_t phi_size()
const;
235 const_pred_iterator pred_begin()
const;
237 const_pred_iterator pred_end()
const;
239 pred_iterator pred_begin();
241 pred_iterator pred_end();
243 std::size_t pred_size()
const;
290 if (it == (*block_it)->end()) {
296 if (block_it == block_it.get_parent()->end()) {
300 it = (*block_it)->begin();
306 if (it == _end() || it == (*block_it)->begin()) {
310 if (block_it == block_it.get_parent()->begin()) {
314 it = (*block_it)->end();
320 inline bool MIIterator::is_end()
const {
328 inline bool MachineBasicBlock::empty()
const {
337 list.push_back(value);
342 list.push_front(value);
348 return list.insert(pos,value);
354 return list.insert(pos,value);
360 return list.insert(++pos,value);
362 template<
class InputIt>
364 InputIt first, InputIt last) {
366 list.insert(pos,first,last);
367 std::for_each(first,last,
368 std::bind1st(std::mem_fun(&MachineBasicBlock::update),
this));
370 template<
class InputIt>
372 InputIt first, InputIt last) {
374 list.insert(++pos,first,last);
375 std::for_each(first,last,
376 std::bind1st(std::mem_fun(&MachineBasicBlock::update),
this));
380 return list.erase(pos);
384 return list.erase(first,last);
399 return list.rbegin();
405 return list.rbegin();
424 return ++convert(--pos);
429 return convert(--(pos.base()));
436 return convert(begin());
440 return convert(--end());
450 return MBB.
print(OS);
453 phi.push_back(value);
461 inline std::size_t MachineBasicBlock::phi_size()
const {
464 inline void MachineBasicBlock::phi_clear() {
469 predecessors.push_back(value);
472 return predecessors.begin();
475 return predecessors.end();
478 return predecessors.begin();
481 return predecessors.end();
483 inline std::size_t MachineBasicBlock::pred_size()
const {
484 return predecessors.size();
487 assert(i < predecessors.size());
488 return predecessors[
i];
492 std::size_t
i = 0,
e = pred_size();
494 if (predecessors[i] == MBB) {
503 return id == other.
id;
510 : from(from), to(to) {}
522 template <
class InputIterator>
526 std::for_each(first,last,Fn);
528 from.
erase(first,last);
549 std::insert_iterator<MachineBasicBlock> get_edge_inserter(
550 MachineBasicBlock *
from, MachineBasicBlock *to);
alloc::ordered_list< MachineInstruction * >::type Container
std::reverse_iterator< const_iterator > const_reverse_iterator
allocator_type::const_reference const_reference
PredListTy::iterator pred_iterator
MIIterator get_edge_iterator(MachineBasicBlock *from, MachineBasicBlock *to, Backend *backend)
bool check_is_phi(MachineInstruction *value)
Container::const_pointer const_pointer
iterator insert_before(iterator pos, MachineInstruction *value)
inserts value before the element pointed to by pos
MachinePhiInst * get_phi_from_operand(MachineBasicBlock *MBB, MachineOperand *op)
Container::iterator iterator
_iterator::reference reference
PhiListTy::const_iterator const_phi_iterator
Custom new/delete handler mixin.
A basic block of (scheduled) machine instructions.
Container::const_iterator const_iterator
MIIterator operator++(int)
void move_instructions(InputIterator first, InputIterator last, MachineBasicBlock &from, MachineBasicBlock &to)
Move instructions to another basic block.
iterator end()
returns an iterator to the end
allocator_type::const_pointer const_pointer
bool operator==(const MIIterator &rhs) const
MIIterator(const MIIterator &other)
copy constructor
MIIterator insert_before(MIIterator pos, MachineInstruction *value)
Get an edge inserter.
allocator_type::reference reference
const reference operator*() const
bool operator>=(const MIIterator &lhs, const MIIterator &rhs)
std::iterator< std::bidirectional_iterator_tag, T >::pointer pointer
MIIterator operator--(int)
JNIEnv jthread jobject jclass jlong size
MachineBasicBlock()
empty constructor
std::list< T, Allocator< T > > type
PredListTy::const_iterator const_pred_iterator
MIIterator(const block_iterator &block_it, const _iterator &it)
constructor
MIIterator(const block_iterator &block_it)
construct end element
_iterator::value_type value_type
MBBIterator block_iterator
Container::reference reference
Instruction::InstID tmp[]
LoopBase * get_parent() const
Container::reverse_iterator reverse_iterator
std::vector< T, Allocator< T > > type
MIIterator & operator=(const MIIterator &other)
copy assignment operator
_iterator::pointer pointer
_iterator::difference_type difference_type
Simple stream class for formatted output.
Container::const_reverse_iterator const_reverse_iterator
MachineBasicBlock(const MBBIterator &my_it)
construct an empty MachineBasicBlock
MachineBasicBlock * get_edge_block(MachineBasicBlock *from, MachineBasicBlock *to, Backend *backend)
get a new basic block for a given edge
alloc::ordered_list< MachineInstruction * >::type::iterator _iterator
bool none_of(InputIt first, InputIt last, UnaryPredicate p)
Loop * get_parent(Loop *a)
allocator_type::pointer pointer
bool operator!=(const MIIterator &rhs) const
bool operator<(const MIIterator &rhs) const
OStream & operator<<(OStream &OS, const std::string &t)
static unsigned get_predecessor_index(basicblock *from, basicblock *to)
bool operator==(const ordered_list< T, Allocator > &lhs, const ordered_list< T, Allocator > &rhs)
equality
Proxy to encode explicit and implicit successors.
Container::pointer pointer
std::reverse_iterator< iterator > reverse_iterator
OStream & print(OStream &OS) const
print
bool operator>(const MIIterator &lhs, const MIIterator &rhs)
static std::size_t id_counter
MoveEdgeFunctor(MachineBasicBlock &from, MachineBasicBlock &to)
MIIterator insert_after(MIIterator pos, MachineInstruction *value)
alloc::vector< MachineBasicBlock * >::type PredListTy
Container::const_reference const_reference
bool operator>(const MIIterator &rhs) const
alloc::list< MachinePhiInst * >::type PhiListTy
bool operator<=(const UseDef &lhs, const UseDef &rhs)
std::iterator< std::bidirectional_iterator_tag, T >::reference reference
_iterator::iterator_category iterator_category
iterator erase(iterator pos)
erases element
const pointer operator->() const
An ordered_list is an indexed sequence container.