diff options
author | Guochun Shi <gshi1@uiuc.edu> | 2003-06-02 17:48:56 +0000 |
---|---|---|
committer | Guochun Shi <gshi1@uiuc.edu> | 2003-06-02 17:48:56 +0000 |
commit | 099b064a464d091f6800e2cd19e67cb4354952ec (patch) | |
tree | 993b8f9df232782cc87b48ba8fe4a98dedcf26a8 /lib | |
parent | b84388937cbe7d5cb32a39e649ef020d4d7e5cb5 (diff) | |
download | external_llvm-099b064a464d091f6800e2cd19e67cb4354952ec.zip external_llvm-099b064a464d091f6800e2cd19e67cb4354952ec.tar.gz external_llvm-099b064a464d091f6800e2cd19e67cb4354952ec.tar.bz2 |
compiled with the new SchedGraphCommon
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6545 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
6 files changed, 76 insertions, 54 deletions
diff --git a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp index 8bc78ad..ebbb499 100644 --- a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp +++ b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp @@ -50,12 +50,12 @@ struct ValueToDefVecMap:public hash_map<const Instruction*,RefVec> { // class Modulo SchedGraphNode -ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int _nodeId, - const BasicBlock * _bb, - const Instruction * _inst, +ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int in_nodeId, + const BasicBlock * in_bb, + const Instruction * in_inst, int indexInBB, const TargetMachine & target) -:SchedGraphNodeCommon(_nodeId, _bb, indexInBB), inst(_inst) +:SchedGraphNodeCommon(in_nodeId, indexInBB), inst(in_inst) { if (inst) { //FIXME: find the latency @@ -298,8 +298,7 @@ bool ModuloSchedGraph::isLoop() { //only if the last instruction in the basicblock is branch instruction and //there is at least an option to branch itself - assert(bbVec.size() == 1 && "only 1 basicblock in a graph"); - const BasicBlock *bb = bbVec[0]; + assert(this->bb&& "the basicblock is not empty"); const Instruction *inst = &(bb->back()); if (BranchInst::classof(inst)) for (unsigned i = 0; i < ((BranchInst *) inst)->getNumSuccessors(); @@ -308,7 +307,7 @@ bool ModuloSchedGraph::isLoop() { if (sb == bb) return true; } - + return false; } @@ -674,7 +673,6 @@ void ModuloSchedGraph::orderNodes() { oNodes.clear(); std::vector < ModuloSchedGraphNode * >set; - const BasicBlock *bb = bbVec[0]; unsigned numNodes = bb->size(); // first order all the sets @@ -873,9 +871,8 @@ void ModuloSchedGraph::orderNodes() { void ModuloSchedGraph::buildGraph(const TargetMachine & target) { - const BasicBlock *bb = bbVec[0]; - assert(bbVec.size() == 1 && "only handling a single basic block here"); + assert(this->bb && "The basicBlock is NULL?"); // Use this data structure to note all machine operands that compute // ordinary LLVM values. These must be computed defs (i.e., instructions). @@ -1277,10 +1274,9 @@ void ModuloSchedGraph::dump(const BasicBlock * bb, std::ostream & os) void ModuloSchedGraph::dump() const { DEBUG(std::cerr << " ModuloSchedGraph for basic Blocks:"); - for (unsigned i = 0, N = bbVec.size(); i < N; i++) { - DEBUG(std::cerr << (bbVec[i]->hasName()? bbVec[i]->getName() : "block") - << " (" << bbVec[i] << ")" << ((i == N - 1) ? "" : ", ")); - } + + DEBUG(std::cerr << (bb->hasName()? bb->getName() : "block") + << " (" << bb << ")" << ""); DEBUG(std::cerr << "\n\n Actual Root nodes : "); for (unsigned i = 0, N = graphRoot->outEdges.size(); i < N; i++) @@ -1290,7 +1286,7 @@ void ModuloSchedGraph::dump() const DEBUG(std::cerr << "\n Graph Nodes:\n"); //for (const_iterator I=begin(); I != end(); ++I) //DEBUG(std::cerr << "\n" << *I->second; - unsigned numNodes = bbVec[0]->size(); + unsigned numNodes = bb->size(); for (unsigned i = 2; i < numNodes + 2; i++) { ModuloSchedGraphNode *node = getNode(i); DEBUG(std::cerr << "\n" << *node); @@ -1301,7 +1297,7 @@ void ModuloSchedGraph::dump() const void ModuloSchedGraph::dumpNodeProperty() const { - const BasicBlock *bb = bbVec[0]; + unsigned numNodes = bb->size(); for (unsigned i = 2; i < numNodes + 2; i++) { ModuloSchedGraphNode *node = getNode(i); @@ -1317,8 +1313,11 @@ void ModuloSchedGraph::dumpNodeProperty() const void ModuloSchedGraphSet::buildGraphsForMethod(const Function *F, const TargetMachine &target) { - for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI) - addGraph(new ModuloSchedGraph(BI, target)); + for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI){ + const BasicBlock* local_bb; + local_bb=BI; + addGraph(new ModuloSchedGraph((BasicBlock*)local_bb, target)); + } } std::ostream& operator<<(std::ostream &os, diff --git a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h index 9fe40f2..7cdfdd9 100644 --- a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h +++ b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h @@ -56,6 +56,7 @@ public: const unsigned getInstOpcode() const { return inst->getOpcode(); } + //return whether the node is NULL bool isNullNode() const { return (inst == NULL); @@ -138,6 +139,9 @@ class ModuloSchedGraph : protected hash_map<const Instruction*,ModuloSchedGraphNode*> { private: + + BasicBlock* bb; + //iteration Interval int MII; @@ -153,14 +157,14 @@ private: typedef std::vector<ModuloSchedGraphNode*> NodeVec; //the function to compute properties - void computeNodeASAP(const BasicBlock *bb); - void computeNodeALAP(const BasicBlock *bb); - void computeNodeMov(const BasicBlock *bb); - void computeNodeDepth(const BasicBlock *bb); - void computeNodeHeight(const BasicBlock *bb); + void computeNodeASAP(const BasicBlock * in_bb); + void computeNodeALAP(const BasicBlock * in_bb); + void computeNodeMov(const BasicBlock * in_bb); + void computeNodeDepth(const BasicBlock * in_bb); + void computeNodeHeight(const BasicBlock * in_bb); //the function to compute node property - void computeNodeProperty(const BasicBlock *bb); + void computeNodeProperty(const BasicBlock * in_bb); //the function to sort nodes void orderNodes(); @@ -220,6 +224,13 @@ public: const TargetMachine & getTarget() { return target; } + + //get the basic block + BasicBlock* getBasicBlock() const { + return bb; + } + + //get the iteration interval const int getMII() { return MII; @@ -265,8 +276,9 @@ private: friend class ModuloSchedGraphSet; //give access to ctor public: - ModuloSchedGraph(const BasicBlock *bb, const TargetMachine &_target) - :SchedGraphCommon(bb), target(_target) + ModuloSchedGraph(BasicBlock * in_bb, + const TargetMachine & in_target) + :SchedGraphCommon(), bb(in_bb),target(in_target) { buildGraph(target); } diff --git a/lib/CodeGen/ModuloScheduling/ModuloScheduling.h b/lib/CodeGen/ModuloScheduling/ModuloScheduling.h index 782476e..5e1e53e 100644 --- a/lib/CodeGen/ModuloScheduling/ModuloScheduling.h +++ b/lib/CodeGen/ModuloScheduling/ModuloScheduling.h @@ -65,7 +65,7 @@ public: graph(_graph), target(graph.getTarget()), oNodes(graph.getONodes()) { II = graph.getMII(); - bb = (BasicBlock *) graph.getBasicBlocks()[0]; + bb = graph.getBasicBlock(); instrScheduling(); }; diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp index 8bc78ad..ebbb499 100644 --- a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp +++ b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp @@ -50,12 +50,12 @@ struct ValueToDefVecMap:public hash_map<const Instruction*,RefVec> { // class Modulo SchedGraphNode -ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int _nodeId, - const BasicBlock * _bb, - const Instruction * _inst, +ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int in_nodeId, + const BasicBlock * in_bb, + const Instruction * in_inst, int indexInBB, const TargetMachine & target) -:SchedGraphNodeCommon(_nodeId, _bb, indexInBB), inst(_inst) +:SchedGraphNodeCommon(in_nodeId, indexInBB), inst(in_inst) { if (inst) { //FIXME: find the latency @@ -298,8 +298,7 @@ bool ModuloSchedGraph::isLoop() { //only if the last instruction in the basicblock is branch instruction and //there is at least an option to branch itself - assert(bbVec.size() == 1 && "only 1 basicblock in a graph"); - const BasicBlock *bb = bbVec[0]; + assert(this->bb&& "the basicblock is not empty"); const Instruction *inst = &(bb->back()); if (BranchInst::classof(inst)) for (unsigned i = 0; i < ((BranchInst *) inst)->getNumSuccessors(); @@ -308,7 +307,7 @@ bool ModuloSchedGraph::isLoop() { if (sb == bb) return true; } - + return false; } @@ -674,7 +673,6 @@ void ModuloSchedGraph::orderNodes() { oNodes.clear(); std::vector < ModuloSchedGraphNode * >set; - const BasicBlock *bb = bbVec[0]; unsigned numNodes = bb->size(); // first order all the sets @@ -873,9 +871,8 @@ void ModuloSchedGraph::orderNodes() { void ModuloSchedGraph::buildGraph(const TargetMachine & target) { - const BasicBlock *bb = bbVec[0]; - assert(bbVec.size() == 1 && "only handling a single basic block here"); + assert(this->bb && "The basicBlock is NULL?"); // Use this data structure to note all machine operands that compute // ordinary LLVM values. These must be computed defs (i.e., instructions). @@ -1277,10 +1274,9 @@ void ModuloSchedGraph::dump(const BasicBlock * bb, std::ostream & os) void ModuloSchedGraph::dump() const { DEBUG(std::cerr << " ModuloSchedGraph for basic Blocks:"); - for (unsigned i = 0, N = bbVec.size(); i < N; i++) { - DEBUG(std::cerr << (bbVec[i]->hasName()? bbVec[i]->getName() : "block") - << " (" << bbVec[i] << ")" << ((i == N - 1) ? "" : ", ")); - } + + DEBUG(std::cerr << (bb->hasName()? bb->getName() : "block") + << " (" << bb << ")" << ""); DEBUG(std::cerr << "\n\n Actual Root nodes : "); for (unsigned i = 0, N = graphRoot->outEdges.size(); i < N; i++) @@ -1290,7 +1286,7 @@ void ModuloSchedGraph::dump() const DEBUG(std::cerr << "\n Graph Nodes:\n"); //for (const_iterator I=begin(); I != end(); ++I) //DEBUG(std::cerr << "\n" << *I->second; - unsigned numNodes = bbVec[0]->size(); + unsigned numNodes = bb->size(); for (unsigned i = 2; i < numNodes + 2; i++) { ModuloSchedGraphNode *node = getNode(i); DEBUG(std::cerr << "\n" << *node); @@ -1301,7 +1297,7 @@ void ModuloSchedGraph::dump() const void ModuloSchedGraph::dumpNodeProperty() const { - const BasicBlock *bb = bbVec[0]; + unsigned numNodes = bb->size(); for (unsigned i = 2; i < numNodes + 2; i++) { ModuloSchedGraphNode *node = getNode(i); @@ -1317,8 +1313,11 @@ void ModuloSchedGraph::dumpNodeProperty() const void ModuloSchedGraphSet::buildGraphsForMethod(const Function *F, const TargetMachine &target) { - for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI) - addGraph(new ModuloSchedGraph(BI, target)); + for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI){ + const BasicBlock* local_bb; + local_bb=BI; + addGraph(new ModuloSchedGraph((BasicBlock*)local_bb, target)); + } } std::ostream& operator<<(std::ostream &os, diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h index 9fe40f2..7cdfdd9 100644 --- a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h +++ b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h @@ -56,6 +56,7 @@ public: const unsigned getInstOpcode() const { return inst->getOpcode(); } + //return whether the node is NULL bool isNullNode() const { return (inst == NULL); @@ -138,6 +139,9 @@ class ModuloSchedGraph : protected hash_map<const Instruction*,ModuloSchedGraphNode*> { private: + + BasicBlock* bb; + //iteration Interval int MII; @@ -153,14 +157,14 @@ private: typedef std::vector<ModuloSchedGraphNode*> NodeVec; //the function to compute properties - void computeNodeASAP(const BasicBlock *bb); - void computeNodeALAP(const BasicBlock *bb); - void computeNodeMov(const BasicBlock *bb); - void computeNodeDepth(const BasicBlock *bb); - void computeNodeHeight(const BasicBlock *bb); + void computeNodeASAP(const BasicBlock * in_bb); + void computeNodeALAP(const BasicBlock * in_bb); + void computeNodeMov(const BasicBlock * in_bb); + void computeNodeDepth(const BasicBlock * in_bb); + void computeNodeHeight(const BasicBlock * in_bb); //the function to compute node property - void computeNodeProperty(const BasicBlock *bb); + void computeNodeProperty(const BasicBlock * in_bb); //the function to sort nodes void orderNodes(); @@ -220,6 +224,13 @@ public: const TargetMachine & getTarget() { return target; } + + //get the basic block + BasicBlock* getBasicBlock() const { + return bb; + } + + //get the iteration interval const int getMII() { return MII; @@ -265,8 +276,9 @@ private: friend class ModuloSchedGraphSet; //give access to ctor public: - ModuloSchedGraph(const BasicBlock *bb, const TargetMachine &_target) - :SchedGraphCommon(bb), target(_target) + ModuloSchedGraph(BasicBlock * in_bb, + const TargetMachine & in_target) + :SchedGraphCommon(), bb(in_bb),target(in_target) { buildGraph(target); } diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h index 782476e..5e1e53e 100644 --- a/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h +++ b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h @@ -65,7 +65,7 @@ public: graph(_graph), target(graph.getTarget()), oNodes(graph.getONodes()) { II = graph.getMII(); - bb = (BasicBlock *) graph.getBasicBlocks()[0]; + bb = graph.getBasicBlock(); instrScheduling(); }; |