diff options
Diffstat (limited to 'lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h')
-rw-r--r-- | lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h | 65 |
1 files changed, 57 insertions, 8 deletions
diff --git a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h index 36b76324cb..4a341ef3c6 100644 --- a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h +++ b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h @@ -41,6 +41,7 @@ namespace llvm { MSchedGraphNode *getDest() const { return dest; } unsigned getIteDiff() { return iteDiff; } unsigned getDepOrderType() { return depOrderType; } + void setDest(MSchedGraphNode *newDest) { dest = newDest; } private: friend class MSchedGraphNode; @@ -70,15 +71,18 @@ namespace llvm { MSchedGraphNode(const MachineInstr *inst, MSchedGraph *graph, unsigned index, unsigned late=0, bool isBranch=false); + MSchedGraphNode(const MSchedGraphNode &N); + //Iterators typedef std::vector<MSchedGraphNode*>::iterator pred_iterator; pred_iterator pred_begin() { return Predecessors.begin(); } pred_iterator pred_end() { return Predecessors.end(); } - + unsigned pred_size() { return Predecessors.size(); } + typedef std::vector<MSchedGraphNode*>::const_iterator pred_const_iterator; pred_const_iterator pred_begin() const { return Predecessors.begin(); } pred_const_iterator pred_end() const { return Predecessors.end(); } - + // Successor iterators. typedef MSchedGraphNodeIterator<std::vector<MSchedGraphEdge>::const_iterator, const MSchedGraphNode> succ_const_iterator; @@ -89,8 +93,32 @@ namespace llvm { MSchedGraphNode> succ_iterator; succ_iterator succ_begin(); succ_iterator succ_end(); + + unsigned succ_size() { return Successors.size(); } + + void setPredecessor(unsigned index, MSchedGraphNode *dest) { + Predecessors[index] = dest; + } + + MSchedGraphNode* getPredecessor(unsigned index) { + return Predecessors[index]; + } + + MSchedGraphEdge* getSuccessor(unsigned index) { + return &Successors[index]; + } + + void deleteSuccessor(MSchedGraphNode *node) { + for (unsigned i = 0; i != Successors.size(); ++i) + if (Successors[i].getDest() == node) { + Successors.erase(Successors.begin()+i); + node->Predecessors.erase(std::find(node->Predecessors.begin(), + node->Predecessors.end(), this)); + --i; + } + } + - void addOutEdge(MSchedGraphNode *destination, MSchedGraphEdge::MSchedGraphEdgeType type, @@ -105,15 +133,15 @@ namespace llvm { unsigned getLatency() { return latency; } unsigned getLatency() const { return latency; } unsigned getIndex() { return index; } + unsigned getIteDiff(MSchedGraphNode *succ); MSchedGraphEdge getInEdge(MSchedGraphNode *pred); unsigned getInEdgeNum(MSchedGraphNode *pred); - bool isSuccessor(MSchedGraphNode *); bool isPredecessor(MSchedGraphNode *); bool isBranch() { return isBranchInstr; } //Debug support void print(std::ostream &os) const; - + void setParent(MSchedGraph *p) { Parent = p; } }; template<class IteratorType, class NodeType> @@ -172,6 +200,24 @@ namespace llvm { } + // Provide specializations of GraphTraits to be able to use graph + // iterators on the scheduling graph! + // + template <> struct GraphTraits<MSchedGraphNode*> { + typedef MSchedGraphNode NodeType; + typedef MSchedGraphNode::succ_iterator ChildIteratorType; + + static inline ChildIteratorType child_begin(NodeType *N) { + return N->succ_begin(); + } + static inline ChildIteratorType child_end(NodeType *N) { + return N->succ_end(); + } + + static NodeType *getEntryNode(NodeType* N) { return N; } + }; + + class MSchedGraph { @@ -193,11 +239,13 @@ namespace llvm { public: MSchedGraph(const MachineBasicBlock *bb, const TargetMachine &targ); + MSchedGraph(const MSchedGraph &G, std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes); ~MSchedGraph(); //Add Nodes to the Graph void addNode(const MachineInstr* MI, MSchedGraphNode *node); - + void deleteNode(MSchedGraphNode *node); + //iterators typedef std::map<const MachineInstr*, MSchedGraphNode*>::iterator iterator; typedef std::map<const MachineInstr*, MSchedGraphNode*>::const_iterator const_iterator; @@ -205,9 +253,11 @@ namespace llvm { iterator find(const MachineInstr* I) { return GraphMap.find(I); } iterator end() { return GraphMap.end(); } iterator begin() { return GraphMap.begin(); } + unsigned size() { return GraphMap.size(); } reverse_iterator rbegin() { return GraphMap.rbegin(); } reverse_iterator rend() { return GraphMap.rend(); } const TargetMachine* getTarget() { return &Target; } + const MachineBasicBlock* getBB() { return BB; } }; @@ -242,14 +292,13 @@ namespace llvm { static nodes_iterator nodes_end(MSchedGraph *G) { return map_iterator(((MSchedGraph*)G)->end(), DerefFun(getSecond)); } - }; template <> struct GraphTraits<const MSchedGraph*> { typedef const MSchedGraphNode NodeType; typedef MSchedGraphNode::succ_const_iterator ChildIteratorType; - + static inline ChildIteratorType child_begin(NodeType *N) { return N->succ_begin(); } |