[llvm-commits] CVS: llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp MSchedGraph.cpp MSchedGraph.h ModuloScheduling.cpp ModuloScheduling.h
Tanya Brethour
tbrethou at cs.uiuc.edu
Sat Apr 30 16:08:15 PDT 2005
Changes in directory llvm/lib/Target/SparcV9/ModuloScheduling:
DependenceAnalyzer.cpp updated: 1.5 -> 1.6
MSchedGraph.cpp updated: 1.19 -> 1.20
MSchedGraph.h updated: 1.12 -> 1.13
ModuloScheduling.cpp updated: 1.48 -> 1.49
ModuloScheduling.h updated: 1.29 -> 1.30
---
Log message:
Fixed bug in searchPath function for finding nodes between two recurrences.
Changed dependence analyzer to only use dep distances of 2 or less.
This is experimental.
Changed MSchedGraph to be able to represent more then one BB (first steps).
---
Diffs of the changes: (+214 -182)
DependenceAnalyzer.cpp | 4
MSchedGraph.cpp | 323 +++++++++++++++++++++++++------------------------
MSchedGraph.h | 4
ModuloScheduling.cpp | 62 ++++++---
ModuloScheduling.h | 3
5 files changed, 214 insertions(+), 182 deletions(-)
Index: llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp
diff -u llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp:1.5 llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp:1.6
--- llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp:1.5 Fri Apr 22 01:32:48 2005
+++ llvm/lib/Target/SparcV9/ModuloScheduling/DependenceAnalyzer.cpp Sat Apr 30 18:07:58 2005
@@ -218,7 +218,9 @@
//Find constant index difference
int diff = A1->getValue()->getRawValue() - A2->getValue()->getRawValue();
std::cerr << diff << "\n";
-
+ if(diff > 5)
+ diff = 2;
+
if(diff > 0)
createDep(deps, valLoad, val2Load, srcBeforeDest, diff);
Index: llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp
diff -u llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp:1.19 llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp:1.20
--- llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp:1.19 Fri Apr 22 01:32:48 2005
+++ llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.cpp Sat Apr 30 18:07:58 2005
@@ -153,13 +153,13 @@
std::map<const MachineInstr*, unsigned> &ignoreInstrs,
DependenceAnalyzer &DA,
std::map<MachineInstr*, Instruction*> &machineTollvm)
- : BB(bb), Target(targ) {
+ : Target(targ) {
//Make sure BB is not null,
- assert(BB != NULL && "Basic Block is null");
-
- //DEBUG(std::cerr << "Constructing graph for " << bb << "\n");
+ assert(bb != NULL && "Basic Block is null");
+ BBs.push_back(bb);
+
//Create nodes and edges for this BB
buildNodesAndEdges(ignoreInstrs, DA, machineTollvm);
@@ -170,7 +170,9 @@
//Copies the graph and keeps a map from old to new nodes
MSchedGraph::MSchedGraph(const MSchedGraph &G,
std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes)
- : BB(G.BB), Target(G.Target) {
+ : Target(G.Target) {
+
+ BBs = G.BBs;
std::map<MSchedGraphNode*, MSchedGraphNode*> oldToNew;
//Copy all nodes
@@ -336,179 +338,184 @@
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) {
-
- //Ignore indvar instructions
- if(ignoreInstrs.count(MI)) {
- ++index;
- continue;
- }
-
- //Get each instruction of machine basic block, get the delay
- //using the op code, create a new node for it, and add to the
- //graph.
-
- MachineOpCode opCode = MI->getOpcode();
- int delay;
+ for(std::vector<const MachineBasicBlock*>::iterator B = BBs.begin(),
+ BE = BBs.end(); B != BE; ++B) {
+
+ const MachineBasicBlock *BB = *B;
+ //Loop over instructions in MBB and add nodes and edges
+ for (MachineBasicBlock::const_iterator MI = BB->begin(), e = BB->end();
+ MI != e; ++MI) {
+
+ //Ignore indvar instructions
+ if(ignoreInstrs.count(MI)) {
+ ++index;
+ continue;
+ }
+
+ //Get each instruction of machine basic block, get the delay
+ //using the op code, create a new node for it, and add to the
+ //graph.
+
+ MachineOpCode opCode = MI->getOpcode();
+ int delay;
+
#if 0 // FIXME: LOOK INTO THIS
- //Check if subsequent instructions can be issued before
- //the result is ready, if so use min delay.
- if(MTI->hasResultInterlock(MIopCode))
- delay = MTI->minLatency(MIopCode);
- else
+ //Check if subsequent instructions can be issued before
+ //the result is ready, if so use min delay.
+ if(MTI->hasResultInterlock(MIopCode))
+ delay = MTI->minLatency(MIopCode);
+ else
#endif
- //Get delay
- delay = MTI->maxLatency(opCode);
-
- //Create new node for this machine instruction and add to the graph.
- //Create only if not a nop
- if(MTI->isNop(opCode))
- continue;
-
- //Sparc BE does not use PHI opcode, so assert on this case
- assert(opCode != TargetInstrInfo::PHI && "Did not expect PHI opcode");
-
- bool isBranch = false;
-
- //We want to flag the branch node to treat it special
- if(MTI->isBranch(opCode))
- isBranch = true;
-
- //Node is created and added to the graph automatically
- MSchedGraphNode *node = new MSchedGraphNode(MI, this, index, delay,
- isBranch);
-
- DEBUG(std::cerr << "Created Node: " << *node << "\n");
-
- //Check OpCode to keep track of memory operations to add memory
- //dependencies later.
- if(MTI->isLoad(opCode) || MTI->isStore(opCode))
- memInstructions.push_back(node);
-
- //Loop over all operands, and put them into the register number to
- //graph node map for determining dependencies
- //If an operands is a use/def, we have an anti dependence to itself
- for(unsigned i=0; i < MI->getNumOperands(); ++i) {
- //Get Operand
- const MachineOperand &mOp = MI->getOperand(i);
-
- //Check if it has an allocated register
- if(mOp.hasAllocatedReg()) {
- int regNum = mOp.getReg();
-
- if(regNum != SparcV9::g0) {
- //Put into our map
- regNumtoNodeMap[regNum].push_back(std::make_pair(i, node));
- }
+ //Get delay
+ delay = MTI->maxLatency(opCode);
+
+ //Create new node for this machine instruction and add to the graph.
+ //Create only if not a nop
+ if(MTI->isNop(opCode))
continue;
- }
-
-
- //Add virtual registers dependencies
- //Check if any exist in the value map already and create dependencies
- //between them.
- if(mOp.getType() == MachineOperand::MO_VirtualRegister
- || mOp.getType() == MachineOperand::MO_CCRegister) {
-
- //Make sure virtual register value is not null
- assert((mOp.getVRegValue() != NULL) && "Null value is defined");
-
- //Check if this is a read operation in a phi node, if so DO NOT PROCESS
- if(mOp.isUse() && (opCode == TargetInstrInfo::PHI)) {
- DEBUG(std::cerr << "Read Operation in a PHI node\n");
+
+ //Sparc BE does not use PHI opcode, so assert on this case
+ assert(opCode != TargetInstrInfo::PHI && "Did not expect PHI opcode");
+
+ bool isBranch = false;
+
+ //We want to flag the branch node to treat it special
+ if(MTI->isBranch(opCode))
+ isBranch = true;
+
+ //Node is created and added to the graph automatically
+ MSchedGraphNode *node = new MSchedGraphNode(MI, this, index, delay,
+ isBranch);
+
+ DEBUG(std::cerr << "Created Node: " << *node << "\n");
+
+ //Check OpCode to keep track of memory operations to add memory
+ //dependencies later.
+ if(MTI->isLoad(opCode) || MTI->isStore(opCode))
+ memInstructions.push_back(node);
+
+ //Loop over all operands, and put them into the register number to
+ //graph node map for determining dependencies
+ //If an operands is a use/def, we have an anti dependence to itself
+ for(unsigned i=0; i < MI->getNumOperands(); ++i) {
+ //Get Operand
+ const MachineOperand &mOp = MI->getOperand(i);
+
+ //Check if it has an allocated register
+ if(mOp.hasAllocatedReg()) {
+ int regNum = mOp.getReg();
+
+ if(regNum != SparcV9::g0) {
+ //Put into our map
+ regNumtoNodeMap[regNum].push_back(std::make_pair(i, node));
+ }
continue;
}
-
- if (const Value* srcI = mOp.getVRegValue()) {
-
- //Find value in the map
- std::map<const Value*, std::vector<OpIndexNodePair> >::iterator V
- = valuetoNodeMap.find(srcI);
- //If there is something in the map already, add edges from
- //those instructions
- //to this one we are processing
- if(V != valuetoNodeMap.end()) {
- addValueEdges(V->second, node, mOp.isUse(), mOp.isDef(), phiInstrs);
- //Add to value map
- V->second.push_back(std::make_pair(i,node));
+ //Add virtual registers dependencies
+ //Check if any exist in the value map already and create dependencies
+ //between them.
+ if(mOp.getType() == MachineOperand::MO_VirtualRegister
+ || mOp.getType() == MachineOperand::MO_CCRegister) {
+
+ //Make sure virtual register value is not null
+ assert((mOp.getVRegValue() != NULL) && "Null value is defined");
+
+ //Check if this is a read operation in a phi node, if so DO NOT PROCESS
+ if(mOp.isUse() && (opCode == TargetInstrInfo::PHI)) {
+ DEBUG(std::cerr << "Read Operation in a PHI node\n");
+ continue;
+ }
+
+ if (const Value* srcI = mOp.getVRegValue()) {
+
+ //Find value in the map
+ std::map<const Value*, std::vector<OpIndexNodePair> >::iterator V
+ = valuetoNodeMap.find(srcI);
+
+ //If there is something in the map already, add edges from
+ //those instructions
+ //to this one we are processing
+ if(V != valuetoNodeMap.end()) {
+ addValueEdges(V->second, node, mOp.isUse(), mOp.isDef(), phiInstrs);
+
+ //Add to value map
+ V->second.push_back(std::make_pair(i,node));
+ }
+ //Otherwise put it in the map
+ else
+ //Put into value map
+ valuetoNodeMap[mOp.getVRegValue()].push_back(std::make_pair(i, node));
}
- //Otherwise put it in the map
- else
- //Put into value map
- valuetoNodeMap[mOp.getVRegValue()].push_back(std::make_pair(i, node));
}
}
+ ++index;
}
- ++index;
- }
-
- //Loop over LLVM BB, examine phi instructions, and add them to our
- //phiInstr list to process
- const BasicBlock *llvm_bb = BB->getBasicBlock();
- for(BasicBlock::const_iterator I = llvm_bb->begin(), E = llvm_bb->end();
- I != E; ++I) {
- if(const PHINode *PN = dyn_cast<PHINode>(I)) {
- MachineCodeForInstruction & tempMvec = MachineCodeForInstruction::get(PN);
- for (unsigned j = 0; j < tempMvec.size(); j++) {
- if(!ignoreInstrs.count(tempMvec[j])) {
- DEBUG(std::cerr << "Inserting phi instr into map: " << *tempMvec[j] << "\n");
- phiInstrs.push_back((MachineInstr*) tempMvec[j]);
- }
- }
+
+ //Loop over LLVM BB, examine phi instructions, and add them to our
+ //phiInstr list to process
+ const BasicBlock *llvm_bb = BB->getBasicBlock();
+ for(BasicBlock::const_iterator I = llvm_bb->begin(), E = llvm_bb->end();
+ I != E; ++I) {
+ if(const PHINode *PN = dyn_cast<PHINode>(I)) {
+ MachineCodeForInstruction & tempMvec = MachineCodeForInstruction::get(PN);
+ for (unsigned j = 0; j < tempMvec.size(); j++) {
+ if(!ignoreInstrs.count(tempMvec[j])) {
+ DEBUG(std::cerr << "Inserting phi instr into map: " << *tempMvec[j] << "\n");
+ phiInstrs.push_back((MachineInstr*) tempMvec[j]);
+ }
+ }
+ }
+
}
-
- }
-
- addMemEdges(memInstructions, DA, machineTollvm);
- addMachRegEdges(regNumtoNodeMap);
-
- //Finally deal with PHI Nodes and Value*
- for(std::vector<const MachineInstr*>::iterator I = phiInstrs.begin(),
- E = phiInstrs.end(); I != E; ++I) {
-
- //Get Node for this instruction
- std::map<const MachineInstr*, MSchedGraphNode*>::iterator X;
- X = find(*I);
-
- if(X == GraphMap.end())
- continue;
-
- MSchedGraphNode *node = X->second;
-
- DEBUG(std::cerr << "Adding ite diff edges for node: " << *node << "\n");
-
- //Loop over operands for this instruction and add value edges
- for(unsigned i=0; i < (*I)->getNumOperands(); ++i) {
- //Get Operand
- const MachineOperand &mOp = (*I)->getOperand(i);
- if((mOp.getType() == MachineOperand::MO_VirtualRegister
- || mOp.getType() == MachineOperand::MO_CCRegister) && mOp.isUse()) {
-
- //find the value in the map
- if (const Value* srcI = mOp.getVRegValue()) {
-
- //Find value in the map
- std::map<const Value*, std::vector<OpIndexNodePair> >::iterator V
+
+ addMemEdges(memInstructions, DA, machineTollvm);
+ addMachRegEdges(regNumtoNodeMap);
+
+ //Finally deal with PHI Nodes and Value*
+ for(std::vector<const MachineInstr*>::iterator I = phiInstrs.begin(),
+ E = phiInstrs.end(); I != E; ++I) {
+
+ //Get Node for this instruction
+ std::map<const MachineInstr*, MSchedGraphNode*>::iterator X;
+ X = find(*I);
+
+ if(X == GraphMap.end())
+ continue;
+
+ MSchedGraphNode *node = X->second;
+
+ DEBUG(std::cerr << "Adding ite diff edges for node: " << *node << "\n");
+
+ //Loop over operands for this instruction and add value edges
+ for(unsigned i=0; i < (*I)->getNumOperands(); ++i) {
+ //Get Operand
+ const MachineOperand &mOp = (*I)->getOperand(i);
+ if((mOp.getType() == MachineOperand::MO_VirtualRegister
+ || mOp.getType() == MachineOperand::MO_CCRegister) && mOp.isUse()) {
+
+ //find the value in the map
+ if (const Value* srcI = mOp.getVRegValue()) {
+
+ //Find value in the map
+ std::map<const Value*, std::vector<OpIndexNodePair> >::iterator V
= valuetoNodeMap.find(srcI);
-
- //If there is something in the map already, add edges from
- //those instructions
- //to this one we are processing
- if(V != valuetoNodeMap.end()) {
- addValueEdges(V->second, node, mOp.isUse(), mOp.isDef(),
- phiInstrs, 1);
+
+ //If there is something in the map already, add edges from
+ //those instructions
+ //to this one we are processing
+ if(V != valuetoNodeMap.end()) {
+ addValueEdges(V->second, node, mOp.isUse(), mOp.isDef(),
+ phiInstrs, 1);
+ }
}
}
}
}
}
}
-
//Add dependencies for Value*s
void MSchedGraph::addValueEdges(std::vector<OpIndexNodePair> &NodesInMap,
MSchedGraphNode *destNode, bool nodeIsUse,
Index: llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h
diff -u llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h:1.12 llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h:1.13
--- llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h:1.12 Fri Apr 22 01:32:48 2005
+++ llvm/lib/Target/SparcV9/ModuloScheduling/MSchedGraph.h Sat Apr 30 18:07:58 2005
@@ -233,7 +233,7 @@
//Graph class to represent dependence graph
class MSchedGraph {
- const MachineBasicBlock *BB; //Machine basic block
+ std::vector<const MachineBasicBlock *> BBs; //Machine basic block
const TargetMachine &Target; //Target Machine
//Nodes
@@ -283,7 +283,7 @@
//Get Target or original machine basic block
const TargetMachine* getTarget() { return &Target; }
- const MachineBasicBlock* getBB() { return BB; }
+ std::vector<const MachineBasicBlock*> getBBs() { return BBs; }
};
Index: llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.cpp
diff -u llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.cpp:1.48 llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.cpp:1.49
--- llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.cpp:1.48 Fri Apr 22 01:32:48 2005
+++ llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.cpp Sat Apr 30 18:07:58 2005
@@ -1218,7 +1218,8 @@
void ModuloSchedulingPass::searchPath(MSchedGraphNode *node,
std::vector<MSchedGraphNode*> &path,
- std::set<MSchedGraphNode*> &nodesToAdd) {
+ std::set<MSchedGraphNode*> &nodesToAdd,
+ std::set<MSchedGraphNode*> &new_reccurrence) {
//Push node onto the path
path.push_back(node);
@@ -1227,23 +1228,32 @@
for(MSchedGraphNode::succ_iterator S = node->succ_begin(), SE = node->succ_end(); S != SE;
++S) {
- //If this node exists in a recurrence already in the partial order, then add all
- //nodes in the path to the set of nodes to add
- //Check if its already in our partial order, if not add it to the final vector
+ //Check if we should ignore this edge first
+ if(ignoreEdge(node,*S))
+ continue;
+
+ //check if successor is in this recurrence, we will get to it eventually
+ if(new_reccurrence.count(*S))
+ continue;
+
+ //If this node exists in a recurrence already in the partial
+ //order, then add all nodes in the path to the set of nodes to add
+ //Check if its already in our partial order, if not add it to the
+ //final vector
+ bool found = false;
for(std::vector<std::set<MSchedGraphNode*> >::iterator PO = partialOrder.begin(),
PE = partialOrder.end(); PO != PE; ++PO) {
- //Check if we should ignore this edge first
- if(ignoreEdge(node,*S))
- continue;
-
if(PO->count(*S)) {
- nodesToAdd.insert(*S);
- }
- //terminate
- else
- searchPath(*S, path, nodesToAdd);
+ found = true;
+ break;
}
+ }
+
+ if(!found) {
+ nodesToAdd.insert(*S);
+ searchPath(*S, path, nodesToAdd, new_reccurrence);
+ }
}
//Pop Node off the path
@@ -1344,7 +1354,7 @@
//Add nodes that connect this recurrence to recurrences in the partial path
for(std::set<MSchedGraphNode*>::iterator N = new_recurrence.begin(),
NE = new_recurrence.end(); N != NE; ++N)
- searchPath(*N, path, nodesToAdd);
+ searchPath(*N, path, nodesToAdd, new_recurrence);
//Add nodes to this recurrence if they are not already in the partial order
for(std::set<MSchedGraphNode*>::iterator N = nodesToAdd.begin(), NE = nodesToAdd.end();
@@ -1723,8 +1733,10 @@
E = FinalNodeOrder.end(); I != E; ++I) {
//CalculateEarly and Late start
- int EarlyStart = -1;
- int LateStart = 99999; //Set to something higher then we would ever expect (FIXME)
+ bool initialLSVal = false;
+ bool initialESVal = false;
+ int EarlyStart = 0;
+ int LateStart = 0;
bool hasSucc = false;
bool hasPred = false;
bool sched;
@@ -1751,7 +1763,12 @@
int ES_Temp = nodesByCycle->first + (*schedNode)->getLatency() - diff * II;
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
DEBUG(std::cerr << "Temp EarlyStart: " << ES_Temp << " Prev EarlyStart: " << EarlyStart << "\n");
- EarlyStart = std::max(EarlyStart, ES_Temp);
+ if(initialESVal)
+ EarlyStart = std::max(EarlyStart, ES_Temp);
+ else {
+ EarlyStart = ES_Temp;
+ initialESVal = true;
+ }
hasPred = true;
}
if((*I)->isSuccessor(*schedNode)) {
@@ -1759,7 +1776,12 @@
int LS_Temp = nodesByCycle->first - (*I)->getLatency() + diff * II;
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
DEBUG(std::cerr << "Temp LateStart: " << LS_Temp << " Prev LateStart: " << LateStart << "\n");
- LateStart = std::min(LateStart, LS_Temp);
+ if(initialLSVal)
+ LateStart = std::min(LateStart, LS_Temp);
+ else {
+ LateStart = LS_Temp;
+ initialLSVal = true;
+ }
hasSucc = true;
}
}
@@ -1772,7 +1794,7 @@
//Check if this node is a pred or succ to a branch, and restrict its placement
//even though the branch is not in the schedule
- int count = branches.size();
+ /*int count = branches.size();
for(std::vector<MSchedGraphNode*>::iterator B = branches.begin(), BE = branches.end();
B != BE; ++B) {
if((*I)->isPredecessor(*B)) {
@@ -1794,7 +1816,7 @@
}
count--;
- }
+ }*/
//Check if the node has no pred or successors and set Early Start to its ASAP
if(!hasSucc && !hasPred)
Index: llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h
diff -u llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h:1.29 llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h:1.30
--- llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h:1.29 Fri Apr 22 01:32:48 2005
+++ llvm/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h Sat Apr 30 18:07:59 2005
@@ -113,7 +113,8 @@
void searchPath(MSchedGraphNode *node,
std::vector<MSchedGraphNode*> &path,
- std::set<MSchedGraphNode*> &nodesToAdd);
+ std::set<MSchedGraphNode*> &nodesToAdd,
+ std::set<MSchedGraphNode*> &new_reccurence);
void pathToRecc(MSchedGraphNode *node,
std::vector<MSchedGraphNode*> &path,
More information about the llvm-commits
mailing list