| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 1 | //===-- ModuloScheduling.h - Swing Modulo Scheduling------------*- C++ -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the LLVM research group and is distributed under | 
|  | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 9 | // | 
|  | 10 | // | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 11 | //===----------------------------------------------------------------------===// | 
|  | 12 |  | 
|  | 13 | #ifndef LLVM_MODULOSCHEDULING_H | 
|  | 14 | #define LLVM_MODULOSCHEDULING_H | 
|  | 15 |  | 
|  | 16 | #include "MSchedGraph.h" | 
| Tanya Lattner | a066df6 | 2004-05-26 06:27:18 +0000 | [diff] [blame] | 17 | #include "MSSchedule.h" | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 18 | #include "llvm/Function.h" | 
|  | 19 | #include "llvm/Pass.h" | 
| Tanya Lattner | 9196449 | 2005-03-29 20:35:10 +0000 | [diff] [blame] | 20 | #include "DependenceAnalyzer.h" | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 21 | #include "llvm/Target/TargetData.h" | 
| Tanya Lattner | 42ed148 | 2005-04-22 06:32:48 +0000 | [diff] [blame] | 22 | #include "llvm/Analysis/LoopInfo.h" | 
|  | 23 | #include "llvm/Analysis/ScalarEvolution.h" | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 24 | #include <set> | 
|  | 25 |  | 
|  | 26 | namespace llvm { | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 27 |  | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 28 |  | 
|  | 29 | //Struct to contain ModuloScheduling Specific Information for each node | 
|  | 30 | struct MSNodeAttributes { | 
|  | 31 | int ASAP; //Earliest time at which the opreation can be scheduled | 
|  | 32 | int ALAP; //Latest time at which the operation can be scheduled. | 
|  | 33 | int MOB; | 
|  | 34 | int depth; | 
|  | 35 | int height; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 36 | MSNodeAttributes(int asap=-1, int alap=-1, int mob=-1, | 
|  | 37 | int d=-1, int h=-1) : ASAP(asap), ALAP(alap), | 
|  | 38 | MOB(mob), depth(d), | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 39 | height(h) {} | 
|  | 40 | }; | 
|  | 41 |  | 
|  | 42 |  | 
|  | 43 | class ModuloSchedulingPass : public FunctionPass { | 
|  | 44 | const TargetMachine ⌖ | 
|  | 45 |  | 
| Tanya Lattner | 444be61 | 2004-11-02 21:04:56 +0000 | [diff] [blame] | 46 | //Map to hold Value* defs | 
|  | 47 | std::map<const Value*, MachineInstr*> defMap; | 
|  | 48 |  | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 49 | //Map to hold list of instructions associate to the induction var for each BB | 
|  | 50 | std::map<const MachineBasicBlock*, std::map<const MachineInstr*, unsigned> > indVarInstrs; | 
|  | 51 |  | 
| Tanya Lattner | 9196449 | 2005-03-29 20:35:10 +0000 | [diff] [blame] | 52 | //Map to hold machine to  llvm instrs for each valid BB | 
|  | 53 | std::map<const MachineBasicBlock*, std::map<MachineInstr*, Instruction*> > machineTollvm; | 
|  | 54 |  | 
| Tanya Lattner | 444be61 | 2004-11-02 21:04:56 +0000 | [diff] [blame] | 55 | //LLVM Instruction we know we can add TmpInstructions to its MCFI | 
|  | 56 | Instruction *defaultInst; | 
|  | 57 |  | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 58 | //Map that holds node to node attribute information | 
|  | 59 | std::map<MSchedGraphNode*, MSNodeAttributes> nodeToAttributesMap; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 60 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 61 | //Map to hold all reccurrences | 
|  | 62 | std::set<std::pair<int, std::vector<MSchedGraphNode*> > > recurrenceList; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 63 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 64 | //Set of edges to ignore, stored as src node and index into vector of successors | 
|  | 65 | std::set<std::pair<MSchedGraphNode*, unsigned> > edgesToIgnore; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 66 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 67 | //Vector containing the partial order | 
| Tanya Lattner | ddebd1e | 2004-10-30 00:39:07 +0000 | [diff] [blame] | 68 | std::vector<std::set<MSchedGraphNode*> > partialOrder; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 69 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 70 | //Vector containing the final node order | 
|  | 71 | std::vector<MSchedGraphNode*> FinalNodeOrder; | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 72 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 73 | //Schedule table, key is the cycle number and the vector is resource, node pairs | 
| Tanya Lattner | a066df6 | 2004-05-26 06:27:18 +0000 | [diff] [blame] | 74 | MSSchedule schedule; | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 75 |  | 
|  | 76 | //Current initiation interval | 
|  | 77 | int II; | 
|  | 78 |  | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 79 | //Internal functions | 
| Tanya Lattner | 56807c6 | 2005-02-10 17:02:58 +0000 | [diff] [blame] | 80 | bool CreateDefMap(MachineBasicBlock *BI); | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 81 | bool MachineBBisValid(const MachineBasicBlock *BI); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 82 | bool assocIndVar(Instruction *I, std::set<Instruction*> &indVar, | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 83 | std::vector<Instruction*> &stack, BasicBlock *BB); | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 84 | int calculateResMII(const MachineBasicBlock *BI); | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 85 | int calculateRecMII(MSchedGraph *graph, int MII); | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 86 | void calculateNodeAttributes(MSchedGraph *graph, int MII); | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 87 |  | 
|  | 88 | bool ignoreEdge(MSchedGraphNode *srcNode, MSchedGraphNode *destNode); | 
|  | 89 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 90 | int calculateASAP(MSchedGraphNode *node, int MII,MSchedGraphNode *destNode); | 
|  | 91 | int calculateALAP(MSchedGraphNode *node, int MII, int maxASAP, MSchedGraphNode *srcNode); | 
|  | 92 |  | 
|  | 93 | int calculateHeight(MSchedGraphNode *node,MSchedGraphNode *srcNode); | 
|  | 94 | int calculateDepth(MSchedGraphNode *node, MSchedGraphNode *destNode); | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 95 |  | 
|  | 96 | int findMaxASAP(); | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 97 | void orderNodes(); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 98 | void findAllReccurrences(MSchedGraphNode *node, | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 99 | std::vector<MSchedGraphNode*> &visitedNodes, int II); | 
|  | 100 | void addReccurrence(std::vector<MSchedGraphNode*> &recurrence, int II, MSchedGraphNode*, MSchedGraphNode*); | 
| Tanya Lattner | 8bf6374 | 2005-06-17 04:00:57 +0000 | [diff] [blame] | 101 | void addSCC(std::vector<MSchedGraphNode*> &SCC, std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes); | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 102 |  | 
| Tanya Lattner | 56807c6 | 2005-02-10 17:02:58 +0000 | [diff] [blame] | 103 | void findAllCircuits(MSchedGraph *MSG, int II); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 104 | bool circuit(MSchedGraphNode *v, std::vector<MSchedGraphNode*> &stack, | 
|  | 105 | std::set<MSchedGraphNode*> &blocked, | 
| Tanya Lattner | 56807c6 | 2005-02-10 17:02:58 +0000 | [diff] [blame] | 106 | std::vector<MSchedGraphNode*> &SCC, MSchedGraphNode *s, | 
|  | 107 | std::map<MSchedGraphNode*, std::set<MSchedGraphNode*> > &B, int II, | 
|  | 108 | std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 109 |  | 
| Tanya Lattner | 56807c6 | 2005-02-10 17:02:58 +0000 | [diff] [blame] | 110 | void unblock(MSchedGraphNode *u, std::set<MSchedGraphNode*> &blocked, | 
|  | 111 | std::map<MSchedGraphNode*, std::set<MSchedGraphNode*> > &B); | 
|  | 112 |  | 
| Tanya Lattner | 42ed148 | 2005-04-22 06:32:48 +0000 | [diff] [blame] | 113 | void addRecc(std::vector<MSchedGraphNode*> &stack, std::map<MSchedGraphNode*, MSchedGraphNode*> &newNodes); | 
|  | 114 |  | 
|  | 115 | void searchPath(MSchedGraphNode *node, | 
| Tanya Lattner | a31ad51 | 2005-02-23 02:01:42 +0000 | [diff] [blame] | 116 | std::vector<MSchedGraphNode*> &path, | 
| Tanya Lattner | 4d0ee75 | 2005-04-30 23:07:59 +0000 | [diff] [blame] | 117 | std::set<MSchedGraphNode*> &nodesToAdd, | 
|  | 118 | std::set<MSchedGraphNode*> &new_reccurence); | 
| Tanya Lattner | a31ad51 | 2005-02-23 02:01:42 +0000 | [diff] [blame] | 119 |  | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 120 | void pathToRecc(MSchedGraphNode *node, | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 121 | std::vector<MSchedGraphNode*> &path, | 
|  | 122 | std::set<MSchedGraphNode*> &poSet, std::set<MSchedGraphNode*> &lastNodes); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 123 |  | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 124 | void computePartialOrder(); | 
| Tanya Lattner | a31ad51 | 2005-02-23 02:01:42 +0000 | [diff] [blame] | 125 |  | 
| Tanya Lattner | 42ed148 | 2005-04-22 06:32:48 +0000 | [diff] [blame] | 126 | bool computeSchedule(const MachineBasicBlock *BB, MSchedGraph *MSG); | 
|  | 127 | bool scheduleNode(MSchedGraphNode *node, | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 128 | int start, int end); | 
|  | 129 |  | 
| Tanya Lattner | ddebd1e | 2004-10-30 00:39:07 +0000 | [diff] [blame] | 130 | void predIntersect(std::set<MSchedGraphNode*> &CurrentSet, std::set<MSchedGraphNode*> &IntersectResult); | 
|  | 131 | void succIntersect(std::set<MSchedGraphNode*> &CurrentSet, std::set<MSchedGraphNode*> &IntersectResult); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 132 |  | 
| Tanya Lattner | 081fbd1 | 2004-07-30 23:36:10 +0000 | [diff] [blame] | 133 | void reconstructLoop(MachineBasicBlock*); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 134 |  | 
| Tanya Lattner | a066df6 | 2004-05-26 06:27:18 +0000 | [diff] [blame] | 135 | //void saveValue(const MachineInstr*, const std::set<Value*>&, std::vector<Value*>*); | 
|  | 136 |  | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 137 | void fixBranches(std::vector<MachineBasicBlock *> &prologues, std::vector<BasicBlock*> &llvm_prologues, MachineBasicBlock *machineBB, BasicBlock *llvmBB, std::vector<MachineBasicBlock *> &epilogues, std::vector<BasicBlock*> &llvm_epilogues, MachineBasicBlock*); | 
| Tanya Lattner | d8cc4fa | 2004-11-29 04:39:47 +0000 | [diff] [blame] | 138 |  | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 139 | void writePrologues(std::vector<MachineBasicBlock *> &prologues, MachineBasicBlock *origBB, std::vector<BasicBlock*> &llvm_prologues, std::map<const Value*, std::pair<const MachineInstr*, int> > &valuesToSave, std::map<Value*, std::map<int, Value*> > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation); | 
| Tanya Lattner | a6820d6 | 2004-05-08 16:12:10 +0000 | [diff] [blame] | 140 |  | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 141 | void writeEpilogues(std::vector<MachineBasicBlock *> &epilogues, const MachineBasicBlock *origBB, std::vector<BasicBlock*> &llvm_epilogues, std::map<const Value*, std::pair<const MachineInstr*, int> > &valuesToSave,std::map<Value*, std::map<int, Value*> > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation,  std::map<Value*, std::map<int, Value*> > &kernelPHIs); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 142 |  | 
|  | 143 |  | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 144 | void writeKernel(BasicBlock *llvmBB, MachineBasicBlock *machineBB, std::map<const Value*, std::pair<const MachineInstr*, int> > &valuesToSave, std::map<Value*, std::map<int, Value*> > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation, std::map<Value*, std::map<int, Value*> > &kernelPHIs); | 
| Tanya Lattner | 081fbd1 | 2004-07-30 23:36:10 +0000 | [diff] [blame] | 145 |  | 
| Tanya Lattner | 8bf6374 | 2005-06-17 04:00:57 +0000 | [diff] [blame] | 146 | void removePHIs(const MachineBasicBlock* SB, std::vector<MachineBasicBlock*> &prologues, std::vector<MachineBasicBlock *> &epilogues, MachineBasicBlock *kernelBB, std::map<Value*, MachineBasicBlock*> &newValLocation); | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 147 |  | 
| Tanya Lattner | ddebd1e | 2004-10-30 00:39:07 +0000 | [diff] [blame] | 148 | void connectedComponentSet(MSchedGraphNode *node, std::set<MSchedGraphNode*> &ccSet, std::set<MSchedGraphNode*> &lastNodes); | 
|  | 149 |  | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 150 | public: | 
|  | 151 | ModuloSchedulingPass(TargetMachine &targ) : target(targ) {} | 
|  | 152 | virtual bool runOnFunction(Function &F); | 
| Tanya Lattner | ab9cf27 | 2004-11-22 20:41:24 +0000 | [diff] [blame] | 153 | virtual const char* getPassName() const { return "ModuloScheduling"; } | 
| Misha Brukman | b440243 | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 154 |  | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 155 | // getAnalysisUsage | 
|  | 156 | virtual void getAnalysisUsage(AnalysisUsage &AU) const { | 
| Tanya Lattner | 42ed148 | 2005-04-22 06:32:48 +0000 | [diff] [blame] | 157 | /// HACK: We don't actually need loopinfo or scev, but we have | 
|  | 158 | /// to say we do so that the pass manager does not delete it | 
|  | 159 | /// before we run. | 
|  | 160 | AU.addRequired<LoopInfo>(); | 
|  | 161 | AU.addRequired<ScalarEvolution>(); | 
|  | 162 |  | 
| Tanya Lattner | 9196449 | 2005-03-29 20:35:10 +0000 | [diff] [blame] | 163 | AU.addRequired<DependenceAnalyzer>(); | 
| Tanya Lattner | 13417b5 | 2005-03-23 01:47:20 +0000 | [diff] [blame] | 164 | } | 
|  | 165 |  | 
| Tanya Lattner | 48a503b | 2004-03-01 02:50:57 +0000 | [diff] [blame] | 166 | }; | 
|  | 167 |  | 
|  | 168 | } | 
|  | 169 |  | 
|  | 170 |  | 
|  | 171 | #endif |