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