| //===-- MSScheduleSB.h - Schedule ------- -------------------------*- 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. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // The schedule generated by a scheduling algorithm |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_MSSCHEDULESB_H |
| #define LLVM_MSSCHEDULESB_H |
| |
| #include "MSchedGraphSB.h" |
| #include <vector> |
| #include <set> |
| |
| namespace llvm { |
| |
| class MSScheduleSB { |
| std::map<int, std::vector<MSchedGraphSBNode*> > schedule; |
| unsigned numIssue; |
| |
| //Internal map to keep track of explicit resources |
| std::map<int, std::map<int, int> > resourceNumPerCycle; |
| |
| //Check if all resources are free |
| bool resourcesFree(MSchedGraphSBNode*, int, int II); |
| bool resourceAvailable(int resourceNum, int cycle); |
| void useResource(int resourceNum, int cycle); |
| |
| //Resulting kernel |
| std::vector<std::pair<MachineInstr*, int> > kernel; |
| |
| //Max stage count |
| int maxStage; |
| |
| //add at the right spot in the schedule |
| void addToSchedule(int, MSchedGraphSBNode*); |
| |
| public: |
| MSScheduleSB(int num) : numIssue(num) {} |
| MSScheduleSB() : numIssue(4) {} |
| bool insert(MSchedGraphSBNode *node, int cycle, int II); |
| int getStartCycle(MSchedGraphSBNode *node); |
| void clear() { schedule.clear(); resourceNumPerCycle.clear(); kernel.clear(); } |
| std::vector<std::pair<MachineInstr*, int> >* getKernel() { return &kernel; } |
| bool constructKernel(int II, std::vector<MSchedGraphSBNode*> &branches, std::map<const MachineInstr*, unsigned> &indVar); |
| int getMaxStage() { return maxStage; } |
| bool defPreviousStage(Value *def, int stage); |
| |
| //iterators |
| typedef std::map<int, std::vector<MSchedGraphSBNode*> >::iterator schedule_iterator; |
| typedef std::map<int, std::vector<MSchedGraphSBNode*> >::const_iterator schedule_const_iterator; |
| schedule_iterator begin() { return schedule.begin(); }; |
| schedule_iterator end() { return schedule.end(); }; |
| void print(std::ostream &os) const; |
| void printSchedule(std::ostream &os) const; |
| |
| typedef std::vector<std::pair<MachineInstr*, int> >::iterator kernel_iterator; |
| typedef std::vector<std::pair<MachineInstr*, int> >::const_iterator kernel_const_iterator; |
| kernel_iterator kernel_begin() { return kernel.begin(); } |
| kernel_iterator kernel_end() { return kernel.end(); } |
| |
| }; |
| |
| } |
| |
| |
| #endif |