blob: c3f7b6995f757e4720e14f4f1856fb184c10e073 [file] [log] [blame]
Tanya Lattner48a503b2004-03-01 02:50:57 +00001//===-- MSchedGraph.h - Scheduling Graph ------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Tanya Lattner13417b52005-03-23 01:47:20 +000010// A graph class for dependencies. This graph only contains true, anti, and
11// output data dependencies for a given MachineBasicBlock. Dependencies
12// across iterations are also computed. Unless data dependence analysis
Misha Brukmanb4402432005-04-21 23:30:14 +000013// is provided, a conservative approach of adding dependencies between all
Tanya Lattner13417b52005-03-23 01:47:20 +000014// loads and stores is taken.
Tanya Lattner48a503b2004-03-01 02:50:57 +000015//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_MSCHEDGRAPH_H
18#define LLVM_MSCHEDGRAPH_H
Tanya Lattner91964492005-03-29 20:35:10 +000019#include "DependenceAnalyzer.h"
Tanya Lattner13417b52005-03-23 01:47:20 +000020#include "llvm/Analysis/AliasAnalysis.h"
Tanya Lattner48a503b2004-03-01 02:50:57 +000021#include "llvm/CodeGen/MachineInstr.h"
22#include "llvm/Target/TargetMachine.h"
Tanya Lattner13417b52005-03-23 01:47:20 +000023#include "llvm/Target/TargetData.h"
Reid Spencer7c16caa2004-09-01 22:55:40 +000024#include "llvm/ADT/GraphTraits.h"
25#include "llvm/ADT/STLExtras.h"
26#include "llvm/ADT/iterator"
Tanya Lattner48a503b2004-03-01 02:50:57 +000027#include <vector>
28
29namespace llvm {
Misha Brukmanb4402432005-04-21 23:30:14 +000030
Tanya Lattner48a503b2004-03-01 02:50:57 +000031 class MSchedGraph;
32 class MSchedGraphNode;
33 template<class IteratorType, class NodeType>
34 class MSchedGraphNodeIterator;
35
Tanya Lattner13417b52005-03-23 01:47:20 +000036 //MSchedGraphEdge encapsulates the data dependence between nodes. It
37 //identifies the dependence type, on what, and the iteration
38 //difference
Tanya Lattner48a503b2004-03-01 02:50:57 +000039 struct MSchedGraphEdge {
40 enum DataDepOrderType {
41 TrueDep, AntiDep, OutputDep, NonDataDep
42 };
Misha Brukmanb4402432005-04-21 23:30:14 +000043
Tanya Lattner48a503b2004-03-01 02:50:57 +000044 enum MSchedGraphEdgeType {
Tanya Lattner13417b52005-03-23 01:47:20 +000045 MemoryDep, ValueDep, MachineRegister, BranchDep
Tanya Lattner48a503b2004-03-01 02:50:57 +000046 };
47
Misha Brukmanb4402432005-04-21 23:30:14 +000048 //Get or set edge data
Tanya Lattner48a503b2004-03-01 02:50:57 +000049 MSchedGraphNode *getDest() const { return dest; }
50 unsigned getIteDiff() { return iteDiff; }
51 unsigned getDepOrderType() { return depOrderType; }
Tanya Lattner56807c62005-02-10 17:02:58 +000052 void setDest(MSchedGraphNode *newDest) { dest = newDest; }
Tanya Lattner48a503b2004-03-01 02:50:57 +000053
54 private:
55 friend class MSchedGraphNode;
Misha Brukmanb4402432005-04-21 23:30:14 +000056 MSchedGraphEdge(MSchedGraphNode *destination, MSchedGraphEdgeType type,
57 unsigned deptype, unsigned diff)
Tanya Lattner48a503b2004-03-01 02:50:57 +000058 : dest(destination), depType(type), depOrderType(deptype), iteDiff(diff) {}
Misha Brukmanb4402432005-04-21 23:30:14 +000059
Tanya Lattner48a503b2004-03-01 02:50:57 +000060 MSchedGraphNode *dest;
61 MSchedGraphEdgeType depType;
62 unsigned depOrderType;
63 unsigned iteDiff;
64 };
65
Tanya Lattner13417b52005-03-23 01:47:20 +000066 //MSchedGraphNode represents a machine instruction and its
67 //corresponding latency. Each node also contains a list of its
68 //predecessors and sucessors.
Tanya Lattner48a503b2004-03-01 02:50:57 +000069 class MSchedGraphNode {
Misha Brukmanb4402432005-04-21 23:30:14 +000070
Tanya Lattner48a503b2004-03-01 02:50:57 +000071 const MachineInstr* Inst; //Machine Instruction
72 MSchedGraph* Parent; //Graph this node belongs to
Tanya Lattner341828e2004-11-28 23:36:15 +000073 unsigned index; //Index in BB
Tanya Lattner48a503b2004-03-01 02:50:57 +000074 unsigned latency; //Latency of Instruction
Tanya Lattnera066df62004-05-26 06:27:18 +000075 bool isBranchInstr; //Is this node the branch instr or not
Misha Brukmanb4402432005-04-21 23:30:14 +000076
Tanya Lattner48a503b2004-03-01 02:50:57 +000077 std::vector<MSchedGraphNode*> Predecessors; //Predecessor Nodes
Tanya Lattner13417b52005-03-23 01:47:20 +000078 std::vector<MSchedGraphEdge> Successors; //Successor edges
Tanya Lattner48a503b2004-03-01 02:50:57 +000079
80 public:
Misha Brukmanb4402432005-04-21 23:30:14 +000081 MSchedGraphNode(const MachineInstr *inst, MSchedGraph *graph,
Tanya Lattner341828e2004-11-28 23:36:15 +000082 unsigned index, unsigned late=0, bool isBranch=false);
Tanya Lattner48a503b2004-03-01 02:50:57 +000083
Tanya Lattner56807c62005-02-10 17:02:58 +000084 MSchedGraphNode(const MSchedGraphNode &N);
85
Tanya Lattner13417b52005-03-23 01:47:20 +000086 //Iterators - Predecessor and Succussor
Tanya Lattner48a503b2004-03-01 02:50:57 +000087 typedef std::vector<MSchedGraphNode*>::iterator pred_iterator;
88 pred_iterator pred_begin() { return Predecessors.begin(); }
89 pred_iterator pred_end() { return Predecessors.end(); }
Tanya Lattner56807c62005-02-10 17:02:58 +000090 unsigned pred_size() { return Predecessors.size(); }
91
Tanya Lattner48a503b2004-03-01 02:50:57 +000092 typedef std::vector<MSchedGraphNode*>::const_iterator pred_const_iterator;
93 pred_const_iterator pred_begin() const { return Predecessors.begin(); }
94 pred_const_iterator pred_end() const { return Predecessors.end(); }
Misha Brukmanb4402432005-04-21 23:30:14 +000095
Tanya Lattner48a503b2004-03-01 02:50:57 +000096 typedef MSchedGraphNodeIterator<std::vector<MSchedGraphEdge>::const_iterator,
97 const MSchedGraphNode> succ_const_iterator;
98 succ_const_iterator succ_begin() const;
99 succ_const_iterator succ_end() const;
100
101 typedef MSchedGraphNodeIterator<std::vector<MSchedGraphEdge>::iterator,
102 MSchedGraphNode> succ_iterator;
103 succ_iterator succ_begin();
104 succ_iterator succ_end();
Tanya Lattner56807c62005-02-10 17:02:58 +0000105 unsigned succ_size() { return Successors.size(); }
Tanya Lattnera066df62004-05-26 06:27:18 +0000106
Tanya Lattner13417b52005-03-23 01:47:20 +0000107 //Get or set predecessor nodes, or successor edges
Tanya Lattner56807c62005-02-10 17:02:58 +0000108 void setPredecessor(unsigned index, MSchedGraphNode *dest) {
109 Predecessors[index] = dest;
110 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000111
Tanya Lattner56807c62005-02-10 17:02:58 +0000112 MSchedGraphNode* getPredecessor(unsigned index) {
113 return Predecessors[index];
114 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000115
Tanya Lattner56807c62005-02-10 17:02:58 +0000116 MSchedGraphEdge* getSuccessor(unsigned index) {
117 return &Successors[index];
118 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000119
Tanya Lattner56807c62005-02-10 17:02:58 +0000120 void deleteSuccessor(MSchedGraphNode *node) {
121 for (unsigned i = 0; i != Successors.size(); ++i)
122 if (Successors[i].getDest() == node) {
123 Successors.erase(Successors.begin()+i);
124 node->Predecessors.erase(std::find(node->Predecessors.begin(),
125 node->Predecessors.end(), this));
Tanya Lattner13417b52005-03-23 01:47:20 +0000126 --i; //Decrease index var since we deleted a node
Tanya Lattner56807c62005-02-10 17:02:58 +0000127 }
128 }
129
Misha Brukmanb4402432005-04-21 23:30:14 +0000130 void addOutEdge(MSchedGraphNode *destination,
131 MSchedGraphEdge::MSchedGraphEdgeType type,
Tanya Lattner48a503b2004-03-01 02:50:57 +0000132 unsigned deptype, unsigned diff=0) {
133 Successors.push_back(MSchedGraphEdge(destination, type, deptype,diff));
134 destination->Predecessors.push_back(this);
135 }
Tanya Lattner13417b52005-03-23 01:47:20 +0000136
137 //General methods to get and set data for the node
Tanya Lattner48a503b2004-03-01 02:50:57 +0000138 const MachineInstr* getInst() { return Inst; }
139 MSchedGraph* getParent() { return Parent; }
140 bool hasPredecessors() { return (Predecessors.size() > 0); }
141 bool hasSuccessors() { return (Successors.size() > 0); }
Tanya Lattnerddebd1e2004-10-30 00:39:07 +0000142 unsigned getLatency() { return latency; }
143 unsigned getLatency() const { return latency; }
Tanya Lattner341828e2004-11-28 23:36:15 +0000144 unsigned getIndex() { return index; }
Tanya Lattner56807c62005-02-10 17:02:58 +0000145 unsigned getIteDiff(MSchedGraphNode *succ);
Tanya Lattner48a503b2004-03-01 02:50:57 +0000146 MSchedGraphEdge getInEdge(MSchedGraphNode *pred);
Tanya Lattnera6820d62004-05-08 16:12:10 +0000147 unsigned getInEdgeNum(MSchedGraphNode *pred);
Tanya Lattnera6820d62004-05-08 16:12:10 +0000148 bool isSuccessor(MSchedGraphNode *);
149 bool isPredecessor(MSchedGraphNode *);
Tanya Lattnera066df62004-05-26 06:27:18 +0000150 bool isBranch() { return isBranchInstr; }
Tanya Lattner13417b52005-03-23 01:47:20 +0000151
Tanya Lattner48a503b2004-03-01 02:50:57 +0000152 //Debug support
153 void print(std::ostream &os) const;
Tanya Lattner56807c62005-02-10 17:02:58 +0000154 void setParent(MSchedGraph *p) { Parent = p; }
Tanya Lattner48a503b2004-03-01 02:50:57 +0000155 };
156
Tanya Lattner13417b52005-03-23 01:47:20 +0000157 //Node iterator for graph generation
Tanya Lattner48a503b2004-03-01 02:50:57 +0000158 template<class IteratorType, class NodeType>
159 class MSchedGraphNodeIterator : public forward_iterator<NodeType*, ptrdiff_t> {
160 IteratorType I; // std::vector<MSchedGraphEdge>::iterator or const_iterator
161 public:
162 MSchedGraphNodeIterator(IteratorType i) : I(i) {}
163
164 bool operator==(const MSchedGraphNodeIterator RHS) const { return I == RHS.I; }
165 bool operator!=(const MSchedGraphNodeIterator RHS) const { return I != RHS.I; }
166
167 const MSchedGraphNodeIterator &operator=(const MSchedGraphNodeIterator &RHS) {
168 I = RHS.I;
169 return *this;
170 }
171
172 NodeType* operator*() const {
173 return I->getDest();
174 }
175 NodeType* operator->() const { return operator*(); }
Misha Brukmanb4402432005-04-21 23:30:14 +0000176
Tanya Lattner48a503b2004-03-01 02:50:57 +0000177 MSchedGraphNodeIterator& operator++() { // Preincrement
178 ++I;
179 return *this;
180 }
181 MSchedGraphNodeIterator operator++(int) { // Postincrement
Misha Brukmanb4402432005-04-21 23:30:14 +0000182 MSchedGraphNodeIterator tmp = *this; ++*this; return tmp;
Tanya Lattner48a503b2004-03-01 02:50:57 +0000183 }
184
185 MSchedGraphEdge &getEdge() {
186 return *I;
187 }
188 const MSchedGraphEdge &getEdge() const {
189 return *I;
190 }
191 };
192
193 inline MSchedGraphNode::succ_const_iterator MSchedGraphNode::succ_begin() const {
194 return succ_const_iterator(Successors.begin());
195 }
196 inline MSchedGraphNode::succ_const_iterator MSchedGraphNode::succ_end() const {
197 return succ_const_iterator(Successors.end());
198 }
199 inline MSchedGraphNode::succ_iterator MSchedGraphNode::succ_begin() {
200 return succ_iterator(Successors.begin());
201 }
202 inline MSchedGraphNode::succ_iterator MSchedGraphNode::succ_end() {
203 return succ_iterator(Successors.end());
204 }
205
206 // ostream << operator for MSGraphNode class
Misha Brukmanb4402432005-04-21 23:30:14 +0000207 inline std::ostream &operator<<(std::ostream &os,
Tanya Lattner48a503b2004-03-01 02:50:57 +0000208 const MSchedGraphNode &node) {
209 node.print(os);
210 return os;
211 }
212
213
Tanya Lattner56807c62005-02-10 17:02:58 +0000214 // Provide specializations of GraphTraits to be able to use graph
215 // iterators on the scheduling graph!
216 //
217 template <> struct GraphTraits<MSchedGraphNode*> {
218 typedef MSchedGraphNode NodeType;
219 typedef MSchedGraphNode::succ_iterator ChildIteratorType;
Misha Brukmanb4402432005-04-21 23:30:14 +0000220
221 static inline ChildIteratorType child_begin(NodeType *N) {
222 return N->succ_begin();
Tanya Lattner56807c62005-02-10 17:02:58 +0000223 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000224 static inline ChildIteratorType child_end(NodeType *N) {
Tanya Lattner56807c62005-02-10 17:02:58 +0000225 return N->succ_end();
226 }
227
228 static NodeType *getEntryNode(NodeType* N) { return N; }
229 };
Misha Brukmanb4402432005-04-21 23:30:14 +0000230
Tanya Lattner56807c62005-02-10 17:02:58 +0000231
Tanya Lattner48a503b2004-03-01 02:50:57 +0000232
Tanya Lattner13417b52005-03-23 01:47:20 +0000233 //Graph class to represent dependence graph
Tanya Lattner48a503b2004-03-01 02:50:57 +0000234 class MSchedGraph {
Misha Brukmanb4402432005-04-21 23:30:14 +0000235
Tanya Lattner4d0ee752005-04-30 23:07:59 +0000236 std::vector<const MachineBasicBlock *> BBs; //Machine basic block
Tanya Lattner48a503b2004-03-01 02:50:57 +0000237 const TargetMachine &Target; //Target Machine
Misha Brukmanb4402432005-04-21 23:30:14 +0000238
Tanya Lattner48a503b2004-03-01 02:50:57 +0000239 //Nodes
240 std::map<const MachineInstr*, MSchedGraphNode*> GraphMap;
241
242 //Add Nodes and Edges to this graph for our BB
243 typedef std::pair<int, MSchedGraphNode*> OpIndexNodePair;
Tanya Lattner8d64e9a2005-04-05 16:36:44 +0000244 void buildNodesAndEdges(std::map<const MachineInstr*, unsigned> &ignoreInstrs, DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm);
Misha Brukmanb4402432005-04-21 23:30:14 +0000245 void addValueEdges(std::vector<OpIndexNodePair> &NodesInMap,
Tanya Lattner48a503b2004-03-01 02:50:57 +0000246 MSchedGraphNode *node,
Tanya Lattner13417b52005-03-23 01:47:20 +0000247 bool nodeIsUse, bool nodeIsDef, std::vector<const MachineInstr*> &phiInstrs, int diff=0);
Misha Brukmanb4402432005-04-21 23:30:14 +0000248 void addMachRegEdges(std::map<int,
Tanya Lattner48a503b2004-03-01 02:50:57 +0000249 std::vector<OpIndexNodePair> >& regNumtoNodeMap);
Tanya Lattner8d64e9a2005-04-05 16:36:44 +0000250 void addMemEdges(const std::vector<MSchedGraphNode*>& memInst,
Tanya Lattner91964492005-03-29 20:35:10 +0000251 DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm);
Tanya Lattner13417b52005-03-23 01:47:20 +0000252 void addBranchEdges();
Tanya Lattner48a503b2004-03-01 02:50:57 +0000253
254 public:
Misha Brukmanb4402432005-04-21 23:30:14 +0000255 MSchedGraph(const MachineBasicBlock *bb, const TargetMachine &targ,
256 std::map<const MachineInstr*, unsigned> &ignoreInstrs,
Tanya Lattner91964492005-03-29 20:35:10 +0000257 DependenceAnalyzer &DA, std::map<MachineInstr*, Instruction*> &machineTollvm);
Tanya Lattner13417b52005-03-23 01:47:20 +0000258
259 //Copy constructor with maps to link old nodes to new nodes
Tanya Lattner56807c62005-02-10 17:02:58 +0000260 MSchedGraph(const MSchedGraph &G, std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes);
Tanya Lattner42ed1482005-04-22 06:32:48 +0000261
Tanya Lattnerbdfb9e62005-05-01 01:25:53 +0000262 MSchedGraph(std::vector<const MachineBasicBlock*> &bbs,
263 const TargetMachine &targ,
264 std::map<const MachineInstr*, unsigned> &ignoreInstrs,
265 DependenceAnalyzer &DA,
266 std::map<MachineInstr*, Instruction*> &machineTollvm);
267
Tanya Lattner42ed1482005-04-22 06:32:48 +0000268 //Print graph
269 void print(std::ostream &os) const;
Misha Brukmanb4402432005-04-21 23:30:14 +0000270
Tanya Lattner13417b52005-03-23 01:47:20 +0000271 //Deconstructor!
Tanya Lattner48a503b2004-03-01 02:50:57 +0000272 ~MSchedGraph();
Misha Brukmanb4402432005-04-21 23:30:14 +0000273
Tanya Lattner13417b52005-03-23 01:47:20 +0000274 //Add or delete nodes from the Graph
Tanya Lattner48a503b2004-03-01 02:50:57 +0000275 void addNode(const MachineInstr* MI, MSchedGraphNode *node);
Tanya Lattner56807c62005-02-10 17:02:58 +0000276 void deleteNode(MSchedGraphNode *node);
Tanya Lattner42ed1482005-04-22 06:32:48 +0000277 int totalDelay();
Tanya Lattner56807c62005-02-10 17:02:58 +0000278
Misha Brukmanb4402432005-04-21 23:30:14 +0000279 //iterators
Tanya Lattner48a503b2004-03-01 02:50:57 +0000280 typedef std::map<const MachineInstr*, MSchedGraphNode*>::iterator iterator;
281 typedef std::map<const MachineInstr*, MSchedGraphNode*>::const_iterator const_iterator;
282 typedef std::map<const MachineInstr*, MSchedGraphNode*>::reverse_iterator reverse_iterator;
283 iterator find(const MachineInstr* I) { return GraphMap.find(I); }
284 iterator end() { return GraphMap.end(); }
285 iterator begin() { return GraphMap.begin(); }
Tanya Lattner56807c62005-02-10 17:02:58 +0000286 unsigned size() { return GraphMap.size(); }
Tanya Lattner48a503b2004-03-01 02:50:57 +0000287 reverse_iterator rbegin() { return GraphMap.rbegin(); }
288 reverse_iterator rend() { return GraphMap.rend(); }
Tanya Lattner13417b52005-03-23 01:47:20 +0000289
290 //Get Target or original machine basic block
Tanya Lattnera066df62004-05-26 06:27:18 +0000291 const TargetMachine* getTarget() { return &Target; }
Tanya Lattner4d0ee752005-04-30 23:07:59 +0000292 std::vector<const MachineBasicBlock*> getBBs() { return BBs; }
Tanya Lattner48a503b2004-03-01 02:50:57 +0000293 };
294
Tanya Lattner48a503b2004-03-01 02:50:57 +0000295
Misha Brukmanb4402432005-04-21 23:30:14 +0000296
Tanya Lattner48a503b2004-03-01 02:50:57 +0000297
298
299 // Provide specializations of GraphTraits to be able to use graph
Tanya Lattner13417b52005-03-23 01:47:20 +0000300 // iterators on the scheduling graph
301 static MSchedGraphNode& getSecond(std::pair<const MachineInstr* const,
302 MSchedGraphNode*> &Pair) {
303 return *Pair.second;
304 }
305
Tanya Lattner48a503b2004-03-01 02:50:57 +0000306 template <> struct GraphTraits<MSchedGraph*> {
307 typedef MSchedGraphNode NodeType;
308 typedef MSchedGraphNode::succ_iterator ChildIteratorType;
Misha Brukmanb4402432005-04-21 23:30:14 +0000309
310 static inline ChildIteratorType child_begin(NodeType *N) {
311 return N->succ_begin();
Tanya Lattner48a503b2004-03-01 02:50:57 +0000312 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000313 static inline ChildIteratorType child_end(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000314 return N->succ_end();
315 }
316
317 typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
318 MSchedGraphNode*>&, MSchedGraphNode&> DerefFun;
319
320 typedef mapped_iterator<MSchedGraph::iterator, DerefFun> nodes_iterator;
321 static nodes_iterator nodes_begin(MSchedGraph *G) {
322 return map_iterator(((MSchedGraph*)G)->begin(), DerefFun(getSecond));
323 }
324 static nodes_iterator nodes_end(MSchedGraph *G) {
325 return map_iterator(((MSchedGraph*)G)->end(), DerefFun(getSecond));
326 }
Tanya Lattner48a503b2004-03-01 02:50:57 +0000327
328 };
Misha Brukmanb4402432005-04-21 23:30:14 +0000329
Tanya Lattner48a503b2004-03-01 02:50:57 +0000330 template <> struct GraphTraits<const MSchedGraph*> {
331 typedef const MSchedGraphNode NodeType;
332 typedef MSchedGraphNode::succ_const_iterator ChildIteratorType;
Misha Brukmanb4402432005-04-21 23:30:14 +0000333
334 static inline ChildIteratorType child_begin(NodeType *N) {
335 return N->succ_begin();
Tanya Lattner48a503b2004-03-01 02:50:57 +0000336 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000337 static inline ChildIteratorType child_end(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000338 return N->succ_end();
339 }
340 typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
341 MSchedGraphNode*>&, MSchedGraphNode&> DerefFun;
Misha Brukmanb4402432005-04-21 23:30:14 +0000342
Tanya Lattner48a503b2004-03-01 02:50:57 +0000343 typedef mapped_iterator<MSchedGraph::iterator, DerefFun> nodes_iterator;
344 static nodes_iterator nodes_begin(MSchedGraph *G) {
345 return map_iterator(((MSchedGraph*)G)->begin(), DerefFun(getSecond));
346 }
347 static nodes_iterator nodes_end(MSchedGraph *G) {
348 return map_iterator(((MSchedGraph*)G)->end(), DerefFun(getSecond));
349 }
350 };
Misha Brukmanb4402432005-04-21 23:30:14 +0000351
Tanya Lattner48a503b2004-03-01 02:50:57 +0000352 template <> struct GraphTraits<Inverse<MSchedGraph*> > {
353 typedef MSchedGraphNode NodeType;
354 typedef MSchedGraphNode::pred_iterator ChildIteratorType;
Misha Brukmanb4402432005-04-21 23:30:14 +0000355
356 static inline ChildIteratorType child_begin(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000357 return N->pred_begin();
358 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000359 static inline ChildIteratorType child_end(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000360 return N->pred_end();
361 }
362 typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
363 MSchedGraphNode*>&, MSchedGraphNode&> DerefFun;
364
365 typedef mapped_iterator<MSchedGraph::iterator, DerefFun> nodes_iterator;
366 static nodes_iterator nodes_begin(MSchedGraph *G) {
367 return map_iterator(((MSchedGraph*)G)->begin(), DerefFun(getSecond));
368 }
369 static nodes_iterator nodes_end(MSchedGraph *G) {
370 return map_iterator(((MSchedGraph*)G)->end(), DerefFun(getSecond));
371 }
372 };
Misha Brukmanb4402432005-04-21 23:30:14 +0000373
Tanya Lattner48a503b2004-03-01 02:50:57 +0000374 template <> struct GraphTraits<Inverse<const MSchedGraph*> > {
375 typedef const MSchedGraphNode NodeType;
376 typedef MSchedGraphNode::pred_const_iterator ChildIteratorType;
Misha Brukmanb4402432005-04-21 23:30:14 +0000377
378 static inline ChildIteratorType child_begin(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000379 return N->pred_begin();
380 }
Misha Brukmanb4402432005-04-21 23:30:14 +0000381 static inline ChildIteratorType child_end(NodeType *N) {
Tanya Lattner48a503b2004-03-01 02:50:57 +0000382 return N->pred_end();
383 }
384
385 typedef std::pointer_to_unary_function<std::pair<const MachineInstr* const,
386 MSchedGraphNode*>&, MSchedGraphNode&> DerefFun;
Misha Brukmanb4402432005-04-21 23:30:14 +0000387
Tanya Lattner48a503b2004-03-01 02:50:57 +0000388 typedef mapped_iterator<MSchedGraph::iterator, DerefFun> nodes_iterator;
389 static nodes_iterator nodes_begin(MSchedGraph *G) {
390 return map_iterator(((MSchedGraph*)G)->begin(), DerefFun(getSecond));
391 }
392 static nodes_iterator nodes_end(MSchedGraph *G) {
393 return map_iterator(((MSchedGraph*)G)->end(), DerefFun(getSecond));
394 }
395 };
Tanya Lattner48a503b2004-03-01 02:50:57 +0000396}
397
398#endif