49#ifdef ABORT_ORPHAN_NODES
50#define WARN_ORPHAN_NODES
62 for (DataDependenceGraph::NodeSet::iterator i = sinks.begin();
71 std::cerr <<
"termimal not fuport even though dest op!: " << node.
toString();
97 __FILE__,__LINE__,
__func__,
"Creation of subgraph failed");
131 ddg_(&ddg), ddgOwned_(
false) {
172 for (DataDependenceGraph::NodeSet::iterator i = unscheduled.begin();
173 i != unscheduled.end();
176#ifdef WARN_ORPHAN_NODES
177 std::cerr <<
"Found orphan node: " << node.
toString() <<
" max src dist: "
181#ifdef ABORT_ORPHAN_NODES
213 for (DataDependenceGraph::NodeSet::iterator i = pred.begin();
214 i != pred.end(); ++i) {
247 while (!queue.empty()) {
263 if (bypassSrc != NULL) {
264 if (nodes.find(bypassSrc) == nodes.end()) {
265 queue.insert(bypassSrc);
268 std::cerr <<
"Warning: Cannot find source for forced bypass. "
269 <<
" Instruction scheduler may fail/deadlock" << std::endl;
277 for (DataDependenceGraph::NodeSet::iterator j =
278 rrDestinations.begin(); j != rrDestinations.end(); j++) {
280 if (nodes.find(n) == nodes.end()) {
293 if (!nodes.empty()) {
295 for (DataDependenceGraph::NodeSet::iterator i = nodes.begin(); i != nodes.end(); i++) {
296 if (!((**i).isScheduled())) {
322 if (nodes.find(&inputMove) == nodes.end()) {
323 queue.insert(&inputMove);
330 if (nodes.find(&outputMove) == nodes.end()) {
331 queue.insert(&outputMove);
352 for (DataDependenceGraph::NodeSet::iterator i = nodes.begin(); i != nodes.end(); i++) {
374 for (
int i = 0; i < nodes.
nodeCount(); i++) {
#define abortWithError(message)
#define assert(condition)
TTAMachine::Machine * machine
the architecture definition of the estimated processor
find Finds info of the inner loops in the false
ReadyMoveNodeGroupListBU readyList_
The prioritized ready list.
DataDependenceGraph * ddg_
The data dependence graph built from the basic block.
virtual void initializeReadylist()
Initializes ready list from nodes that are ready.
virtual MoveNodeGroup candidates()
static void queueOperation(ProgramOperation &po, const DataDependenceGraph::NodeSet &nodes, DataDependenceGraph::NodeSet &queue)
virtual ~BUMoveNodeSelector()
virtual void notifyScheduled(MoveNode &node)
virtual void mightBeReady(MoveNode &node)
bool isReadyToBeScheduled(DataDependenceGraph::NodeSet &nodes) const
BUMoveNodeSelector(TTAProgram::BasicBlock &bb, const TTAMachine::Machine &machine)
virtual DataDependenceGraph & dataDependenceGraph()
int maxSourceDistance(const GraphNode &node) const
int maxSinkDistance(const GraphNode &node) const
bool hasNode(const Node &) const
virtual NodeSet predecessors(const Node &node, bool ignoreBackEdges=false, bool ignoreForwardEdges=false) const
virtual NodeSet sinkNodes() const
virtual DataDependenceGraph * build(ControlFlowGraph &cGraph, DataDependenceGraph::AntidependenceLevel antidependenceLevel, const TTAMachine::Machine &mach, const UniversalMachine *um=NULL, bool createMemAndFUDeps=true, bool createDeathInformation=true, llvm::AliasAnalysis *AA=NULL)
NodeSet unscheduledMoves() const
DataDependenceGraph * createSubgraph(NodeSet &nodes, bool includeLoops=false)
int scheduledNodeCount() const
NodeSet onlyRegisterRawDestinations(const MoveNode &mn, bool allowGuardEdges=false, bool allowBackEdges=false) const
bool otherSuccessorsScheduled(MoveNode &node, const NodeSet &ignoredNodes) const
MoveNode * onlyRegisterRawSource(const MoveNode &mn, int allowGuardEdges=2, int backEdges=0) const
virtual void setCycleGrouping(bool flag)
void setMachine(const TTAMachine::Machine &machine)
void setCause(const Exception &cause)
virtual void writeToDotFile(const TCEString &fileName) const
std::set< GraphNode *, typename GraphNode::Comparator > NodeSet
MoveNode & node(int index) const
void addNode(MoveNode &node)
unsigned int destinationOperationCount() const
ProgramOperation & sourceOperation() const
bool isDestinationOperation() const
std::string toString() const
TTAProgram::Move & move()
bool isSourceOperation() const
bool inSameOperation(const MoveNode &other) const
ProgramOperation & destinationOperation(unsigned int index=0) const
int outputMoveCount() const
int inputMoveCount() const
MoveNode & inputMove(int index) const
MoveNode & outputMove(int index) const
Terminal & source() const
Terminal & destination() const
virtual int operationIndex() const
virtual bool isUniversalMachineRegister() const
virtual bool isFUPort() const