1 //===- SchedGraphCommon.cpp - Scheduling Graphs Base Class- ---------------===//
3 // The LLVM Compiler Infrastructure
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.
8 //===----------------------------------------------------------------------===//
10 // Scheduling graph base class that contains common information for SchedGraph
11 // and ModuloSchedGraph scheduling graphs.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/CodeGen/SchedGraphCommon.h"
16 #include "llvm/ADT/STLExtras.h"
22 class SchedGraphCommon;
25 // class SchedGraphEdge
27 SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
28 SchedGraphNodeCommon* _sink,
29 SchedGraphEdgeDepType _depType,
30 unsigned int _depOrderType,
32 : src(_src), sink(_sink), depType(_depType), depOrderType(_depOrderType),
33 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(NULL) {
36 assert(src != sink && "Self-loop in scheduling graph!");
37 src->addOutEdge(this);
38 sink->addInEdge(this);
41 SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
42 SchedGraphNodeCommon* _sink,
44 unsigned int _depOrderType,
46 : src(_src), sink(_sink), depType(ValueDep), depOrderType(_depOrderType),
47 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(_val) {
49 assert(src != sink && "Self-loop in scheduling graph!");
50 src->addOutEdge(this);
51 sink->addInEdge(this);
54 SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
55 SchedGraphNodeCommon* _sink,
57 unsigned int _depOrderType,
59 : src(_src), sink(_sink), depType(MachineRegister),
60 depOrderType(_depOrderType),
61 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
62 machineRegNum(_regNum) {
64 assert(src != sink && "Self-loop in scheduling graph!");
65 src->addOutEdge(this);
66 sink->addInEdge(this);
69 SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
70 SchedGraphNodeCommon* _sink,
71 ResourceId _resourceId,
73 : src(_src), sink(_sink), depType(MachineResource), depOrderType(NonDataDep),
74 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
75 resourceId(_resourceId) {
77 assert(src != sink && "Self-loop in scheduling graph!");
78 src->addOutEdge(this);
79 sink->addInEdge(this);
83 void SchedGraphEdge::dump(int indent) const {
84 std::cerr << std::string(indent*2, ' ') << *this;
88 SchedGraphNodeCommon::~SchedGraphNodeCommon()
90 // for each node, delete its out-edges
91 std::for_each(beginOutEdges(), endOutEdges(),
92 deleter<SchedGraphEdge>);
95 void SchedGraphNodeCommon::removeInEdge(const SchedGraphEdge* edge) {
96 assert(edge->getSink() == this);
98 for (iterator I = beginInEdges(); I != endInEdges(); ++I)
105 void SchedGraphNodeCommon::removeOutEdge(const SchedGraphEdge* edge) {
106 assert(edge->getSrc() == this);
108 for (iterator I = beginOutEdges(); I != endOutEdges(); ++I)
115 void SchedGraphNodeCommon::dump(int indent) const {
116 std::cerr << std::string(indent*2, ' ') << *this;
119 //class SchedGraphCommon
121 SchedGraphCommon::~SchedGraphCommon() {
127 void SchedGraphCommon::eraseIncomingEdges(SchedGraphNodeCommon* node,
128 bool addDummyEdges) {
129 // Delete and disconnect all in-edges for the node
130 for (SchedGraphNodeCommon::iterator I = node->beginInEdges();
131 I != node->endInEdges(); ++I) {
132 SchedGraphNodeCommon* srcNode = (*I)->getSrc();
133 srcNode->removeOutEdge(*I);
136 if (addDummyEdges && srcNode != getRoot() &&
137 srcNode->beginOutEdges() == srcNode->endOutEdges()) {
139 // srcNode has no more out edges, so add an edge to dummy EXIT node
140 assert(node != getLeaf() && "Adding edge that was just removed?");
141 (void) new SchedGraphEdge(srcNode, getLeaf(),
142 SchedGraphEdge::CtrlDep,
143 SchedGraphEdge::NonDataDep, 0);
147 node->inEdges.clear();
150 void SchedGraphCommon::eraseOutgoingEdges(SchedGraphNodeCommon* node,
151 bool addDummyEdges) {
152 // Delete and disconnect all out-edges for the node
153 for (SchedGraphNodeCommon::iterator I = node->beginOutEdges();
154 I != node->endOutEdges(); ++I) {
155 SchedGraphNodeCommon* sinkNode = (*I)->getSink();
156 sinkNode->removeInEdge(*I);
160 sinkNode != getLeaf() &&
161 sinkNode->beginInEdges() == sinkNode->endInEdges()) {
163 //sinkNode has no more in edges, so add an edge from dummy ENTRY node
164 assert(node != getRoot() && "Adding edge that was just removed?");
165 (void) new SchedGraphEdge(getRoot(), sinkNode,
166 SchedGraphEdge::CtrlDep,
167 SchedGraphEdge::NonDataDep, 0);
171 node->outEdges.clear();
174 void SchedGraphCommon::eraseIncidentEdges(SchedGraphNodeCommon* node,
175 bool addDummyEdges) {
176 this->eraseIncomingEdges(node, addDummyEdges);
177 this->eraseOutgoingEdges(node, addDummyEdges);
180 } // End llvm namespace