diff options
author | Guochun Shi <gshi1@uiuc.edu> | 2003-03-27 17:57:44 +0000 |
---|---|---|
committer | Guochun Shi <gshi1@uiuc.edu> | 2003-03-27 17:57:44 +0000 |
commit | f1c154f5e69fdd11426b4e2a5cdea98fcab1606b (patch) | |
tree | a92fed3ba423c4c5707e22978f4d6710931ad1fc /lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h | |
parent | c277eaa41eb2ed6ab70855e170c07a17059c2bf3 (diff) |
*** empty log message ***
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5755 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h')
-rw-r--r-- | lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h new file mode 100644 index 0000000000..9f9fcaa791 --- /dev/null +++ b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h @@ -0,0 +1,160 @@ +//// - head file for the classes ModuloScheduling and ModuloScheduling ----*- C++ -*-===// +// +// This header defines the the classes ModuloScheduling and ModuloSchedulingSet 's structure +// +// +//===----------------------------------------------------------------------===// + + +#ifndef LLVM_CODEGEN_MODULOSCHEDULING_H +#define LLVM_CODEGEN_MODULOSCHEDULING_H + +#include "ModuloSchedGraph.h" +#include <iostream> + +class ModuloScheduling:NonCopyable { + private: + typedef std::vector<ModuloSchedGraphNode*> NodeVec; + + /// the graph to feed in + ModuloSchedGraph& graph; + const TargetMachine& target; + + //the BasicBlock to be scheduled + BasicBlock* bb; + + ///Iteration Intervel + ///FIXME: II may be a better name for its meaning + unsigned II; + + //the vector containing the nodes which have been scheduled + NodeVec nodeScheduled; + + ///the remaining unscheduled nodes + const NodeVec& oNodes; + + ///the machine resource table + std::vector< std::vector<pair<int,int> > > resourceTable ; + + ///the schedule( with many schedule stage) + std::vector<std::vector<ModuloSchedGraphNode*> > schedule; + + ///the kernel(core) schedule(length = II) + std::vector<std::vector<ModuloSchedGraphNode*> > coreSchedule; + + typedef BasicBlock::InstListType InstListType; + typedef std::vector <std::vector<ModuloSchedGraphNode*> > vvNodeType; + + + +public: + + ///constructor + ModuloScheduling(ModuloSchedGraph& _graph): + graph(_graph), + target(graph.getTarget()), + oNodes(graph.getONodes()) + { + II = graph.getMII(); + bb=(BasicBlock*)graph.getBasicBlocks()[0]; + + instrScheduling(); + }; + + ///destructor + ~ModuloScheduling(){}; + + ///the method to compute schedule and instert epilogue and prologue + void instrScheduling(); + + ///debug functions: + ///dump the schedule and core schedule + void dumpScheduling(); + + ///dump the input vector of nodes + //sch: the input vector of nodes + void dumpSchedule( std::vector<std::vector<ModuloSchedGraphNode*> > sch); + + ///dump the resource usage table + void dumpResourceUsageTable(); + + + //*******************internel functions******************************* +private: + //clear memory from the last round and initialize if necessary + void clearInitMem(const MachineSchedInfo& ); + + //compute schedule and coreSchedule with the current II + bool computeSchedule(); + + BasicBlock* getSuccBB(BasicBlock*); + BasicBlock* getPredBB(BasicBlock*); + void constructPrologue(BasicBlock* prologue); + void constructKernel(BasicBlock* prologue,BasicBlock* kernel,BasicBlock* epilogue); + void constructEpilogue(BasicBlock* epilogue,BasicBlock* succ_bb); + + ///update the resource table at the startCycle + //vec: the resouce usage + //startCycle: the start cycle the resouce usage is + void updateResourceTable(std::vector<vector<unsigned int> > vec,int startCycle); + + ///un-do the update in the resource table in the startCycle + //vec: the resouce usage + //startCycle: the start cycle the resouce usage is + void undoUpdateResourceTable(std::vector<vector<unsigned int> > vec,int startCycle); + + ///return whether the resourcetable has negative element + ///this function is called after updateResouceTable() to determine whether a node can + /// be scheduled at certain cycle + bool resourceTableNegative(); + + + ///try to Schedule the node starting from start to end cycle(inclusive) + //if it can be scheduled, put it in the schedule and update nodeScheduled + //node: the node to be scheduled + //start: start cycle + //end : end cycle + //nodeScheduled: a vector storing nodes which has been scheduled + bool ScheduleNode(ModuloSchedGraphNode* node,unsigned start, unsigned end, NodeVec& nodeScheduled); + + //each instruction has a memory of the latest clone instruction + //the clone instruction can be get using getClone() + //this function clears the memory, i.e. getClone() after calling this function returns null + void clearCloneMemory(); + + //this fuction make a clone of this input Instruction and update the clone memory + //inst: the instrution to be cloned + Instruction* cloneInstSetMemory(Instruction* inst); + + //this function update each instrutions which uses ist as its operand + //after update, each instruction will use ist's clone as its operand + void updateUseWithClone(Instruction* ist); + +}; + + +class ModuloSchedulingSet:NonCopyable{ + private: + + //the graphSet to feed in + ModuloSchedGraphSet& graphSet; + public: + + //constructor + //Scheduling graph one by one + ModuloSchedulingSet(ModuloSchedGraphSet _graphSet):graphSet(_graphSet){ + for(unsigned i=0;i<graphSet.size();i++){ + ModuloSchedGraph& graph=*(graphSet[i]); + if(graph.isLoop())ModuloScheduling ModuloScheduling(graph); + } + }; + + //destructor + ~ModuloSchedulingSet(){}; +}; + + + +#endif + + |