blob: b75e3397cb99ad7b6198a9c2582bcf9bf06a60f0 [file] [log] [blame]
Tanya Lattnerc50ee552003-08-27 02:42:58 +00001//===- SchedGraphCommon.cpp - Scheduling Graphs Base Class- ---------------===//
John Criswellb576c942003-10-20 19:43:21 +00002//
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//===----------------------------------------------------------------------===//
Tanya Lattnerc50ee552003-08-27 02:42:58 +00009//
10// Scheduling graph base class that contains common information for SchedGraph
11// and ModuloSchedGraph scheduling graphs.
12//
13//===----------------------------------------------------------------------===//
14
Tanya Lattnerb6489f32003-08-25 22:42:20 +000015#include "llvm/CodeGen/SchedGraphCommon.h"
16#include "Support/STLExtras.h"
17
18class SchedGraphCommon;
19
Tanya Lattnerc50ee552003-08-27 02:42:58 +000020//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000021// class SchedGraphEdge
22//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000023SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
24 SchedGraphNodeCommon* _sink,
25 SchedGraphEdgeDepType _depType,
26 unsigned int _depOrderType,
27 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000028 : src(_src), sink(_sink), depType(_depType), depOrderType(_depOrderType),
29 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(NULL) {
30
Tanya Lattnerb6489f32003-08-25 22:42:20 +000031 iteDiff=0;
32 assert(src != sink && "Self-loop in scheduling graph!");
33 src->addOutEdge(this);
34 sink->addInEdge(this);
35}
36
Tanya Lattnerb6489f32003-08-25 22:42:20 +000037SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
38 SchedGraphNodeCommon* _sink,
39 const Value* _val,
40 unsigned int _depOrderType,
41 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000042 : src(_src), sink(_sink), depType(ValueDep), depOrderType(_depOrderType),
43 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(_val) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000044 iteDiff=0;
45 assert(src != sink && "Self-loop in scheduling graph!");
46 src->addOutEdge(this);
47 sink->addInEdge(this);
48}
49
Tanya Lattnerb6489f32003-08-25 22:42:20 +000050SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
51 SchedGraphNodeCommon* _sink,
52 unsigned int _regNum,
53 unsigned int _depOrderType,
54 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000055 : src(_src), sink(_sink), depType(MachineRegister),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000056 depOrderType(_depOrderType),
57 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000058 machineRegNum(_regNum) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000059 iteDiff=0;
60 assert(src != sink && "Self-loop in scheduling graph!");
61 src->addOutEdge(this);
62 sink->addInEdge(this);
63}
64
Tanya Lattnerb6489f32003-08-25 22:42:20 +000065SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
66 SchedGraphNodeCommon* _sink,
67 ResourceId _resourceId,
68 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000069 : src(_src), sink(_sink), depType(MachineResource), depOrderType(NonDataDep),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000070 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000071 resourceId(_resourceId) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000072 iteDiff=0;
73 assert(src != sink && "Self-loop in scheduling graph!");
74 src->addOutEdge(this);
75 sink->addInEdge(this);
76}
77
Tanya Lattnerc50ee552003-08-27 02:42:58 +000078
79
Tanya Lattnerb6489f32003-08-25 22:42:20 +000080
81void SchedGraphEdge::dump(int indent) const {
82 std::cerr << std::string(indent*2, ' ') << *this;
83}
84
Tanya Lattnerb6489f32003-08-25 22:42:20 +000085/*dtor*/
86SchedGraphNodeCommon::~SchedGraphNodeCommon()
87{
88 // for each node, delete its out-edges
89 std::for_each(beginOutEdges(), endOutEdges(),
90 deleter<SchedGraphEdge>);
91}
92
Tanya Lattnerc50ee552003-08-27 02:42:58 +000093void SchedGraphNodeCommon::removeInEdge(const SchedGraphEdge* edge) {
94 assert(edge->getSink() == this);
95
96 for (iterator I = beginInEdges(); I != endInEdges(); ++I)
97 if ((*I) == edge) {
98 inEdges.erase(I);
99 break;
100 }
101}
102
103void SchedGraphNodeCommon::removeOutEdge(const SchedGraphEdge* edge) {
104 assert(edge->getSrc() == this);
105
106 for (iterator I = beginOutEdges(); I != endOutEdges(); ++I)
107 if ((*I) == edge) {
108 outEdges.erase(I);
109 break;
110 }
111}
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000112
113void SchedGraphNodeCommon::dump(int indent) const {
114 std::cerr << std::string(indent*2, ' ') << *this;
115}
116
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000117//class SchedGraphCommon
118
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000119SchedGraphCommon::~SchedGraphCommon() {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000120 delete graphRoot;
121 delete graphLeaf;
122}
123
124
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000125void SchedGraphCommon::eraseIncomingEdges(SchedGraphNodeCommon* node,
126 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000127 // Delete and disconnect all in-edges for the node
128 for (SchedGraphNodeCommon::iterator I = node->beginInEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000129 I != node->endInEdges(); ++I) {
130 SchedGraphNodeCommon* srcNode = (*I)->getSrc();
131 srcNode->removeOutEdge(*I);
132 delete *I;
133
134 if (addDummyEdges && srcNode != getRoot() &&
135 srcNode->beginOutEdges() == srcNode->endOutEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000136
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000137 // srcNode has no more out edges, so add an edge to dummy EXIT node
138 assert(node != getLeaf() && "Adding edge that was just removed?");
139 (void) new SchedGraphEdge(srcNode, getLeaf(),
140 SchedGraphEdge::CtrlDep,
141 SchedGraphEdge::NonDataDep, 0);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000142 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000143 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000144
145 node->inEdges.clear();
146}
147
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000148void SchedGraphCommon::eraseOutgoingEdges(SchedGraphNodeCommon* node,
149 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000150 // Delete and disconnect all out-edges for the node
151 for (SchedGraphNodeCommon::iterator I = node->beginOutEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000152 I != node->endOutEdges(); ++I) {
153 SchedGraphNodeCommon* sinkNode = (*I)->getSink();
154 sinkNode->removeInEdge(*I);
155 delete *I;
156
157 if (addDummyEdges &&
158 sinkNode != getLeaf() &&
159 sinkNode->beginInEdges() == sinkNode->endInEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000160
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000161 //sinkNode has no more in edges, so add an edge from dummy ENTRY node
162 assert(node != getRoot() && "Adding edge that was just removed?");
163 (void) new SchedGraphEdge(getRoot(), sinkNode,
164 SchedGraphEdge::CtrlDep,
165 SchedGraphEdge::NonDataDep, 0);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000166 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000167 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000168
169 node->outEdges.clear();
170}
171
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000172void SchedGraphCommon::eraseIncidentEdges(SchedGraphNodeCommon* node,
173 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000174 this->eraseIncomingEdges(node, addDummyEdges);
175 this->eraseOutgoingEdges(node, addDummyEdges);
176}
177