MachineBasicBlock.h revision 13d828567812041c1ca1817f4b66fce840903a1f
1357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org//===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===// 2357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// 3357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// The LLVM Compiler Infrastructure 4357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// 5357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// This file was developed by the LLVM research group and is distributed under 6357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// the University of Illinois Open Source License. See LICENSE.TXT for details. 7357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// 8357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org//===----------------------------------------------------------------------===// 9357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// 10357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// Collect the sequence of machine instructions for a basic block. 11357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// 12357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org//===----------------------------------------------------------------------===// 13357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 14357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H 15357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#define LLVM_CODEGEN_MACHINEBASICBLOCK_H 16357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 17357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#include "llvm/CodeGen/MachineInstr.h" 18357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#include "llvm/ADT/GraphTraits.h" 19357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#include "llvm/ADT/ilist" 20357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org#include "llvm/Support/Streams.h" 21357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 22357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgnamespace llvm { 23357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org class MachineFunction; 24357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 25357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org// ilist_traits 26357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgtemplate <> 27357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgstruct ilist_traits<MachineInstr> { 28357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgprotected: 29357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // this is only set by the MachineBasicBlock owning the ilist 30357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org friend class MachineBasicBlock; 31357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineBasicBlock* parent; 32357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 33357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgpublic: 34357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org ilist_traits<MachineInstr>() : parent(0) { } 35357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 36357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static MachineInstr* getPrev(MachineInstr* N) { return N->prev; } 37357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static MachineInstr* getNext(MachineInstr* N) { return N->next; } 38357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 39357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static const MachineInstr* 40357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org getPrev(const MachineInstr* N) { return N->prev; } 41357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 42357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static const MachineInstr* 43357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org getNext(const MachineInstr* N) { return N->next; } 44357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 45357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static void setPrev(MachineInstr* N, MachineInstr* prev) { N->prev = prev; } 46357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static void setNext(MachineInstr* N, MachineInstr* next) { N->next = next; } 47357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 48357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static MachineInstr* createSentinel(); 49357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org static void destroySentinel(MachineInstr *MI) { delete MI; } 50357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void addNodeToList(MachineInstr* N); 51357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void removeNodeFromList(MachineInstr* N); 52357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void transferNodesFromList( 53357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org iplist<MachineInstr, ilist_traits<MachineInstr> >& toList, 54357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org ilist_iterator<MachineInstr> first, 55357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org ilist_iterator<MachineInstr> last); 56357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org}; 57357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 58357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgclass BasicBlock; 59357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 60357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgclass MachineBasicBlock { 61357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgpublic: 62357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef ilist<MachineInstr> Instructions; 63357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Instructions Insts; 64357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineBasicBlock *Prev, *Next; 65357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const BasicBlock *BB; 66357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org int Number; 67357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineFunction *Parent; 68357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 69357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// Predecessors/Successors - Keep track of the predecessor / successor 70357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// basicblocks. 71357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org std::vector<MachineBasicBlock *> Predecessors; 72357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org std::vector<MachineBasicBlock *> Successors; 73357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 74357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// LiveIns - Keep track of the physical registers that are livein of 75357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// the basicblock. 76357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org std::vector<unsigned> LiveIns; 77357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 78357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgpublic: 79357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineBasicBlock(const BasicBlock *bb = 0) : Prev(0), Next(0), BB(bb), 80357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Number(-1), Parent(0) { 81357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Insts.parent = this; 82357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 83357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 84357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org ~MachineBasicBlock(); 85357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 86357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// getBasicBlock - Return the LLVM basic block that this instance 87357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// corresponded to originally. 88357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// 89357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const BasicBlock *getBasicBlock() const { return BB; } 90357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 91357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// getParent - Return the MachineFunction containing this basic block. 92357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// 93357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const MachineFunction *getParent() const { return Parent; } 94357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineFunction *getParent() { return Parent; } 95357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 96357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef ilist<MachineInstr>::iterator iterator; 97357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef ilist<MachineInstr>::const_iterator const_iterator; 98357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 99357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::reverse_iterator<iterator> reverse_iterator; 100357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 101357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org unsigned size() const { return Insts.size(); } 102357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org bool empty() const { return Insts.empty(); } 103357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 104357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineInstr& front() { return Insts.front(); } 105357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org MachineInstr& back() { return Insts.back(); } 106357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 107357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org iterator begin() { return Insts.begin(); } 108357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_iterator begin() const { return Insts.begin(); } 109357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org iterator end() { return Insts.end(); } 110357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_iterator end() const { return Insts.end(); } 111357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org reverse_iterator rbegin() { return Insts.rbegin(); } 112720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org const_reverse_iterator rbegin() const { return Insts.rbegin(); } 113357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org reverse_iterator rend () { return Insts.rend(); } 114357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_reverse_iterator rend () const { return Insts.rend(); } 115357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 116357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // Machine-CFG iterators 117357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::vector<MachineBasicBlock *>::iterator pred_iterator; 118357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::vector<MachineBasicBlock *>::const_iterator const_pred_iterator; 119357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::vector<MachineBasicBlock *>::iterator succ_iterator; 120357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org typedef std::vector<MachineBasicBlock *>::const_iterator const_succ_iterator; 121357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 122357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org pred_iterator pred_begin() { return Predecessors.begin(); } 123357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_pred_iterator pred_begin() const { return Predecessors.begin(); } 124357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org pred_iterator pred_end() { return Predecessors.end(); } 125357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_pred_iterator pred_end() const { return Predecessors.end(); } 126357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org unsigned pred_size() const { return Predecessors.size(); } 127357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org bool pred_empty() const { return Predecessors.empty(); } 128357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org succ_iterator succ_begin() { return Successors.begin(); } 129357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_succ_iterator succ_begin() const { return Successors.begin(); } 130357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org succ_iterator succ_end() { return Successors.end(); } 131357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org const_succ_iterator succ_end() const { return Successors.end(); } 132357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org unsigned succ_size() const { return Successors.size(); } 133357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org bool succ_empty() const { return Successors.empty(); } 134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 135ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // LiveIn management methods. 136ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 137ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /// addLiveIn - Add the specified register as a live in. Note that it 138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /// is an error to add the same register to the same set more than once. 139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); } 140ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Iteration support for live in sets. These sets are kept in sorted 142ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // order by their register number. 143ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org typedef std::vector<unsigned>::const_iterator livein_iterator; 144357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org livein_iterator livein_begin() const { return LiveIns.begin(); } 145357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org livein_iterator livein_end() const { return LiveIns.end(); } 146357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org bool livein_empty() const { return LiveIns.empty(); } 147357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 148357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // Code Layout methods. 149357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 150357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// moveBefore/moveAfter - move 'this' block before or after the specified 151357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// block. This only moves the block, it does not modify the CFG or adjust 152357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// potential fall-throughs at the end of the block. 1539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com void moveBefore(MachineBasicBlock *NewAfter); 1549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com void moveAfter(MachineBasicBlock *NewBefore); 1559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Machine-CFG mutators 1579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1589dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// addSuccessor - Add succ as a successor of this MachineBasicBlock. 1599dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// The Predecessors list of succ is automatically updated. 1609dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// 1619dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com void addSuccessor(MachineBasicBlock *succ); 162357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 163357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// removeSuccessor - Remove successor from the successors list of this 164357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// MachineBasicBlock. The Predecessors list of succ is automatically updated. 165357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// 166357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void removeSuccessor(MachineBasicBlock *succ); 167357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 1689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// removeSuccessor - Remove specified successor from the successors list of 1699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// this MachineBasicBlock. The Predecessors list of succ is automatically 1709dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// updated. 171357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// 172357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void removeSuccessor(succ_iterator I); 1739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// isSuccessor - Return true if the specified MBB is a successor of this 1759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// block. 176357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org bool isSuccessor(MachineBasicBlock *MBB) const { 177357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org for (const_succ_iterator I = succ_begin(), E = succ_end(); I != E; ++I) 178357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (*I == MBB) 179357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return true; 180357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return false; 1819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 1829dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com /// getFirstTerminator - returns an iterator to the first terminator 184357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// instruction of this basic block. If a terminator does not exist, 185357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// it returns end() 186357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org iterator getFirstTerminator(); 187357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 188357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void pop_front() { Insts.pop_front(); } 189357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void pop_back() { Insts.pop_back(); } 190357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void push_back(MachineInstr *MI) { Insts.push_back(MI); } 1919dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com template<typename IT> 1929dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com void insert(iterator I, IT S, IT E) { Insts.insert(I, S, E); } 1939dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com iterator insert(iterator I, MachineInstr *M) { return Insts.insert(I, M); } 194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 195ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // erase - Remove the specified element or range from the instruction list. 196ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // These functions delete any instructions removed. 197ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // 198ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org iterator erase(iterator I) { return Insts.erase(I); } 199ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org iterator erase(iterator I, iterator E) { return Insts.erase(I, E); } 200ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MachineInstr *remove(MachineInstr *I) { return Insts.remove(I); } 201357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org void clear() { Insts.clear(); } 202357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 203357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org /// splice - Take a block of instructions from MBB 'Other' in the range [From, 2042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// To), and insert them into this MBB right before 'where'. 2052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void splice(iterator where, MachineBasicBlock *Other, iterator From, 2062c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org iterator To) { 2072c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org Insts.splice(where, Other->Insts, From, To); 2082c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2102c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org // Debugging methods. 2112c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void dump() const; 2122c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void print(std::ostream &OS) const; 2132c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void print(std::ostream *OS) const { if (OS) print(*OS); } 21426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 21526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org /// getNumber - MachineBasicBlocks are uniquely numbered at the function 21626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org /// level, unless they're not in a MachineFunction yet, in which case this 21721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org /// will return -1. 21821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org /// 21921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org int getNumber() const { return Number; } 22021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org void setNumber(int N) { Number = N; } 22121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 22264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgprivate: // Methods used to maintain doubly linked list of blocks... 22321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org friend struct ilist_traits<MachineBasicBlock>; 22464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 2252c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org MachineBasicBlock *getPrev() const { return Prev; } 2262c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org MachineBasicBlock *getNext() const { return Next; } 2272c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void setPrev(MachineBasicBlock *P) { Prev = P; } 2282c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void setNext(MachineBasicBlock *N) { Next = N; } 2292c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2302c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org // Machine-CFG mutators 2312c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2322c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// addPredecessor - Remove pred as a predecessor of this MachineBasicBlock. 2332c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// Don't do this unless you know what you're doing, because it doesn't 2342c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// update pred's successors list. Use pred->addSuccessor instead. 2352c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// 2362c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void addPredecessor(MachineBasicBlock *pred); 2372c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2382c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// removePredecessor - Remove pred as a predecessor of this 2392c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// MachineBasicBlock. Don't do this unless you know what you're 2402c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// doing, because it doesn't update pred's successors list. Use 2412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// pred->removeSuccessor instead. 2422c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org /// 2432c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org void removePredecessor(MachineBasicBlock *pred); 2442c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}; 2452c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2462c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgstd::ostream& operator<<(std::ostream &OS, const MachineBasicBlock &MBB); 2472c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org//===--------------------------------------------------------------------===// 2492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// GraphTraits specializations for machine basic block graphs (machine-CFGs) 250b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org//===--------------------------------------------------------------------===// 251b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 252b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org// Provide specializations of GraphTraits to be able to treat a 253b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org// MachineFunction as a graph of MachineBasicBlocks... 254b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org// 255b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 256b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgtemplate <> struct GraphTraits<MachineBasicBlock *> { 257b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org typedef MachineBasicBlock NodeType; 258b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org typedef MachineBasicBlock::succ_iterator ChildIteratorType; 2592c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2602c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static NodeType *getEntryNode(MachineBasicBlock *BB) { return BB; } 2612c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static inline ChildIteratorType child_begin(NodeType *N) { 2622c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return N->succ_begin(); 2632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static inline ChildIteratorType child_end(NodeType *N) { 2652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return N->succ_end(); 2662c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2672c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}; 2682c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 2692c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgtemplate <> struct GraphTraits<const MachineBasicBlock *> { 2702c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org typedef const MachineBasicBlock NodeType; 2714980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org typedef MachineBasicBlock::const_succ_iterator ChildIteratorType; 2724980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org 27304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org static NodeType *getEntryNode(const MachineBasicBlock *BB) { return BB; } 2744980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org static inline ChildIteratorType child_begin(NodeType *N) { 2754980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org return N->succ_begin(); 2764980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org } 2772c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static inline ChildIteratorType child_end(NodeType *N) { 2782c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return N->succ_end(); 2792c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2802c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}; 28126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org 28226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// Provide specializations of GraphTraits to be able to treat a 28326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// MachineFunction as a graph of MachineBasicBlocks... and to walk it 28426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org// in inverse order. Inverse order for a function is considered 28521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org// to be when traversing the predecessor edges of a MBB 28621b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org// instead of the successor edges. 28721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org// 28821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.orgtemplate <> struct GraphTraits<Inverse<MachineBasicBlock*> > { 28921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org typedef MachineBasicBlock NodeType; 29021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org typedef MachineBasicBlock::pred_iterator ChildIteratorType; 2912c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static NodeType *getEntryNode(Inverse<MachineBasicBlock *> G) { 29221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org return G.Graph; 2932c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static inline ChildIteratorType child_begin(NodeType *N) { 2952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return N->pred_begin(); 2962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 2972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static inline ChildIteratorType child_end(NodeType *N) { 2982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org return N->pred_end(); 2992c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org } 3002c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}; 3012c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 3022c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgtemplate <> struct GraphTraits<Inverse<const MachineBasicBlock*> > { 3032c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org typedef const MachineBasicBlock NodeType; 3042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org typedef MachineBasicBlock::const_pred_iterator ChildIteratorType; 3052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org static NodeType *getEntryNode(Inverse<const MachineBasicBlock*> G) { 30621b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org return G.Graph; 30721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org } 30821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org static inline ChildIteratorType child_begin(NodeType *N) { 30921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org return N->pred_begin(); 31021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org } 311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static inline ChildIteratorType child_end(NodeType *N) { 312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return N->pred_end(); 313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} // End llvm namespace 3172c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org 3182c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org#endif 3192c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org