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
This commit is contained in:
Tanya Lattner 2004-11-28 23:36:15 +00:00
parent b2e4cd645a
commit 28e5eabf65
4 changed files with 32 additions and 7 deletions

View File

@ -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

View File

@ -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) {}

View File

@ -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);

View File

@ -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);