mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-15 19:24:33 +00:00
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). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21641 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -218,6 +218,8 @@ void DependenceAnalyzer::advancedDepAnalysis(GetElementPtrInst *gp1,
|
|||||||
//Find constant index difference
|
//Find constant index difference
|
||||||
int diff = A1->getValue()->getRawValue() - A2->getValue()->getRawValue();
|
int diff = A1->getValue()->getRawValue() - A2->getValue()->getRawValue();
|
||||||
std::cerr << diff << "\n";
|
std::cerr << diff << "\n";
|
||||||
|
if(diff > 5)
|
||||||
|
diff = 2;
|
||||||
|
|
||||||
if(diff > 0)
|
if(diff > 0)
|
||||||
createDep(deps, valLoad, val2Load, srcBeforeDest, diff);
|
createDep(deps, valLoad, val2Load, srcBeforeDest, diff);
|
||||||
|
@@ -153,12 +153,12 @@ MSchedGraph::MSchedGraph(const MachineBasicBlock *bb,
|
|||||||
std::map<const MachineInstr*, unsigned> &ignoreInstrs,
|
std::map<const MachineInstr*, unsigned> &ignoreInstrs,
|
||||||
DependenceAnalyzer &DA,
|
DependenceAnalyzer &DA,
|
||||||
std::map<MachineInstr*, Instruction*> &machineTollvm)
|
std::map<MachineInstr*, Instruction*> &machineTollvm)
|
||||||
: BB(bb), Target(targ) {
|
: Target(targ) {
|
||||||
|
|
||||||
//Make sure BB is not null,
|
//Make sure BB is not null,
|
||||||
assert(BB != NULL && "Basic Block is null");
|
assert(bb != NULL && "Basic Block is null");
|
||||||
|
|
||||||
//DEBUG(std::cerr << "Constructing graph for " << bb << "\n");
|
BBs.push_back(bb);
|
||||||
|
|
||||||
//Create nodes and edges for this BB
|
//Create nodes and edges for this BB
|
||||||
buildNodesAndEdges(ignoreInstrs, DA, machineTollvm);
|
buildNodesAndEdges(ignoreInstrs, DA, machineTollvm);
|
||||||
@@ -170,7 +170,9 @@ MSchedGraph::MSchedGraph(const MachineBasicBlock *bb,
|
|||||||
//Copies the graph and keeps a map from old to new nodes
|
//Copies the graph and keeps a map from old to new nodes
|
||||||
MSchedGraph::MSchedGraph(const MSchedGraph &G,
|
MSchedGraph::MSchedGraph(const MSchedGraph &G,
|
||||||
std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes)
|
std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes)
|
||||||
: BB(G.BB), Target(G.Target) {
|
: Target(G.Target) {
|
||||||
|
|
||||||
|
BBs = G.BBs;
|
||||||
|
|
||||||
std::map<MSchedGraphNode*, MSchedGraphNode*> oldToNew;
|
std::map<MSchedGraphNode*, MSchedGraphNode*> oldToNew;
|
||||||
//Copy all nodes
|
//Copy all nodes
|
||||||
@@ -336,6 +338,11 @@ void MSchedGraph::buildNodesAndEdges(std::map<const MachineInstr*, unsigned> &ig
|
|||||||
std::vector<const MachineInstr*> phiInstrs;
|
std::vector<const MachineInstr*> phiInstrs;
|
||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
|
|
||||||
|
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
|
//Loop over instructions in MBB and add nodes and edges
|
||||||
for (MachineBasicBlock::const_iterator MI = BB->begin(), e = BB->end();
|
for (MachineBasicBlock::const_iterator MI = BB->begin(), e = BB->end();
|
||||||
MI != e; ++MI) {
|
MI != e; ++MI) {
|
||||||
@@ -508,7 +515,7 @@ void MSchedGraph::buildNodesAndEdges(std::map<const MachineInstr*, unsigned> &ig
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//Add dependencies for Value*s
|
//Add dependencies for Value*s
|
||||||
void MSchedGraph::addValueEdges(std::vector<OpIndexNodePair> &NodesInMap,
|
void MSchedGraph::addValueEdges(std::vector<OpIndexNodePair> &NodesInMap,
|
||||||
MSchedGraphNode *destNode, bool nodeIsUse,
|
MSchedGraphNode *destNode, bool nodeIsUse,
|
||||||
|
@@ -233,7 +233,7 @@ namespace llvm {
|
|||||||
//Graph class to represent dependence graph
|
//Graph class to represent dependence graph
|
||||||
class MSchedGraph {
|
class MSchedGraph {
|
||||||
|
|
||||||
const MachineBasicBlock *BB; //Machine basic block
|
std::vector<const MachineBasicBlock *> BBs; //Machine basic block
|
||||||
const TargetMachine &Target; //Target Machine
|
const TargetMachine &Target; //Target Machine
|
||||||
|
|
||||||
//Nodes
|
//Nodes
|
||||||
@@ -283,7 +283,7 @@ namespace llvm {
|
|||||||
|
|
||||||
//Get Target or original machine basic block
|
//Get Target or original machine basic block
|
||||||
const TargetMachine* getTarget() { return &Target; }
|
const TargetMachine* getTarget() { return &Target; }
|
||||||
const MachineBasicBlock* getBB() { return BB; }
|
std::vector<const MachineBasicBlock*> getBBs() { return BBs; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1218,7 +1218,8 @@ void ModuloSchedulingPass::findAllReccurrences(MSchedGraphNode *node,
|
|||||||
|
|
||||||
void ModuloSchedulingPass::searchPath(MSchedGraphNode *node,
|
void ModuloSchedulingPass::searchPath(MSchedGraphNode *node,
|
||||||
std::vector<MSchedGraphNode*> &path,
|
std::vector<MSchedGraphNode*> &path,
|
||||||
std::set<MSchedGraphNode*> &nodesToAdd) {
|
std::set<MSchedGraphNode*> &nodesToAdd,
|
||||||
|
std::set<MSchedGraphNode*> &new_reccurrence) {
|
||||||
//Push node onto the path
|
//Push node onto the path
|
||||||
path.push_back(node);
|
path.push_back(node);
|
||||||
|
|
||||||
@@ -1227,22 +1228,31 @@ void ModuloSchedulingPass::searchPath(MSchedGraphNode *node,
|
|||||||
for(MSchedGraphNode::succ_iterator S = node->succ_begin(), SE = node->succ_end(); S != SE;
|
for(MSchedGraphNode::succ_iterator S = node->succ_begin(), SE = node->succ_end(); S != SE;
|
||||||
++S) {
|
++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
|
|
||||||
for(std::vector<std::set<MSchedGraphNode*> >::iterator PO = partialOrder.begin(),
|
|
||||||
PE = partialOrder.end(); PO != PE; ++PO) {
|
|
||||||
|
|
||||||
//Check if we should ignore this edge first
|
//Check if we should ignore this edge first
|
||||||
if(ignoreEdge(node,*S))
|
if(ignoreEdge(node,*S))
|
||||||
continue;
|
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) {
|
||||||
|
|
||||||
if(PO->count(*S)) {
|
if(PO->count(*S)) {
|
||||||
nodesToAdd.insert(*S);
|
found = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
//terminate
|
}
|
||||||
else
|
|
||||||
searchPath(*S, path, nodesToAdd);
|
if(!found) {
|
||||||
|
nodesToAdd.insert(*S);
|
||||||
|
searchPath(*S, path, nodesToAdd, new_reccurrence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1344,7 +1354,7 @@ void ModuloSchedulingPass::computePartialOrder() {
|
|||||||
//Add nodes that connect this recurrence to recurrences in the partial path
|
//Add nodes that connect this recurrence to recurrences in the partial path
|
||||||
for(std::set<MSchedGraphNode*>::iterator N = new_recurrence.begin(),
|
for(std::set<MSchedGraphNode*>::iterator N = new_recurrence.begin(),
|
||||||
NE = new_recurrence.end(); N != NE; ++N)
|
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
|
//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();
|
for(std::set<MSchedGraphNode*>::iterator N = nodesToAdd.begin(), NE = nodesToAdd.end();
|
||||||
@@ -1723,8 +1733,10 @@ bool ModuloSchedulingPass::computeSchedule(const MachineBasicBlock *BB, MSchedGr
|
|||||||
E = FinalNodeOrder.end(); I != E; ++I) {
|
E = FinalNodeOrder.end(); I != E; ++I) {
|
||||||
|
|
||||||
//CalculateEarly and Late start
|
//CalculateEarly and Late start
|
||||||
int EarlyStart = -1;
|
bool initialLSVal = false;
|
||||||
int LateStart = 99999; //Set to something higher then we would ever expect (FIXME)
|
bool initialESVal = false;
|
||||||
|
int EarlyStart = 0;
|
||||||
|
int LateStart = 0;
|
||||||
bool hasSucc = false;
|
bool hasSucc = false;
|
||||||
bool hasPred = false;
|
bool hasPred = false;
|
||||||
bool sched;
|
bool sched;
|
||||||
@@ -1751,7 +1763,12 @@ bool ModuloSchedulingPass::computeSchedule(const MachineBasicBlock *BB, MSchedGr
|
|||||||
int ES_Temp = nodesByCycle->first + (*schedNode)->getLatency() - diff * II;
|
int ES_Temp = nodesByCycle->first + (*schedNode)->getLatency() - diff * II;
|
||||||
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
|
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
|
||||||
DEBUG(std::cerr << "Temp EarlyStart: " << ES_Temp << " Prev EarlyStart: " << EarlyStart << "\n");
|
DEBUG(std::cerr << "Temp EarlyStart: " << ES_Temp << " Prev EarlyStart: " << EarlyStart << "\n");
|
||||||
|
if(initialESVal)
|
||||||
EarlyStart = std::max(EarlyStart, ES_Temp);
|
EarlyStart = std::max(EarlyStart, ES_Temp);
|
||||||
|
else {
|
||||||
|
EarlyStart = ES_Temp;
|
||||||
|
initialESVal = true;
|
||||||
|
}
|
||||||
hasPred = true;
|
hasPred = true;
|
||||||
}
|
}
|
||||||
if((*I)->isSuccessor(*schedNode)) {
|
if((*I)->isSuccessor(*schedNode)) {
|
||||||
@@ -1759,7 +1776,12 @@ bool ModuloSchedulingPass::computeSchedule(const MachineBasicBlock *BB, MSchedGr
|
|||||||
int LS_Temp = nodesByCycle->first - (*I)->getLatency() + diff * II;
|
int LS_Temp = nodesByCycle->first - (*I)->getLatency() + diff * II;
|
||||||
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
|
DEBUG(std::cerr << "Diff: " << diff << " Cycle: " << nodesByCycle->first << "\n");
|
||||||
DEBUG(std::cerr << "Temp LateStart: " << LS_Temp << " Prev LateStart: " << LateStart << "\n");
|
DEBUG(std::cerr << "Temp LateStart: " << LS_Temp << " Prev LateStart: " << LateStart << "\n");
|
||||||
|
if(initialLSVal)
|
||||||
LateStart = std::min(LateStart, LS_Temp);
|
LateStart = std::min(LateStart, LS_Temp);
|
||||||
|
else {
|
||||||
|
LateStart = LS_Temp;
|
||||||
|
initialLSVal = true;
|
||||||
|
}
|
||||||
hasSucc = true;
|
hasSucc = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1772,7 +1794,7 @@ bool ModuloSchedulingPass::computeSchedule(const MachineBasicBlock *BB, MSchedGr
|
|||||||
|
|
||||||
//Check if this node is a pred or succ to a branch, and restrict its placement
|
//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
|
//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();
|
for(std::vector<MSchedGraphNode*>::iterator B = branches.begin(), BE = branches.end();
|
||||||
B != BE; ++B) {
|
B != BE; ++B) {
|
||||||
if((*I)->isPredecessor(*B)) {
|
if((*I)->isPredecessor(*B)) {
|
||||||
@@ -1794,7 +1816,7 @@ bool ModuloSchedulingPass::computeSchedule(const MachineBasicBlock *BB, MSchedGr
|
|||||||
}
|
}
|
||||||
|
|
||||||
count--;
|
count--;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
//Check if the node has no pred or successors and set Early Start to its ASAP
|
//Check if the node has no pred or successors and set Early Start to its ASAP
|
||||||
if(!hasSucc && !hasPred)
|
if(!hasSucc && !hasPred)
|
||||||
|
@@ -113,7 +113,8 @@ namespace llvm {
|
|||||||
|
|
||||||
void searchPath(MSchedGraphNode *node,
|
void searchPath(MSchedGraphNode *node,
|
||||||
std::vector<MSchedGraphNode*> &path,
|
std::vector<MSchedGraphNode*> &path,
|
||||||
std::set<MSchedGraphNode*> &nodesToAdd);
|
std::set<MSchedGraphNode*> &nodesToAdd,
|
||||||
|
std::set<MSchedGraphNode*> &new_reccurence);
|
||||||
|
|
||||||
void pathToRecc(MSchedGraphNode *node,
|
void pathToRecc(MSchedGraphNode *node,
|
||||||
std::vector<MSchedGraphNode*> &path,
|
std::vector<MSchedGraphNode*> &path,
|
||||||
|
Reference in New Issue
Block a user