| //===-- ModuloScheduling.h - Swing Modulo Scheduling------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by the LLVM research group and is distributed under |
| // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_MODULOSCHEDULING_H |
| #define LLVM_MODULOSCHEDULING_H |
| |
| #include "MSchedGraph.h" |
| #include "MSSchedule.h" |
| #include "llvm/Function.h" |
| #include "llvm/Pass.h" |
| #include <set> |
| |
| namespace llvm { |
| |
| |
| //Struct to contain ModuloScheduling Specific Information for each node |
| struct MSNodeAttributes { |
| int ASAP; //Earliest time at which the opreation can be scheduled |
| int ALAP; //Latest time at which the operation can be scheduled. |
| int MOB; |
| int depth; |
| int height; |
| MSNodeAttributes(int asap=-1, int alap=-1, int mob=-1, |
| int d=-1, int h=-1) : ASAP(asap), ALAP(alap), |
| MOB(mob), depth(d), |
| height(h) {} |
| }; |
| |
| |
| class ModuloSchedulingPass : public FunctionPass { |
| const TargetMachine ⌖ |
| |
| //Map that holds node to node attribute information |
| std::map<MSchedGraphNode*, MSNodeAttributes> nodeToAttributesMap; |
| |
| //Map to hold all reccurrences |
| std::set<std::pair<int, std::vector<MSchedGraphNode*> > > recurrenceList; |
| |
| //Set of edges to ignore, stored as src node and index into vector of successors |
| std::set<std::pair<MSchedGraphNode*, unsigned> > edgesToIgnore; |
| |
| //Vector containing the partial order |
| std::vector<std::vector<MSchedGraphNode*> > partialOrder; |
| |
| //Vector containing the final node order |
| std::vector<MSchedGraphNode*> FinalNodeOrder; |
| |
| //Schedule table, key is the cycle number and the vector is resource, node pairs |
| MSSchedule schedule; |
| |
| //Current initiation interval |
| int II; |
| |
| //Internal functions |
| bool MachineBBisValid(const MachineBasicBlock *BI); |
| int calculateResMII(const MachineBasicBlock *BI); |
| int calculateRecMII(MSchedGraph *graph, int MII); |
| void calculateNodeAttributes(MSchedGraph *graph, int MII); |
| |
| bool ignoreEdge(MSchedGraphNode *srcNode, MSchedGraphNode *destNode); |
| |
| |
| int calculateASAP(MSchedGraphNode *node, int MII,MSchedGraphNode *destNode); |
| int calculateALAP(MSchedGraphNode *node, int MII, int maxASAP, MSchedGraphNode *srcNode); |
| |
| int calculateHeight(MSchedGraphNode *node,MSchedGraphNode *srcNode); |
| int calculateDepth(MSchedGraphNode *node, MSchedGraphNode *destNode); |
| |
| int findMaxASAP(); |
| void orderNodes(); |
| void findAllReccurrences(MSchedGraphNode *node, |
| std::vector<MSchedGraphNode*> &visitedNodes, int II); |
| void addReccurrence(std::vector<MSchedGraphNode*> &recurrence, int II, MSchedGraphNode*, MSchedGraphNode*); |
| |
| void computePartialOrder(); |
| void computeSchedule(); |
| bool scheduleNode(MSchedGraphNode *node, |
| int start, int end); |
| |
| void predIntersect(std::vector<MSchedGraphNode*> &CurrentSet, std::vector<MSchedGraphNode*> &IntersectResult); |
| void succIntersect(std::vector<MSchedGraphNode*> &CurrentSet, std::vector<MSchedGraphNode*> &IntersectResult); |
| |
| void reconstructLoop(MachineBasicBlock*); |
| |
| //void saveValue(const MachineInstr*, const std::set<Value*>&, std::vector<Value*>*); |
| |
| void writePrologues(std::vector<MachineBasicBlock *> &prologues, MachineBasicBlock *origBB, std::vector<BasicBlock*> &llvm_prologues, std::map<const Value*, std::pair<const MSchedGraphNode*, int> > &valuesToSave, std::map<Value*, std::map<int, std::vector<Value*> > > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation); |
| |
| void writeEpilogues(std::vector<MachineBasicBlock *> &epilogues, const MachineBasicBlock *origBB, std::vector<BasicBlock*> &llvm_epilogues, std::map<const Value*, std::pair<const MSchedGraphNode*, int> > &valuesToSave,std::map<Value*, std::map<int, std::vector<Value*> > > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation); |
| |
| |
| void writeKernel(BasicBlock *llvmBB, MachineBasicBlock *machineBB, std::map<const Value*, std::pair<const MSchedGraphNode*, int> > &valuesToSave, std::map<Value*, std::map<int, std::vector<Value*> > > &newValues, std::map<Value*, MachineBasicBlock*> &newValLocation); |
| |
| void removePHIs(const MachineBasicBlock *origBB, std::vector<MachineBasicBlock *> &prologues, std::vector<MachineBasicBlock *> &epilogues, MachineBasicBlock *kernelBB, std::map<Value*, MachineBasicBlock*> &newValLocation); |
| |
| public: |
| ModuloSchedulingPass(TargetMachine &targ) : target(targ) {} |
| virtual bool runOnFunction(Function &F); |
| }; |
| |
| } |
| |
| |
| #endif |