blob: da4492f359d0ff51c6d9f3db90eb5b8bdcb275e0 [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"
Reid Spencer954da372004-07-04 12:19:56 +000017#include <iostream>
Tanya Lattnerb6489f32003-08-25 22:42:20 +000018
Brian Gaeked0fde302003-11-11 22:41:34 +000019namespace llvm {
20
Tanya Lattnerb6489f32003-08-25 22:42:20 +000021class SchedGraphCommon;
22
Tanya Lattnerc50ee552003-08-27 02:42:58 +000023//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000024// class SchedGraphEdge
25//
Tanya Lattnerb6489f32003-08-25 22:42:20 +000026SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
27 SchedGraphNodeCommon* _sink,
28 SchedGraphEdgeDepType _depType,
29 unsigned int _depOrderType,
30 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000031 : src(_src), sink(_sink), depType(_depType), depOrderType(_depOrderType),
32 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(NULL) {
33
Tanya Lattnerb6489f32003-08-25 22:42:20 +000034 iteDiff=0;
35 assert(src != sink && "Self-loop in scheduling graph!");
36 src->addOutEdge(this);
37 sink->addInEdge(this);
38}
39
Tanya Lattnerb6489f32003-08-25 22:42:20 +000040SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
41 SchedGraphNodeCommon* _sink,
42 const Value* _val,
43 unsigned int _depOrderType,
44 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000045 : src(_src), sink(_sink), depType(ValueDep), depOrderType(_depOrderType),
46 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()), val(_val) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000047 iteDiff=0;
48 assert(src != sink && "Self-loop in scheduling graph!");
49 src->addOutEdge(this);
50 sink->addInEdge(this);
51}
52
Tanya Lattnerb6489f32003-08-25 22:42:20 +000053SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
54 SchedGraphNodeCommon* _sink,
55 unsigned int _regNum,
56 unsigned int _depOrderType,
57 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000058 : src(_src), sink(_sink), depType(MachineRegister),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000059 depOrderType(_depOrderType),
60 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000061 machineRegNum(_regNum) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000062 iteDiff=0;
63 assert(src != sink && "Self-loop in scheduling graph!");
64 src->addOutEdge(this);
65 sink->addInEdge(this);
66}
67
Tanya Lattnerb6489f32003-08-25 22:42:20 +000068SchedGraphEdge::SchedGraphEdge(SchedGraphNodeCommon* _src,
69 SchedGraphNodeCommon* _sink,
70 ResourceId _resourceId,
71 int _minDelay)
Tanya Lattnerc50ee552003-08-27 02:42:58 +000072 : src(_src), sink(_sink), depType(MachineResource), depOrderType(NonDataDep),
Tanya Lattnerb6489f32003-08-25 22:42:20 +000073 minDelay((_minDelay >= 0)? _minDelay : _src->getLatency()),
Tanya Lattnerc50ee552003-08-27 02:42:58 +000074 resourceId(_resourceId) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +000075 iteDiff=0;
76 assert(src != sink && "Self-loop in scheduling graph!");
77 src->addOutEdge(this);
78 sink->addInEdge(this);
79}
80
Tanya Lattnerc50ee552003-08-27 02:42:58 +000081
Tanya Lattnerb6489f32003-08-25 22:42:20 +000082void SchedGraphEdge::dump(int indent) const {
83 std::cerr << std::string(indent*2, ' ') << *this;
84}
85
Tanya Lattnerb6489f32003-08-25 22:42:20 +000086/*dtor*/
87SchedGraphNodeCommon::~SchedGraphNodeCommon()
88{
89 // for each node, delete its out-edges
90 std::for_each(beginOutEdges(), endOutEdges(),
91 deleter<SchedGraphEdge>);
92}
93
Tanya Lattnerc50ee552003-08-27 02:42:58 +000094void SchedGraphNodeCommon::removeInEdge(const SchedGraphEdge* edge) {
95 assert(edge->getSink() == this);
96
97 for (iterator I = beginInEdges(); I != endInEdges(); ++I)
98 if ((*I) == edge) {
99 inEdges.erase(I);
100 break;
101 }
102}
103
104void SchedGraphNodeCommon::removeOutEdge(const SchedGraphEdge* edge) {
105 assert(edge->getSrc() == this);
106
107 for (iterator I = beginOutEdges(); I != endOutEdges(); ++I)
108 if ((*I) == edge) {
109 outEdges.erase(I);
110 break;
111 }
112}
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000113
114void SchedGraphNodeCommon::dump(int indent) const {
115 std::cerr << std::string(indent*2, ' ') << *this;
116}
117
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000118//class SchedGraphCommon
119
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000120SchedGraphCommon::~SchedGraphCommon() {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000121 delete graphRoot;
122 delete graphLeaf;
123}
124
125
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000126void SchedGraphCommon::eraseIncomingEdges(SchedGraphNodeCommon* node,
127 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000128 // Delete and disconnect all in-edges for the node
129 for (SchedGraphNodeCommon::iterator I = node->beginInEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000130 I != node->endInEdges(); ++I) {
131 SchedGraphNodeCommon* srcNode = (*I)->getSrc();
132 srcNode->removeOutEdge(*I);
133 delete *I;
134
135 if (addDummyEdges && srcNode != getRoot() &&
136 srcNode->beginOutEdges() == srcNode->endOutEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000137
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000138 // srcNode has no more out edges, so add an edge to dummy EXIT node
139 assert(node != getLeaf() && "Adding edge that was just removed?");
140 (void) new SchedGraphEdge(srcNode, getLeaf(),
141 SchedGraphEdge::CtrlDep,
142 SchedGraphEdge::NonDataDep, 0);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000143 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000144 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000145
146 node->inEdges.clear();
147}
148
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000149void SchedGraphCommon::eraseOutgoingEdges(SchedGraphNodeCommon* node,
150 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000151 // Delete and disconnect all out-edges for the node
152 for (SchedGraphNodeCommon::iterator I = node->beginOutEdges();
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000153 I != node->endOutEdges(); ++I) {
154 SchedGraphNodeCommon* sinkNode = (*I)->getSink();
155 sinkNode->removeInEdge(*I);
156 delete *I;
157
158 if (addDummyEdges &&
159 sinkNode != getLeaf() &&
160 sinkNode->beginInEdges() == sinkNode->endInEdges()) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000161
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000162 //sinkNode has no more in edges, so add an edge from dummy ENTRY node
163 assert(node != getRoot() && "Adding edge that was just removed?");
164 (void) new SchedGraphEdge(getRoot(), sinkNode,
165 SchedGraphEdge::CtrlDep,
166 SchedGraphEdge::NonDataDep, 0);
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000167 }
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000168 }
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000169
170 node->outEdges.clear();
171}
172
Tanya Lattnerc50ee552003-08-27 02:42:58 +0000173void SchedGraphCommon::eraseIncidentEdges(SchedGraphNodeCommon* node,
174 bool addDummyEdges) {
Tanya Lattnerb6489f32003-08-25 22:42:20 +0000175 this->eraseIncomingEdges(node, addDummyEdges);
176 this->eraseOutgoingEdges(node, addDummyEdges);
177}
178
Brian Gaeked0fde302003-11-11 22:41:34 +0000179} // End llvm namespace