| //===-- 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 "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; |
| |
| //Internal functions |
| bool MachineBBisValid(const MachineBasicBlock *BI); |
| int calculateResMII(const MachineBasicBlock *BI); |
| void calculateNodeAttributes(MSchedGraph *graph, int MII); |
| void calculateASAP(MSchedGraphNode *node, MSNodeAttributes &attributes, |
| int MII,std::set<MSchedGraphNode*> &visitedNodes); |
| void calculateALAP(MSchedGraphNode *node, MSNodeAttributes &attributes, int MII, |
| int maxASAP, std::set<MSchedGraphNode*> &visitedNodes); |
| void calculateHeight(MSchedGraphNode *node, |
| MSNodeAttributes &attributes, std::set<MSchedGraphNode*> &visitedNodes); |
| void calculateDepth(MSchedGraphNode *node, MSNodeAttributes &attributes, |
| std::set<MSchedGraphNode*> &visitedNodes); |
| |
| int findMaxASAP(); |
| void ModuloSchedulingPass::orderNodes(); |
| void findAllReccurrences(MSchedGraphNode *node, std::vector<MSchedGraphNode*> &visitedNodes); |
| public: |
| ModuloSchedulingPass(TargetMachine &targ) : target(targ) {} |
| virtual bool runOnFunction(Function &F); |
| }; |
| |
| } |
| |
| |
| #endif |