blob: 737a92c97d68dfb561b0b625eb3a48ad517c1100 [file] [log] [blame]
Misha Brukman8baa01c2003-04-09 21:51:34 +00001// ModuloScheduling.h -------------------------------------------*- C++ -*-===//
Guochun Shif1c154f2003-03-27 17:57:44 +00002//
Misha Brukman8baa01c2003-04-09 21:51:34 +00003// This header defines the the classes ModuloScheduling and
4// ModuloSchedulingSet's structure
Guochun Shif1c154f2003-03-27 17:57:44 +00005//
6//===----------------------------------------------------------------------===//
7
8
9#ifndef LLVM_CODEGEN_MODULOSCHEDULING_H
10#define LLVM_CODEGEN_MODULOSCHEDULING_H
11
12#include "ModuloSchedGraph.h"
13#include <iostream>
Guochun Shi6fbe5fb2003-04-06 23:56:19 +000014#include <vector>
15
Misha Brukman8baa01c2003-04-09 21:51:34 +000016class ModuloScheduling: NonCopyable {
17private:
Guochun Shif1c154f2003-03-27 17:57:44 +000018
Guochun Shif1c154f2003-03-27 17:57:44 +000019 typedef std::vector<ModuloSchedGraphNode*> NodeVec;
Misha Brukman8baa01c2003-04-09 21:51:34 +000020 typedef std::vector<std::vector<unsigned> > Resources;
Guochun Shif1c154f2003-03-27 17:57:44 +000021
Misha Brukman8baa01c2003-04-09 21:51:34 +000022 // The graph to feed in
23 ModuloSchedGraph &graph;
24 const TargetMachine &target;
25
26 // The BasicBlock to be scheduled
27 BasicBlock *bb;
28
29 // Iteration Interval
30 // FIXME: II may be a better name for its meaning
Guochun Shif1c154f2003-03-27 17:57:44 +000031 unsigned II;
32
Misha Brukman8baa01c2003-04-09 21:51:34 +000033 // The vector containing the nodes which have been scheduled
Guochun Shif1c154f2003-03-27 17:57:44 +000034 NodeVec nodeScheduled;
Misha Brukman8baa01c2003-04-09 21:51:34 +000035
36 // The remaining unscheduled nodes
37 const NodeVec &oNodes;
38
39 // The machine resource table
40 std::vector<std::vector<std::pair<int,int> > > resourceTable;
41
Guochun Shif1c154f2003-03-27 17:57:44 +000042 ///the schedule( with many schedule stage)
43 std::vector<std::vector<ModuloSchedGraphNode*> > schedule;
Misha Brukman8baa01c2003-04-09 21:51:34 +000044
Guochun Shif1c154f2003-03-27 17:57:44 +000045 ///the kernel(core) schedule(length = II)
46 std::vector<std::vector<ModuloSchedGraphNode*> > coreSchedule;
47
Misha Brukman8baa01c2003-04-09 21:51:34 +000048 typedef BasicBlock::InstListType InstListType;
49 typedef std::vector<std::vector<ModuloSchedGraphNode*> > vvNodeType;
Guochun Shif1c154f2003-03-27 17:57:44 +000050
51public:
Guochun Shif1c154f2003-03-27 17:57:44 +000052
Misha Brukman8baa01c2003-04-09 21:51:34 +000053 ModuloScheduling(ModuloSchedGraph & _graph):
54 graph(_graph), target(graph.getTarget()), oNodes(graph.getONodes())
55 {
56 II = graph.getMII();
57 bb = (BasicBlock *) graph.getBasicBlocks()[0];
58 instrScheduling();
59 };
Guochun Shif1c154f2003-03-27 17:57:44 +000060
Misha Brukman8baa01c2003-04-09 21:51:34 +000061 ~ModuloScheduling() {};
Guochun Shif1c154f2003-03-27 17:57:44 +000062
63 ///the method to compute schedule and instert epilogue and prologue
64 void instrScheduling();
65
66 ///debug functions:
67 ///dump the schedule and core schedule
Misha Brukman8baa01c2003-04-09 21:51:34 +000068 void
69 dumpScheduling();
70
Guochun Shif1c154f2003-03-27 17:57:44 +000071 ///dump the input vector of nodes
72 //sch: the input vector of nodes
Misha Brukman8baa01c2003-04-09 21:51:34 +000073 void dumpSchedule(std::vector<std::vector<ModuloSchedGraphNode*>> sch);
Guochun Shif1c154f2003-03-27 17:57:44 +000074
75 ///dump the resource usage table
76 void dumpResourceUsageTable();
77
Misha Brukman8baa01c2003-04-09 21:51:34 +000078 //*******************internal functions*******************************
Guochun Shif1c154f2003-03-27 17:57:44 +000079private:
80 //clear memory from the last round and initialize if necessary
Misha Brukman8baa01c2003-04-09 21:51:34 +000081 void clearInitMem(const TargetSchedInfo&);
Guochun Shif1c154f2003-03-27 17:57:44 +000082
83 //compute schedule and coreSchedule with the current II
84 bool computeSchedule();
85
Misha Brukman8baa01c2003-04-09 21:51:34 +000086 BasicBlock *getSuccBB(BasicBlock *);
87 BasicBlock *getPredBB(BasicBlock *);
88 void constructPrologue(BasicBlock *prologue);
89 void constructKernel(BasicBlock *prologue,
90 BasicBlock *kernel,
91 BasicBlock *epilogue);
92 void constructEpilogue(BasicBlock *epilogue, BasicBlock *succ_bb);
Guochun Shif1c154f2003-03-27 17:57:44 +000093
Misha Brukman8baa01c2003-04-09 21:51:34 +000094 // update the resource table at the startCycle
95 // vec: the resouce usage
96 // startCycle: the start cycle the resouce usage is
97 void updateResourceTable(std::vector<std::vector<unsigned int>> vec,
98 int startCycle);
Guochun Shif1c154f2003-03-27 17:57:44 +000099
Misha Brukman8baa01c2003-04-09 21:51:34 +0000100 // un-do the update in the resource table in the startCycle
101 // vec: the resouce usage
102 // startCycle: the start cycle the resouce usage is
103 void undoUpdateResourceTable(std::vector<vector<unsigned int>> vec,
104 int startCycle);
Guochun Shif1c154f2003-03-27 17:57:44 +0000105
Misha Brukman8baa01c2003-04-09 21:51:34 +0000106 // return whether the resourcetable has negative element
107 // this function is called after updateResouceTable() to determine whether a
108 // node can be scheduled at certain cycle
Guochun Shif1c154f2003-03-27 17:57:44 +0000109 bool resourceTableNegative();
110
Misha Brukman8baa01c2003-04-09 21:51:34 +0000111 // try to Schedule the node starting from start to end cycle(inclusive)
112 // if it can be scheduled, put it in the schedule and update nodeScheduled
113 // node: the node to be scheduled
114 // start: start cycle
115 // end : end cycle
116 // nodeScheduled: a vector storing nodes which has been scheduled
117 bool ScheduleNode(ModuloSchedGraphNode * node, unsigned start,
118 unsigned end, NodeVec &nodeScheduled);
Guochun Shif1c154f2003-03-27 17:57:44 +0000119
120 //each instruction has a memory of the latest clone instruction
121 //the clone instruction can be get using getClone()
Misha Brukman8baa01c2003-04-09 21:51:34 +0000122 //this function clears the memory, i.e. getClone() after calling this function
123 //returns null
Guochun Shif1c154f2003-03-27 17:57:44 +0000124 void clearCloneMemory();
125
Misha Brukman8baa01c2003-04-09 21:51:34 +0000126 //this fuction make a clone of this input Instruction and update the clone
127 //memory
Guochun Shif1c154f2003-03-27 17:57:44 +0000128 //inst: the instrution to be cloned
Misha Brukman8baa01c2003-04-09 21:51:34 +0000129 Instruction *cloneInstSetMemory(Instruction *inst);
Guochun Shif1c154f2003-03-27 17:57:44 +0000130
131 //this function update each instrutions which uses ist as its operand
132 //after update, each instruction will use ist's clone as its operand
Misha Brukman8baa01c2003-04-09 21:51:34 +0000133 void updateUseWithClone(Instruction * ist);
Guochun Shif1c154f2003-03-27 17:57:44 +0000134
135};
136
137
Misha Brukman8baa01c2003-04-09 21:51:34 +0000138class ModuloSchedulingSet:
139NonCopyable {
140private:
141
Guochun Shif1c154f2003-03-27 17:57:44 +0000142 //the graphSet to feed in
Misha Brukman8baa01c2003-04-09 21:51:34 +0000143 ModuloSchedGraphSet & graphSet;
144
145public:
Guochun Shif1c154f2003-03-27 17:57:44 +0000146
147 //constructor
148 //Scheduling graph one by one
Misha Brukman8baa01c2003-04-09 21:51:34 +0000149 ModuloSchedulingSet(ModuloSchedGraphSet _graphSet): graphSet(_graphSet) {
150 for (unsigned i = 0; i < graphSet.size(); i++) {
151 ModuloSchedGraph & graph = *(graphSet[i]);
152 if (graph.isLoop())
153 ModuloScheduling ModuloScheduling(graph);
Guochun Shif1c154f2003-03-27 17:57:44 +0000154 }
155 };
Misha Brukman8baa01c2003-04-09 21:51:34 +0000156
157 ~ModuloSchedulingSet() {};
Guochun Shif1c154f2003-03-27 17:57:44 +0000158};
159
Guochun Shif1c154f2003-03-27 17:57:44 +0000160#endif