MachineBasicBlock.h revision 94dc07728f091c652f0a8059aba6dce5018485ee
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file was developed by the LLVM research group and is distributed under
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the University of Illinois Open Source License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Collect the sequence of machine instructions for a basic block.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#define LLVM_CODEGEN_MACHINEBASICBLOCK_H
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineInstr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Support/ilist"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ilist_traits
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ilist_traits<MachineInstr>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ilist_traits<MachineInstr> self;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this is only set by the MachineBasicBlock owning the ilist
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class MachineBasicBlock;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineBasicBlock* parent;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ilist_traits<MachineInstr>() : parent(0) { }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static MachineInstr* getPrev(MachineInstr* N) { return N->prev; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static MachineInstr* getNext(MachineInstr* N) { return N->next; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MachineInstr*
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getPrev(const MachineInstr* N) { return N->prev; }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const MachineInstr*
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getNext(const MachineInstr* N) { return N->next; }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void setPrev(MachineInstr* N, MachineInstr* prev) { N->prev = prev; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void setNext(MachineInstr* N, MachineInstr* next) { N->next = next; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static MachineInstr* createNode() { return new MachineInstr(0, 0); }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void addNodeToList(MachineInstr* N) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(N->parent == 0 && "machine instruction already in a basic block");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    N->parent = parent;
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void removeNodeFromList(MachineInstr* N) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(N->parent != 0 && "machine instruction not in a basic block");
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    N->parent = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void transferNodesFromList(iplist<MachineInstr, self>& toList,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ilist_iterator<MachineInstr> first,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ilist_iterator<MachineInstr> last) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent != toList.parent)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (; first != last; ++first)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          first->parent = toList.parent;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicBlock;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachineBasicBlock {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ilist<MachineInstr> Instructions;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Instructions Insts;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MachineBasicBlock *Prev, *Next;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BasicBlock *BB;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineBasicBlock(const BasicBlock *bb = 0) : Prev(0), Next(0), BB(bb) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Insts.parent = this;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MachineBasicBlock() {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getBasicBlock - Return the LLVM basic block that this instance
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// corresponded to originally.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BasicBlock *getBasicBlock() const { return BB; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ilist<MachineInstr>::iterator                       iterator;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ilist<MachineInstr>::const_iterator           const_iterator;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::reverse_iterator<iterator>             reverse_iterator;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned size() const { return Insts.size(); }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool empty() const { return Insts.empty(); }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MachineInstr& operator[](unsigned i) const {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const_iterator it = Insts.begin();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::advance(it, i);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return *it;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineInstr& operator[](unsigned i) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iterator it = Insts.begin();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::advance(it, i);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return *it;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineInstr& front() { return Insts.front(); }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineInstr& back()  { return Insts.back(); }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  iterator                begin()       { return Insts.begin();  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_iterator          begin() const { return Insts.begin();  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator                  end()       { return Insts.end();    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_iterator            end() const { return Insts.end();    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reverse_iterator       rbegin()       { return Insts.rbegin(); }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_reverse_iterator rbegin() const { return Insts.rbegin(); }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reverse_iterator       rend  ()       { return Insts.rend();   }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const_reverse_iterator rend  () const { return Insts.rend();   }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void push_back(MachineInstr *MI) { Insts.push_back(MI); }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template<typename IT>
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // erase - Remove the specified element or range from the instruction list.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These functions delete any instructions removed.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator erase(iterator I)             { return Insts.erase(I); }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator erase(iterator I, iterator E) { return Insts.erase(I, E); }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineInstr* remove(iterator &I)      { return Insts.remove(I); }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:   // Methods used to maintain doubly linked list of blocks...
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ilist_traits<MachineBasicBlock>;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineBasicBlock *getPrev() const { return Prev; }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MachineBasicBlock *getNext() const { return Next; }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setPrev(MachineBasicBlock *P) { Prev = P; }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setNext(MachineBasicBlock *N) { Next = N; }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // End llvm namespace
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch