aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTanya Lattner <tonic@nondot.org>2004-11-28 23:36:15 +0000
committerTanya Lattner <tonic@nondot.org>2004-11-28 23:36:15 +0000
commit28e5eabf65a7d5afddddbf5e90b0ed8c85140cd6 (patch)
treec2b31ebbc6217e9e441ab0f1cfbc46d980a79306 /lib
parentb2e4cd645a3392501d41ad55c0d7753e75efe9ac (diff)
Fixed bug where instructions in the kernel were not ordered right to preserve dependencies in a cycle.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18314 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp21
-rw-r--r--lib/Target/SparcV9/ModuloScheduling/MSSchedule.h3
-rw-r--r--lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp9
-rw-r--r--lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h6
4 files changed, 32 insertions, 7 deletions
diff --git a/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp b/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
index 7ee77510f0..29aba158c3 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<MSchedGraphNode*> nodesAtCycle = schedule[cycle];
+
+ std::map<unsigned, MSchedGraphNode*> indexMap;
+ for(unsigned i=0; i < nodesAtCycle.size(); ++i) {
+ indexMap[nodesAtCycle[i]->getIndex()] = nodesAtCycle[i];
+ }
+
+ indexMap[node->getIndex()] = node;
+
+ std::vector<MSchedGraphNode*> nodes;
+ for(std::map<unsigned, MSchedGraphNode*>::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 248a748591..fcf405d724 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 a3b02f7821..5a415e7546 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<const MachineInstr*> 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 baa6373510..36b76324cb 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<MSchedGraphNode*> Predecessors; //Predecessor Nodes
std::vector<MSchedGraphEdge> 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<MSchedGraphNode*>::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);