33#ifndef TTA_DATA_DEPENDENCE_GRAPH_HH
34#define TTA_DATA_DEPENDENCE_GRAPH_HH
48typedef std::vector<ProgramOperationPtr>
POList;
52class DataGraphBuilder;
58 class BaseRegisterFile;
68 public BoostGraph<MoveNode, DataDependenceEdge> {
98 std::set<TCEString> allParamRegs,
102 bool containsProcedure=
false,
bool noLoopEdges=
false);
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;
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;
173 int lastCycleToTest = INT_MAX)
const;
191 int firstCycleToTest = 0)
const;
267 NodeSet& nodes,
bool includeLoops =
false);
273 std::list<TTAProgram::CodeSnippet*>& codeSnippets,
274 bool includeLoops =
false);
277 bool removeMemAntideps=
true,
bool ignoreMemDeps=
false);
291 bool moveOverLoopEdge =
true);
300 const MoveNode& mn,
int allowGuardEdges = 2,
int backEdges = 0)
const;
304 bool allowGuardEdges =
false,
305 bool allowBackEdges =
false)
const;
307 std::map<DataDependenceEdge*, MoveNode*, DataDependenceEdge::Comparator>
309 const MoveNode& mn,
bool allowBackEdges)
const;
327 bool loopBypass =
false);
350 MoveNode& lrNode,
bool writingNode,
bool guardUseNode)
const;
409 void undo(UndoData& undoData);
417 NodeSet& predFinalDest,
bool guard)
const;
std::vector< ProgramOperationPtr > POList
std::shared_ptr< ProgramOperation > ProgramOperationPtr
std::set< RemovedEdgeDatum > RemovedEdgeMap
virtual Node & headNode(const Edge &edge) const
std::set< DataDependenceEdge *, typename GraphEdge::Comparator > EdgeSet
Node & node(const int index) const
virtual const TCEString & name() const
std::set< MoveNode *, typename GraphNode::Comparator > NodeSet
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 programOperationCount() const
int edgeWeight(DataDependenceEdge &e, const MoveNode &hNode) const
bool hasAllRegisterAntidependencies()
void copyExternalInEdges(MoveNode &nodeCopy, const MoveNode &source)
void fixAntidepsAfterLoopUnmergeUser(MoveNode &sourceNode, MoveNode &mergedNode, const TCEString ®)
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)
POList programOperations_
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)
NodeSet scheduledMoves() const
bool hasOtherRegWawSources(const MoveNode &mn) const
std::map< TCEString, int > operationLatencies_
bool isRootGraphProcedureDDG()
DataDependenceGraph::UndoData sourceRenamed(MoveNode &mn)
const TTAMachine::Machine & machine() const
BasicBlockNode * ownedBBN_
int smallestCycle() 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
int scheduledNodeCount() 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)
bool hasIntraBBRegisterAntidependencies()
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
@ SINGLE_BB_LOOP_ANTIDEPS
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 ®, TTAProgram::BasicBlock &bb)
MoveNode * firstScheduledRegisterRead(const TTAMachine::BaseRegisterFile &rf, int registerIndex, int firstCycleToTest=0) const
void removeIncomingGuardEdges(MoveNode &node)
virtual ~DataDependenceGraph()
bool mergeAndKeepSource(MoveNode &resultNode, MoveNode &userNode, bool force=false)
DataDependenceGraph::UndoData destRenamed(MoveNode &mn)
bool hasSingleBBLoopRegisterAntidependencies()
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 ®, 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
std::map< DataDependenceEdge *, TCEString, DataDependenceEdge::Comparator > changedDataEdges
RemovedEdgeMap removedEdges