OpenASIP 2.2
Loading...
Searching...
No Matches
DataDependenceGraph.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2009 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file DataDependenceGraph.hh
26 *
27 * Declaration of data dependence graph class
28 *
29 * @author Heikki Kultala 2006-2009 (heikki.kultala-no.spam-tut.fi)
30 * @note rating: red
31 */
32
33#ifndef TTA_DATA_DEPENDENCE_GRAPH_HH
34#define TTA_DATA_DEPENDENCE_GRAPH_HH
35
36#include <map>
37#include <set>
38#include <list>
39#include <utility>
40#include <vector>
41#include <utility>
42
43#include "BoostGraph.hh"
44#include "DataDependenceEdge.hh"
45#include "MoveNode.hh"
46#include "ProgramOperation.hh"
47
48typedef std::vector<ProgramOperationPtr> POList;
49typedef POList::iterator POLIter;
50
51class BasicBlockNode;
52class DataGraphBuilder;
54class MoveNodeUse;
55struct LiveRange;
56
57namespace TTAMachine {
58 class BaseRegisterFile;
59 class Machine;
60}
61
62namespace TTAProgram {
63 class CodeSnippet;
64 class BasicBlock;
65}
66
68 public BoostGraph<MoveNode, DataDependenceEdge> {
69public:
70
77
84
89
91 EWH_HEURISTIC, ///< Weights memory dependencies more, etc.
92 EWH_REAL, ///< Height returns the minimum cycle count for the
93 ///< schedule given enough resources.
95 };
96
98 std::set<TCEString> allParamRegs,
99 const TCEString& name="",
100 AntidependenceLevel antidependenceLevel = ALL_ANTIDEPS,
101 BasicBlockNode* ownedBBN = NULL,
102 bool containsProcedure=false, bool noLoopEdges=false);
103
104 virtual ~DataDependenceGraph();
105
106 /* Gets the BB in which this move belongs. This should be moved to
107 a better place: DDG API should not deal with basic blocks. Correct
108 place BasicBlockNode?
109
110 This information is needed for PDG construction, and putting it to
111 BBN does not work. I know this is ugly, but currently these is no
112 better place for this.
113 */
114 const BasicBlockNode& getBasicBlockNode(const MoveNode& mn) const;
116 void setBasicBlockNode(const MoveNode& mn, BasicBlockNode& bbn);
117
118 int programOperationCount() const;
120 const ProgramOperation& programOperation(int index) const;
122
125
126 // should not be called by the user, only by a DataDependenceGraphBuilder
127 void addNode(MoveNode& moveNode);
128 void addNode(MoveNode& moveNode, MoveNode& relatedNode);
129 void addNode(MoveNode& moveNode, BasicBlockNode& bblock);
132
134
135 int edgeLatency(const DataDependenceEdge& edge, int ii,
136 const MoveNode* tail, const MoveNode* head) const;
137
138 int earliestCycle(
139 const MoveNode& moveNode, unsigned int ii = UINT_MAX,
140 bool ignoreRegWaRs = false,
141 bool ignoreRegWaWs = false, bool ignoreGuards = false,
142 bool ignoreFUDeps = false,
143 bool ignoreSameOperationEdges = false,
144 bool assumeBypassing = false) const;
145
146 int latestCycle(
147 const MoveNode& moveNode, unsigned int ii = UINT_MAX,
148 bool ignoreRegAntideps = false,
149 bool ignoreUnscheduledSuccessors = true,
150 bool ignoreGuards = false,
151 bool ignoreFUDeps = false,
152 bool ignoreSameOperationEdges = false) const;
153
154 bool hasUnscheduledSuccessors(const MoveNode& mn) const;
155 bool hasUnscheduledPredecessors(const MoveNode& mn) const;
156
157 int smallestCycle() const;
158 int largestCycle() const;
159 int scheduledNodeCount() const;
160
162 NodeSet scheduledMoves() const;
163 NodeSet movesAtCycle(int cycle) const;
164
167 NodeSet guardDefMoves(const MoveNode& moveNode);
168
169 MoveNode*
172 int registerIndex,
173 int lastCycleToTest = INT_MAX) const;
174
175 NodeSet
177 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
178
179 NodeSet
181 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
182
183 NodeSet
185 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
186
187 MoveNode*
190 int registerIndex,
191 int firstCycleToTest = 0) const;
192
193 MoveNode*
195 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
196
197 NodeSet
199 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
200
201 NodeSet
203 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
204
205 MoveNode*
207 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
208
209 MoveNode*
211 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
212
214 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
215
217 const TTAMachine::BaseRegisterFile& rf, int registerIndex) const;
218
219 void sanityCheck() const;
220
221 /// Dot printing related methods
222 virtual TCEString dotString() const;
223 virtual void setCycleGrouping(bool flag);
224 virtual void setProgramOperationNodes(bool flag) {
226 }
227 // XML dumping
228 void writeToXMLFile(std::string fileName) const;
229
230 bool mergeAndKeepAllowed(MoveNode& sourceNode, MoveNode& userNode);
231 TCEString removeRAWEdges(MoveNode& sourceNode, MoveNode& userNode);
232 bool isLoopBypass(MoveNode& sourceNode, MoveNode& userNode);
233
234 bool mergeAndKeepUser(
235 MoveNode& resultNode, MoveNode& userNode, bool force = false);
237 MoveNode& resultNode, MoveNode& userNode, bool force = false);
238 void unMergeUser(MoveNode& resultNode, MoveNode& mergedNode, bool loopBypass = false);
239
240 // guard converted from register guard to portguard.
241 void guardConverted(MoveNode& guardSrc, MoveNode& dst);
242
243 // guard converted back from portguard to register guard.
244 void guardRestored(MoveNode& guardSrc, MoveNode& dst);
245
246 bool resultUsed(MoveNode& resultNode);
247 bool resultUsed(MoveNode& resultNode, MoveNode* regCopy);
248
249 void removeNode(MoveNode& node);
250 void deleteNode(MoveNode& node);
251
253
254 int edgeWeight(DataDependenceEdge& e, const MoveNode& hNode) const;
255 bool predecessorsReady(MoveNode& node) const;
256 bool successorsReady(MoveNode& node) const;
257 bool otherSuccessorsScheduled(MoveNode& node, const NodeSet& ignoredNodes) const;
258
260 const TTAMachine::Machine& machine() const { return *machine_; }
261
263 const MoveNode& tailNode, const MoveNode& headNode,
265
267 NodeSet& nodes, bool includeLoops = false);
268
270 TTAProgram::CodeSnippet& cs, bool includeLoops = false);
271
273 std::list<TTAProgram::CodeSnippet*>& codeSnippets,
274 bool includeLoops = false);
275
277 bool removeMemAntideps=true, bool ignoreMemDeps=false);
280
282
283 void dropBackEdges();
284
286 BasicBlockNode& bbn1, BasicBlockNode& bbn2, bool loopEdges);
287
288 // Duplicates all in- and outgoing edges in dst to src
289 void copyDependencies(
290 const MoveNode& src, MoveNode& dst, bool ignoreSameBBBackedges,
291 bool moveOverLoopEdge = true);
292
293 void copyIncomingGuardEdges(const MoveNode& src, MoveNode& dst);
294 void copyOutgoingGuardWarEdges(const MoveNode& src, MoveNode& dst);
295
297
300 const MoveNode& mn, int allowGuardEdges = 2, int backEdges = 0) const;
301
303 const MoveNode& mn,
304 bool allowGuardEdges = false,
305 bool allowBackEdges = false) const;
306
307 std::map<DataDependenceEdge*, MoveNode*, DataDependenceEdge::Comparator>
309 const MoveNode& mn, bool allowBackEdges) const;
310
314 NodeSet regDepSiblings(const MoveNode& mn) const;
315 NodeSet regRawPredecessors(const MoveNode& node, int backedges=0) const;
316
318
319 bool exclusingGuards(const MoveNode& mn1, const MoveNode& mn2) const;
320 bool sameGuards(const MoveNode& mn1, const MoveNode& mn2) const;
321
322 int rWarEdgesOut(MoveNode& mn);
323 int regRawSuccessorCount(const MoveNode& mn, bool onlyScheduled);
324
325 bool guardsAllowBypass(const MoveNode& defNode,
326 const MoveNode& useNode,
327 bool loopBypass = false);
328
330 const MoveNode& node, const std::string& sp) const;
331
332 EdgeSet copyDepsOver(MoveNode& node, bool anti, bool raw);
333
334 void copyDepsOver(MoveNode& node1, MoveNode& node2, bool anti, bool raw);
335
336 void combineNodes(
337 MoveNode& node1, MoveNode& node2, MoveNode& destination);
338
339 std::pair<MoveNode*, MoveNode*> findLoopLimitAndIndex(MoveNode& jumpMove);
340
341 std::pair<MoveNode*, int> findLoopIndexUpdate(MoveNode* indexMove);
342
343 MoveNode* findLoopIndexInit(MoveNode& updateMove);
344
345 bool writesJumpGuard(const MoveNode& moveNode);
346
348
350 MoveNode& lrNode, bool writingNode, bool guardUseNode) const;
351
354
358
360 MoveNode& src, MoveNode& dest, MoveNode& antidepPoint,
361 DataDependenceEdge& lrEdge,
362 const TCEString& oldReg, const TCEString& newReg);
363
364 void copyExternalInEdges(MoveNode& nodeCopy, const MoveNode& source);
365 void copyExternalOutEdges(MoveNode& nodeCopy, const MoveNode& source);
366
369 const MoveNodeUse& mnd, const TCEString& reg,
371
372 void updateRegUse(
373 const MoveNodeUse& mnd, const TCEString& reg,
375
378
382
386
390
391 bool hasRegWaw(const MoveNodeUse& mnu, std::set<MoveNodeUse> targets) const;
392
393 bool isNotAvoidable(const DataDependenceEdge& edge) const;
394
395 bool isLoopInvariant(const MoveNode& mn) const;
396
397 bool hasOtherRegWawSources(const MoveNode& mn) const;
398
400
401 void copyIncomingRawEdges(const MoveNode& src, MoveNode& dst);
402
404 MoveNode& sourceNode, MoveNode& mergedNode, const TCEString& reg);
405
406 void setNodeBB(
407 MoveNode& mn, BasicBlockNode& bblock, DataDependenceGraph* updater);
408
409 void undo(UndoData& undoData);
410
413private:
414
416 NodeSet& queue, NodeSet& finalDest, NodeSet& predQueue,
417 NodeSet& predFinalDest, bool guard) const;
418
420 int rAntiEdgesIn(MoveNode& mn);
421
423
424 bool hasEqualEdge(
425 const MoveNode& tailNode, const MoveNode& headNode,
426 const DataDependenceEdge& edge) const;
427
428 int getOperationLatency(const TCEString& name) const;
429
430 std::set<TCEString> allParamRegs_;
431
432 // cache to make things faster
433 // may not be used with iterator.
434 std::map<const TTAProgram::Move*, MoveNode*> nodesOfMoves_;
435
436 // own all the programoperations
438 std::map<const MoveNode*, BasicBlockNode*> moveNodeBlocks_;
439
440 /// Dot printing related variables.
441 /// Group the printed MoveNodes according to their cycles.
443 /// The moves belonging to the same program operation
444 /// are merged to a single node. Reduces the complexity of the graph.
446
447 // Machine related variables.
450 std::map<TCEString, int> operationLatencies_;
452
456
457 /// The heuristics to use to weight edges in the longest path computation.
459};
460
461#endif
POList::iterator POLIter
std::vector< ProgramOperationPtr > POList
std::shared_ptr< ProgramOperation > ProgramOperationPtr
Definition MoveNode.hh:53
std::set< RemovedEdgeDatum > RemovedEdgeMap
virtual Node & headNode(const Edge &edge) const
std::set< DataDependenceEdge *, typename GraphEdge::Comparator > EdgeSet
Definition BoostGraph.hh:87
Node & node(const int index) const
virtual const TCEString & name() const
std::set< MoveNode *, typename GraphNode::Comparator > NodeSet
Definition BoostGraph.hh:86
virtual Node & tailNode(const Edge &edge) const
virtual Edge & edge(const int index) const
NodeSet regDepSiblings(const MoveNode &mn) const
bool rWawRawEdgesOutUncond(MoveNode &mn)
MoveNode * firstScheduledRegisterWrite(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
NodeSet regWawSuccessors(const MoveNode &node) const
bool dotProgramOperationNodes_
The moves belonging to the same program operation are merged to a single node. Reduces the complexity...
bool successorsReady(MoveNode &node) const
LiveRange * findLiveRange(MoveNode &lrNode, bool writingNode, bool guardUseNode) const
bool hasRegWaw(const MoveNodeUse &mnu, std::set< MoveNodeUse > targets) const
int latestCycle(const MoveNode &moveNode, unsigned int ii=UINT_MAX, bool ignoreRegAntideps=false, bool ignoreUnscheduledSuccessors=true, bool ignoreGuards=false, bool ignoreFUDeps=false, bool ignoreSameOperationEdges=false) const
int edgeWeight(DataDependenceEdge &e, const MoveNode &hNode) const
void copyExternalInEdges(MoveNode &nodeCopy, const MoveNode &source)
void fixAntidepsAfterLoopUnmergeUser(MoveNode &sourceNode, MoveNode &mergedNode, const TCEString &reg)
DataDependenceEdge * onlyRegisterEdgeOut(MoveNode &mn) const
NodeSet lastScheduledRegisterWrites(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
void copyDependencies(const MoveNode &src, MoveNode &dst, bool ignoreSameBBBackedges, bool moveOverLoopEdge=true)
NodeSet regRawSuccessors(const MoveNode &node) const
int earliestCycle(const MoveNode &moveNode, unsigned int ii=UINT_MAX, bool ignoreRegWaRs=false, bool ignoreRegWaWs=false, bool ignoreGuards=false, bool ignoreFUDeps=false, bool ignoreSameOperationEdges=false, bool assumeBypassing=false) const
ProgramOperation & programOperation(int index)
void copyOutgoingGuardWarEdges(const MoveNode &src, MoveNode &dst)
void deleteNode(MoveNode &node)
@ EWH_HEURISTIC
Weights memory dependencies more, etc.
@ EWH_REAL
Height returns the minimum cycle count for the schedule given enough resources.
void copyExternalOutEdges(MoveNode &nodeCopy, const MoveNode &source)
MoveNode * onlyGuardDefOfMove(MoveNode &moveNode)
void setNodeBB(MoveNode &mn, BasicBlockNode &bblock, DataDependenceGraph *updater)
int rWarEdgesOut(MoveNode &mn)
NodeSet unscheduledMoves() const
std::pair< MoveNode *, int > findLoopIndexUpdate(MoveNode *indexMove)
void addNode(MoveNode &moveNode)
bool isLoopBypass(MoveNode &sourceNode, MoveNode &userNode)
TCEString removeRAWEdges(MoveNode &sourceNode, MoveNode &userNode)
MoveNode * lastGuardDefMove(MoveNode &moveNode)
bool queueRawPredecessors(NodeSet &queue, NodeSet &finalDest, NodeSet &predQueue, NodeSet &predFinalDest, bool guard) const
DataDependenceGraph * createSubgraph(NodeSet &nodes, bool includeLoops=false)
void unMergeUser(MoveNode &resultNode, MoveNode &mergedNode, bool loopBypass=false)
void copyIncomingRawEdges(const MoveNode &src, MoveNode &dst)
void guardConverted(MoveNode &guardSrc, MoveNode &dst)
const MoveNode * onlyRegisterRawAncestor(const MoveNode &node, const std::string &sp) const
int firstRegisterCycle(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
DataDependenceGraph * criticalPathGraph()
void moveFUDependenciesToTrigger(MoveNode &trigger)
void addProgramOperation(ProgramOperationPtr po)
MoveNode * findBypassSource(const MoveNode &mn)
bool hasOtherRegWawSources(const MoveNode &mn) const
std::map< TCEString, int > operationLatencies_
DataDependenceGraph::UndoData sourceRenamed(MoveNode &mn)
const TTAMachine::Machine & machine() const
NodeSet lastScheduledRegisterGuardReads(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
NodeSet movesAtCycle(int cycle) const
bool hasEqualEdge(const MoveNode &tailNode, const MoveNode &headNode, const DataDependenceEdge &edge) const
DataDependenceEdge * onlyRegisterEdgeIn(MoveNode &mn) const
bool mergeAndKeepUser(MoveNode &resultNode, MoveNode &userNode, bool force=false)
void createRegisterAntiDependenciesBetweenNodes(NodeSet &nodes)
bool exclusingGuards(const MoveNode &mn1, const MoveNode &mn2) const
NodeSet firstScheduledRegisterWrites(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
void dropProgramOperation(ProgramOperationPtr po)
NodeSet onlyRegisterRawDestinations(const MoveNode &mn, bool allowGuardEdges=false, bool allowBackEdges=false) const
EdgeSet registerAndRAInEdges(const MoveNode &node) const
MoveNode * lastScheduledRegisterRead(const TTAMachine::BaseRegisterFile &rf, int registerIndex, int lastCycleToTest=INT_MAX) const
NodeSet firstScheduledRegisterReads(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
int getOperationLatency(const TCEString &name) const
const BasicBlockNode & getBasicBlockNode(const MoveNode &mn) const
bool otherSuccessorsScheduled(MoveNode &node, const NodeSet &ignoredNodes) const
MoveNode * findLimitingAntidependenceSource(MoveNode &mn)
void fixInterBBAntiEdges(BasicBlockNode &bbn1, BasicBlockNode &bbn2, bool loopEdges)
void copyIncomingGuardEdges(const MoveNode &src, MoveNode &dst)
MoveNode * firstScheduledRegisterKill(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
NodeSet guardRawPredecessors(const MoveNode &node) const
NodeSet lastScheduledRegisterReads(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
EdgeWeightHeuristics edgeWeightHeuristics_
The heuristics to use to weight edges in the longest path computation.
MoveNode * onlyRegisterRawSource(const MoveNode &mn, int allowGuardEdges=2, int backEdges=0) const
int lastRegisterCycle(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
NodeSet regRawPredecessors(const MoveNode &node, int backedges=0) const
bool isNotAvoidable(const DataDependenceEdge &edge) const
void guardRestored(MoveNode &guardSrc, MoveNode &dst)
std::pair< MoveNode *, MoveNode * > findLoopLimitAndIndex(MoveNode &jumpMove)
int regRawSuccessorCount(const MoveNode &mn, bool onlyScheduled)
void setEdgeWeightHeuristics(EdgeWeightHeuristics ewh)
DataDependenceGraph * trueDependenceGraph(bool removeMemAntideps=true, bool ignoreMemDeps=false)
int rAntiEdgesIn(MoveNode &mn)
bool resultUsed(MoveNode &resultNode)
virtual void setCycleGrouping(bool flag)
MoveNode & nodeOfMove(const TTAProgram::Move &move)
AntidependenceLevel registerAntidependenceLevel_
void writeToXMLFile(std::string fileName) const
bool sameGuards(const MoveNode &mn1, const MoveNode &mn2) const
void setBasicBlockNode(const MoveNode &mn, BasicBlockNode &bbn)
virtual void setProgramOperationNodes(bool flag)
void removeOutgoingGuardWarEdges(MoveNode &node)
NodeSet guardDefMoves(const MoveNode &moveNode)
void removeNode(MoveNode &node)
std::map< DataDependenceEdge *, MoveNode *, DataDependenceEdge::Comparator > onlyRegisterRawDestinationsWithEdges(const MoveNode &mn, bool allowBackEdges) const
bool hasUnscheduledPredecessors(const MoveNode &mn) const
bool predecessorsReady(MoveNode &node) const
MoveNode * findLoopIndexInit(MoveNode &updateMove)
MoveNode * lastScheduledRegisterKill(const TTAMachine::BaseRegisterFile &rf, int registerIndex) const
EdgeSet copyDepsOver(MoveNode &node, bool anti, bool raw)
std::set< TCEString > allParamRegs_
DataDependenceGraph::UndoData guardRenamed(MoveNode &mn)
void renamedSimpleLiveRange(MoveNode &src, MoveNode &dest, MoveNode &antidepPoint, DataDependenceEdge &lrEdge, const TCEString &oldReg, const TCEString &newReg)
std::map< const TTAProgram::Move *, MoveNode * > nodesOfMoves_
bool mergeAndKeepAllowed(MoveNode &sourceNode, MoveNode &userNode)
EdgeSet operationInEdges(const MoveNode &node) const
NodeSet regWarSuccessors(const MoveNode &node) const
virtual TCEString dotString() const
Dot printing related methods.
ProgramOperationPtr programOperationPtr(int index)
void updateRegUse(const MoveNodeUse &mnd, const TCEString &reg, TTAProgram::BasicBlock &bb)
MoveNode * firstScheduledRegisterRead(const TTAMachine::BaseRegisterFile &rf, int registerIndex, int firstCycleToTest=0) const
void removeIncomingGuardEdges(MoveNode &node)
bool mergeAndKeepSource(MoveNode &resultNode, MoveNode &userNode, bool force=false)
DataDependenceGraph::UndoData destRenamed(MoveNode &mn)
void setMachine(const TTAMachine::Machine &machine)
DataDependenceGraph * memoryDependenceGraph()
bool writesJumpGuard(const MoveNode &moveNode)
bool isLoopInvariant(const MoveNode &mn) const
void undo(UndoData &undoData)
bool hasUnscheduledSuccessors(const MoveNode &mn) const
bool connectOrDeleteEdge(const MoveNode &tailNode, const MoveNode &headNode, DataDependenceEdge *edge)
void combineNodes(MoveNode &node1, MoveNode &node2, MoveNode &destination)
std::map< const MoveNode *, BasicBlockNode * > moveNodeBlocks_
bool cycleGrouping_
Dot printing related variables. Group the printed MoveNodes according to their cycles.
bool guardsAllowBypass(const MoveNode &defNode, const MoveNode &useNode, bool loopBypass=false)
const TTAMachine::Machine * machine_
DataDependenceEdge * onlyIncomingGuard(const MoveNode &mn) const
DataDependenceGraph::EdgeSet updateRegWrite(const MoveNodeUse &mnd, const TCEString &reg, TTAProgram::BasicBlock &bb)
int edgeLatency(const DataDependenceEdge &edge, int ii, const MoveNode *tail, const MoveNode *head) const
MoveNode * findLimitingAntidependenceDestination(MoveNode &mn)
std::set< GraphEdge *, typename GraphEdge::Comparator > EdgeSet
Definition Graph.hh:54
std::map< DataDependenceEdge *, TCEString, DataDependenceEdge::Comparator > changedDataEdges