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