Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 1 | //===- ModuloSchedGraph.h - Modulo Scheduling Graph and Set -*- C++ -*-----===// |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 2 | // |
| 3 | // This header defines the primative classes that make up a data structure |
| 4 | // graph. |
| 5 | // |
| 6 | //===----------------------------------------------------------------------===// |
| 7 | |
| 8 | #ifndef LLVM_CODEGEN_MODULO_SCHED_GRAPH_H |
| 9 | #define LLVM_CODEGEN_MODULO_SCHED_GRAPH_H |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 10 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 11 | #include "llvm/Instruction.h" |
| 12 | #include "llvm/Target/TargetMachine.h" |
Guochun Shi | 6fbe5fb | 2003-04-06 23:56:19 +0000 | [diff] [blame] | 13 | #include "llvm/Target/TargetInstrInfo.h" |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 14 | #include "Support/HashExtras.h" |
| 15 | #include "Support/GraphTraits.h" |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 16 | #include "Support/hash_map" |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 17 | #include "../InstrSched/SchedGraphCommon.h" |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 18 | #include <iostream> |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 19 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 20 | //===----------------------------------------------------------------------===// |
| 21 | // ModuloSchedGraphNode - Implement a data structure based on the |
| 22 | // SchedGraphNodeCommon this class stores informtion needed later to order the |
| 23 | // nodes in modulo scheduling |
| 24 | // |
| 25 | class ModuloSchedGraphNode:public SchedGraphNodeCommon { |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 26 | private: |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 27 | // the corresponding instruction |
| 28 | const Instruction *inst; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 29 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 30 | // whether this node's property(ASAP,ALAP, ...) has been computed |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 31 | bool propertyComputed; |
| 32 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 33 | // ASAP: the earliest time the node could be scheduled |
| 34 | // ALAP: the latest time the node couldbe scheduled |
| 35 | // depth: the depth of the node |
| 36 | // height: the height of the node |
| 37 | // mov: the mobility function, computed as ALAP - ASAP |
| 38 | // scheTime: the scheduled time if this node has been scheduled |
| 39 | // earlyStart: the earliest time to be tried to schedule the node |
| 40 | // lateStart: the latest time to be tried to schedule the node |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 41 | int ASAP, ALAP, depth, height, mov; |
| 42 | int schTime; |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 43 | int earlyStart, lateStart; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 44 | |
| 45 | public: |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 46 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 47 | //get the instruction |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 48 | const Instruction *getInst() const { |
| 49 | return inst; |
| 50 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 51 | //get the instruction op-code name |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 52 | const char *getInstOpcodeName() const { |
| 53 | return inst->getOpcodeName(); |
| 54 | } |
| 55 | //get the instruction op-code |
| 56 | const unsigned getInstOpcode() const { |
| 57 | return inst->getOpcode(); |
| 58 | } |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 59 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 60 | //return whether the node is NULL |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 61 | bool isNullNode() const { |
| 62 | return (inst == NULL); |
| 63 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 64 | //return whether the property of the node has been computed |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 65 | bool getPropertyComputed() { |
| 66 | return propertyComputed; |
| 67 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 68 | //set the propertyComputed |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 69 | void setPropertyComputed(bool _propertyComputed) { |
| 70 | propertyComputed = _propertyComputed; |
| 71 | } |
| 72 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 73 | //get the corresponding property |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 74 | int getASAP() { |
| 75 | return ASAP; |
| 76 | } |
| 77 | int getALAP() { |
| 78 | return ALAP; |
| 79 | } |
| 80 | int getMov() { |
| 81 | return mov; |
| 82 | } |
| 83 | int getDepth() { |
| 84 | return depth; |
| 85 | } |
| 86 | int getHeight() { |
| 87 | return height; |
| 88 | } |
| 89 | int getSchTime() { |
| 90 | return schTime; |
| 91 | } |
| 92 | int getEarlyStart() { |
| 93 | return earlyStart; |
| 94 | } |
| 95 | int getLateStart() { |
| 96 | return lateStart; |
| 97 | } |
| 98 | void setEarlyStart(int _earlyStart) { |
| 99 | earlyStart = _earlyStart; |
| 100 | } |
| 101 | void setLateStart(int _lateStart) { |
| 102 | lateStart = _lateStart; |
| 103 | } |
| 104 | void setSchTime(int _time) { |
| 105 | schTime = _time; |
| 106 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 107 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 108 | private: |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 109 | friend class ModuloSchedGraph; |
| 110 | friend class SchedGraphNode; |
| 111 | |
| 112 | //constructor: |
| 113 | //nodeId: the node id, unique within the each BasicBlock |
| 114 | //_bb: which BasicBlock the corresponding instruction belongs to |
| 115 | //_inst: the corresponding instruction |
| 116 | //indexInBB: the corresponding instruction's index in the BasicBlock |
| 117 | //target: the targetMachine |
| 118 | ModuloSchedGraphNode(unsigned int _nodeId, |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 119 | const BasicBlock * _bb, |
| 120 | const Instruction * _inst, |
| 121 | int indexInBB, const TargetMachine &target); |
| 122 | |
| 123 | |
| 124 | friend std::ostream & operator<<(std::ostream & os, |
| 125 | const ModuloSchedGraphNode & edge); |
| 126 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 127 | }; |
| 128 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 129 | //FIXME: these two value should not be used |
| 130 | #define MAXNODE 100 |
| 131 | #define MAXCC 100 |
| 132 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 133 | //===----------------------------------------------------------------------===// |
| 134 | /// ModuloSchedGraph- the data structure to store dependence between nodes |
| 135 | /// it catches data dependence and constrol dependence |
| 136 | /// |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 137 | class ModuloSchedGraph : |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 138 | public SchedGraphCommon, |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 139 | protected hash_map<const Instruction*,ModuloSchedGraphNode*> { |
| 140 | |
| 141 | private: |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 142 | |
| 143 | BasicBlock* bb; |
| 144 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 145 | //iteration Interval |
| 146 | int MII; |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 147 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 148 | //target machine |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 149 | const TargetMachine & target; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 150 | |
| 151 | //the circuits in the dependence graph |
| 152 | unsigned circuits[MAXCC][MAXNODE]; |
| 153 | |
| 154 | //the order nodes |
| 155 | std::vector<ModuloSchedGraphNode*> oNodes; |
| 156 | |
| 157 | typedef std::vector<ModuloSchedGraphNode*> NodeVec; |
| 158 | |
| 159 | //the function to compute properties |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 160 | void computeNodeASAP(const BasicBlock * in_bb); |
| 161 | void computeNodeALAP(const BasicBlock * in_bb); |
| 162 | void computeNodeMov(const BasicBlock * in_bb); |
| 163 | void computeNodeDepth(const BasicBlock * in_bb); |
| 164 | void computeNodeHeight(const BasicBlock * in_bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 165 | |
| 166 | //the function to compute node property |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 167 | void computeNodeProperty(const BasicBlock * in_bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 168 | |
| 169 | //the function to sort nodes |
| 170 | void orderNodes(); |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 171 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 172 | //add the resource usage |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 173 | void addResourceUsage(std::vector<std::pair<int,int> > &, int); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 174 | |
| 175 | //debug functions: |
| 176 | //dump circuits |
| 177 | void dumpCircuits(); |
| 178 | //dump the input set of nodes |
| 179 | void dumpSet(std::vector<ModuloSchedGraphNode*> set); |
| 180 | //dump the input resource usage table |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 181 | void dumpResourceUsage(std::vector<std::pair<int,int> > &); |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 182 | |
| 183 | public: |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 184 | //help functions |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 185 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 186 | //get the maxium the delay between two nodes |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 187 | SchedGraphEdge *getMaxDelayEdge(unsigned srcId, unsigned sinkId); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 188 | |
| 189 | //FIXME: |
| 190 | //get the predessor Set of the set |
| 191 | NodeVec predSet(NodeVec set, unsigned, unsigned); |
| 192 | NodeVec predSet(NodeVec set); |
| 193 | |
| 194 | //get the predessor set of the node |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 195 | NodeVec predSet(ModuloSchedGraphNode *node, unsigned, unsigned); |
| 196 | NodeVec predSet(ModuloSchedGraphNode *node); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 197 | |
| 198 | //get the successor set of the set |
| 199 | NodeVec succSet(NodeVec set, unsigned, unsigned); |
| 200 | NodeVec succSet(NodeVec set); |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 201 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 202 | //get the succssor set of the node |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 203 | NodeVec succSet(ModuloSchedGraphNode *node, unsigned, unsigned); |
| 204 | NodeVec succSet(ModuloSchedGraphNode *node); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 205 | |
| 206 | //return the uniton of the two vectors |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 207 | NodeVec vectorUnion(NodeVec set1, NodeVec set2); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 208 | |
| 209 | //return the consjuction of the two vectors |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 210 | NodeVec vectorConj(NodeVec set1, NodeVec set2); |
| 211 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 212 | //return all nodes in set1 but not set2 |
| 213 | NodeVec vectorSub(NodeVec set1, NodeVec set2); |
| 214 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 215 | typedef hash_map<const Instruction*,ModuloSchedGraphNode*> map_base; |
| 216 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 217 | public: |
| 218 | using map_base::iterator; |
| 219 | using map_base::const_iterator; |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 220 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 221 | public: |
| 222 | |
| 223 | //get target machine |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 224 | const TargetMachine & getTarget() { |
| 225 | return target; |
| 226 | } |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 227 | |
| 228 | //get the basic block |
| 229 | BasicBlock* getBasicBlock() const { |
| 230 | return bb; |
| 231 | } |
| 232 | |
| 233 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 234 | //get the iteration interval |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 235 | const int getMII() { |
| 236 | return MII; |
| 237 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 238 | |
| 239 | //get the ordered nodes |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 240 | const NodeVec & getONodes() { |
| 241 | return oNodes; |
| 242 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 243 | |
| 244 | //get the number of nodes (including the root and leaf) |
| 245 | //note: actually root and leaf is not used |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 246 | const unsigned int getNumNodes() const { |
| 247 | return size() + 2; |
| 248 | } |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 249 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 250 | //return wether the BasicBlock 'bb' contains a loop |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 251 | bool isLoop(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 252 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 253 | //return the node for the input instruction |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 254 | ModuloSchedGraphNode *getGraphNodeForInst(const Instruction *inst) const { |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 255 | const_iterator onePair = this->find(inst); |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 256 | return (onePair != this->end()) ? (*onePair).second : NULL; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 257 | } |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 258 | |
| 259 | // Debugging support |
| 260 | //dump the graph |
| 261 | void dump() const; |
| 262 | |
| 263 | // dump the basicBlock |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 264 | void dump(const BasicBlock *bb); |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 265 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 266 | //dump the basicBlock into 'os' stream |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 267 | void dump(const BasicBlock *bb, std::ostream &os); |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 268 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 269 | //dump the node property |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 270 | void dumpNodeProperty() const; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 271 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 272 | private: |
| 273 | friend class ModuloSchedGraphSet; //give access to ctor |
| 274 | |
| 275 | public: |
Guochun Shi | 099b064 | 2003-06-02 17:48:56 +0000 | [diff] [blame] | 276 | ModuloSchedGraph(BasicBlock * in_bb, |
| 277 | const TargetMachine & in_target) |
| 278 | :SchedGraphCommon(), bb(in_bb),target(in_target) |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 279 | { |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 280 | buildGraph(target); |
| 281 | } |
| 282 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 283 | ~ModuloSchedGraph() { |
| 284 | for (const_iterator I = begin(); I != end(); ++I) |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 285 | delete I->second; |
| 286 | } |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 287 | |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 288 | // Unorder iterators |
| 289 | // return values are pair<const Instruction*, ModuloSchedGraphNode*> |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 290 | using map_base::begin; |
| 291 | using map_base::end; |
| 292 | |
Guochun Shi | 8f1d4ab | 2003-06-08 23:16:07 +0000 | [diff] [blame^] | 293 | void addHash(const Instruction *inst, |
| 294 | ModuloSchedGraphNode *node){ |
| 295 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 296 | assert((*this)[inst] == NULL); |
| 297 | (*this)[inst] = node; |
Guochun Shi | 8f1d4ab | 2003-06-08 23:16:07 +0000 | [diff] [blame^] | 298 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 299 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 300 | |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 301 | // Graph builder |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 302 | ModuloSchedGraphNode *getNode(const unsigned nodeId) const; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 303 | |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 304 | // Build the graph from the basicBlock |
| 305 | void buildGraph(const TargetMachine &target); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 306 | |
Misha Brukman | 63e04f3 | 2003-04-22 23:00:08 +0000 | [diff] [blame] | 307 | // Build nodes for BasicBlock |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 308 | void buildNodesforBB(const TargetMachine &target, |
Guochun Shi | 8f1d4ab | 2003-06-08 23:16:07 +0000 | [diff] [blame^] | 309 | const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 310 | |
| 311 | //find definitiona and use information for all nodes |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 312 | void findDefUseInfoAtInstr(const TargetMachine &target, |
| 313 | ModuloSchedGraphNode *node, |
| 314 | NodeVec &memNode, |
| 315 | RegToRefVecMap ®ToRefVecMap, |
| 316 | ValueToDefVecMap &valueToDefVecMap); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 317 | |
| 318 | //add def-use edge |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 319 | void addDefUseEdges(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 320 | |
| 321 | //add control dependence edges |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 322 | void addCDEdges(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 323 | |
| 324 | //add memory dependence dges |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 325 | void addMemEdges(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 326 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 327 | //computer source restrictoin II |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 328 | int computeResII(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 329 | |
| 330 | //computer recurrence II |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 331 | int computeRecII(const BasicBlock *bb); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 332 | }; |
| 333 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 334 | //==================================- |
| 335 | // Graph set |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 336 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 337 | class ModuloSchedGraphSet : public std::vector<ModuloSchedGraph*> { |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 338 | private: |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 339 | const Function *method; |
| 340 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 341 | public: |
| 342 | typedef std::vector<ModuloSchedGraph*> baseVector; |
| 343 | using baseVector::iterator; |
| 344 | using baseVector::const_iterator; |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 345 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 346 | public: |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 347 | ModuloSchedGraphSet(const Function *function, const TargetMachine &target); |
| 348 | ~ModuloSchedGraphSet(); |
| 349 | |
| 350 | // Iterators |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 351 | using baseVector::begin; |
| 352 | using baseVector::end; |
| 353 | |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 354 | // Debugging support |
| 355 | void dump() const; |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 356 | |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 357 | private: |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 358 | void addGraph(ModuloSchedGraph *graph) { |
| 359 | assert(graph != NULL); |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 360 | this->push_back(graph); |
| 361 | } |
Guochun Shi | f1c154f | 2003-03-27 17:57:44 +0000 | [diff] [blame] | 362 | |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 363 | // Graph builder |
| 364 | void buildGraphsForMethod(const Function *F, |
| 365 | const TargetMachine &target); |
Misha Brukman | 2c821cc | 2003-04-10 19:19:23 +0000 | [diff] [blame] | 366 | }; |
Misha Brukman | 8baa01c | 2003-04-09 21:51:34 +0000 | [diff] [blame] | 367 | |
| 368 | #endif |