diff --git a/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp b/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp index 7ee77510f06..29aba158c30 100644 --- a/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp +++ b/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp @@ -27,7 +27,8 @@ bool MSSchedule::insert(MSchedGraphNode *node, int cycle) { if (schedule[cycle].size() < numIssue) { //Now check if all the resources in their respective cycles are available if(resourcesFree(node, cycle)) { - schedule[cycle].push_back(node); + //Insert to preserve dependencies + addToSchedule(cycle,node); DEBUG(std::cerr << "Found spot in map, and there is an issue slot\n"); return false; } @@ -49,6 +50,24 @@ bool MSSchedule::insert(MSchedGraphNode *node, int cycle) { } +void MSSchedule::addToSchedule(int cycle, MSchedGraphNode *node) { + std::vector nodesAtCycle = schedule[cycle]; + + std::map indexMap; + for(unsigned i=0; i < nodesAtCycle.size(); ++i) { + indexMap[nodesAtCycle[i]->getIndex()] = nodesAtCycle[i]; + } + + indexMap[node->getIndex()] = node; + + std::vector nodes; + for(std::map::iterator I = indexMap.begin(), E = indexMap.end(); I != E; ++I) + nodes.push_back(I->second); + + schedule[cycle] = nodes; +} + + bool MSSchedule::resourcesFree(MSchedGraphNode *node, int cycle) { //Get Resource usage for this instruction diff --git a/lib/Target/SparcV9/ModuloScheduling/MSSchedule.h b/lib/Target/SparcV9/ModuloScheduling/MSSchedule.h index 248a7485917..fcf405d7240 100644 --- a/lib/Target/SparcV9/ModuloScheduling/MSSchedule.h +++ b/lib/Target/SparcV9/ModuloScheduling/MSSchedule.h @@ -35,6 +35,9 @@ namespace llvm { //Max stage count int maxStage; + //add at the right spot in the schedule + void addToSchedule(int, MSchedGraphNode*); + public: MSSchedule(int num) : numIssue(num) {} MSSchedule() : numIssue(4) {} diff --git a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp index a3b02f7821e..5a415e7546a 100644 --- a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp +++ b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp @@ -22,9 +22,9 @@ using namespace llvm; MSchedGraphNode::MSchedGraphNode(const MachineInstr* inst, - MSchedGraph *graph, + MSchedGraph *graph, unsigned idx, unsigned late, bool isBranch) - : Inst(inst), Parent(graph), latency(late), isBranchInstr(isBranch) { + : Inst(inst), Parent(graph), index(idx), latency(late), isBranchInstr(isBranch) { //Add to the graph graph->addNode(inst, this); @@ -113,7 +113,7 @@ void MSchedGraph::buildNodesAndEdges() { //Save PHI instructions to deal with later std::vector phiInstrs; - + unsigned index = 0; //Loop over instructions in MBB and add nodes and edges for (MachineBasicBlock::const_iterator MI = BB->begin(), e = BB->end(); MI != e; ++MI) { //Get each instruction of machine basic block, get the delay @@ -149,7 +149,7 @@ void MSchedGraph::buildNodesAndEdges() { isBranch = true; //Node is created and added to the graph automatically - MSchedGraphNode *node = new MSchedGraphNode(MI, this, delay, isBranch); + MSchedGraphNode *node = new MSchedGraphNode(MI, this, index, delay, isBranch); DEBUG(std::cerr << "Created Node: " << *node << "\n"); @@ -211,6 +211,7 @@ void MSchedGraph::buildNodesAndEdges() { } } } + ++index; } addMemEdges(memInstructions); addMachRegEdges(regNumtoNodeMap); diff --git a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h index baa6373510e..36b76324cbe 100644 --- a/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h +++ b/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h @@ -58,15 +58,17 @@ namespace llvm { const MachineInstr* Inst; //Machine Instruction MSchedGraph* Parent; //Graph this node belongs to + unsigned index; //Index in BB unsigned latency; //Latency of Instruction bool isBranchInstr; //Is this node the branch instr or not + std::vector Predecessors; //Predecessor Nodes std::vector Successors; public: MSchedGraphNode(const MachineInstr *inst, MSchedGraph *graph, - unsigned late=0, bool isBranch=false); + unsigned index, unsigned late=0, bool isBranch=false); //Iterators typedef std::vector::iterator pred_iterator; @@ -102,7 +104,7 @@ namespace llvm { bool hasSuccessors() { return (Successors.size() > 0); } unsigned getLatency() { return latency; } unsigned getLatency() const { return latency; } - + unsigned getIndex() { return index; } MSchedGraphEdge getInEdge(MSchedGraphNode *pred); unsigned getInEdgeNum(MSchedGraphNode *pred);