blob: d96c201c8a2cf3c717a56aaa89a3e17c4a697f53 [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
Brian Gaeked0fde302003-11-11 22:41:34 +000018namespace llvm {
19
Tanya Lattnerb6489f32003-08-25 22:42:20 +000020class SchedGraphCommon;
21
Tanya Lattnerc50ee552003-08-27 02:42:58 +000022//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000023// class SchedGraphEdge
24//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000025SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
26 SchedGraphNodeCommon* _sink,
27 SchedGraphEdgeDepType _depType,
28 unsigned int _depOrderType,
29 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000030 : src(_src), sink(_sink), depType(_depType), depOrderType(_depOrderType),
31 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(NULL) {
32
Tanya Lattnerb6489f32003-08-25 22:42:20 +000033 iteDiff=0;
34 assert(src != sink && "Self-loop in scheduling graph!");
35 src->addOutEdge(this);
36 sink->addInEdge(this);
37}
38
Tanya Lattnerb6489f32003-08-25 22:42:20 +000039SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
40 SchedGraphNodeCommon* _sink,
41 const Value* _val,
42 unsigned int _depOrderType,
43 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000044 : src(_src), sink(_sink), depType(ValueDep), depOrderType(_depOrderType),
45 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(_val) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000046 iteDiff=0;
47 assert(src != sink && "Self-loop in scheduling graph!");
48 src->addOutEdge(this);
49 sink->addInEdge(this);
50}
51
Tanya Lattnerb6489f32003-08-25 22:42:20 +000052SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
53 SchedGraphNodeCommon* _sink,
54 unsigned int _regNum,
55 unsigned int _depOrderType,
56 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000057 : src(_src), sink(_sink), depType(MachineRegister),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000058 depOrderType(_depOrderType),
59 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000060 machineRegNum(_regNum) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000061 iteDiff=0;
62 assert(src != sink && "Self-loop in scheduling graph!");
63 src->addOutEdge(this);
64 sink->addInEdge(this);
65}
66
Tanya Lattnerb6489f32003-08-25 22:42:20 +000067SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
68 SchedGraphNodeCommon* _sink,
69 ResourceId _resourceId,
70 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000071 : src(_src), sink(_sink), depType(MachineResource), depOrderType(NonDataDep),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000072 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000073 resourceId(_resourceId) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000074 iteDiff=0;
75 assert(src != sink && "Self-loop in scheduling graph!");
76 src->addOutEdge(this);
77 sink->addInEdge(this);
78}
79
Tanya Lattnerc50ee552003-08-27 02:42:58 +000080
81
Tanya Lattnerb6489f32003-08-25 22:42:20 +000082
83void SchedGraphEdge::dump(int indent) const {
84 std::cerr << std::string(indent*2, ' ') << *this;
85}
86
Tanya Lattnerb6489f32003-08-25 22:42:20 +000087/*dtor*/
88SchedGraphNodeCommon::~SchedGraphNodeCommon()
89{
90 // for each node, delete its out-edges
91 std::for_each(beginOutEdges(), endOutEdges(),
92 deleter<SchedGraphEdge>);
93}
94
Tanya Lattnerc50ee552003-08-27 02:42:58 +000095void SchedGraphNodeCommon::removeInEdge(const SchedGraphEdge* edge) {
96 assert(edge->getSink() == this);
97
98 for (iterator I = beginInEdges(); I != endInEdges(); ++I)
99 if ((*I) == edge) {
100 inEdges.erase(I);
101 break;
102 }
103}
104
105void SchedGraphNodeCommon::removeOutEdge(const SchedGraphEdge* edge) {
106 assert(edge->getSrc() == this);
107
108 for (iterator I = beginOutEdges(); I != endOutEdges(); ++I)
109 if ((*I) == edge) {
110 outEdges.erase(I);
111 break;
112 }
113}
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000114
115void SchedGraphNodeCommon::dump(int indent) const {
116 std::cerr << std::string(indent*2, ' ') << *this;
117}
118
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000119//class SchedGraphCommon
120
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000121SchedGraphCommon::~SchedGraphCommon() {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000122 delete graphRoot;
123 delete graphLeaf;
124}
125
126
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000127void SchedGraphCommon::eraseIncomingEdges(SchedGraphNodeCommon* node,
128 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000129 // Delete and disconnect all in-edges for the node
130 for (SchedGraphNodeCommon::iterator I = node->beginInEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000131 I != node->endInEdges(); ++I) {
132 SchedGraphNodeCommon* srcNode = (*I)->getSrc();
133 srcNode->removeOutEdge(*I);
134 delete *I;
135
136 if (addDummyEdges && srcNode != getRoot() &&
137 srcNode->beginOutEdges() == srcNode->endOutEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000138
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000139 // 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);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000144 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000145 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000146
147 node->inEdges.clear();
148}
149
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000150void SchedGraphCommon::eraseOutgoingEdges(SchedGraphNodeCommon* node,
151 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000152 // Delete and disconnect all out-edges for the node
153 for (SchedGraphNodeCommon::iterator I = node->beginOutEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000154 I != node->endOutEdges(); ++I) {
155 SchedGraphNodeCommon* sinkNode = (*I)->getSink();
156 sinkNode->removeInEdge(*I);
157 delete *I;
158
159 if (addDummyEdges &&
160 sinkNode != getLeaf() &&
161 sinkNode->beginInEdges() == sinkNode->endInEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000162
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000163 //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);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000168 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000169 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000170
171 node->outEdges.clear();
172}
173
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000174void SchedGraphCommon::eraseIncidentEdges(SchedGraphNodeCommon* node,
175 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000176 this->eraseIncomingEdges(node, addDummyEdges);
177 this->eraseOutgoingEdges(node, addDummyEdges);
178}
179
Brian Gaeked0fde302003-11-11 22:41:34 +0000180} // End llvm namespace