LLVM API Documentation
00001 //===-- MSSchedule.h - Schedule ------- -------------------------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file was developed by the LLVM research group and is distributed under 00006 // the University of Illinois Open Source License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // The schedule generated by a scheduling algorithm 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #ifndef LLVM_MSSCHEDULE_H 00015 #define LLVM_MSSCHEDULE_H 00016 00017 #include "MSchedGraph.h" 00018 #include <vector> 00019 #include <set> 00020 00021 namespace llvm { 00022 00023 class MSSchedule { 00024 std::map<int, std::vector<MSchedGraphNode*> > schedule; 00025 unsigned numIssue; 00026 00027 //Internal map to keep track of explicit resources 00028 std::map<int, std::map<int, int> > resourceNumPerCycle; 00029 00030 //Check if all resources are free 00031 bool resourcesFree(MSchedGraphNode*, int, int II); 00032 bool resourceAvailable(int resourceNum, int cycle); 00033 void useResource(int resourceNum, int cycle); 00034 00035 //Resulting kernel 00036 std::vector<std::pair<MachineInstr*, int> > kernel; 00037 00038 //Max stage count 00039 int maxStage; 00040 00041 //add at the right spot in the schedule 00042 void addToSchedule(int, MSchedGraphNode*); 00043 00044 public: 00045 MSSchedule(int num) : numIssue(num) {} 00046 MSSchedule() : numIssue(4) {} 00047 bool insert(MSchedGraphNode *node, int cycle, int II); 00048 int getStartCycle(MSchedGraphNode *node); 00049 void clear() { schedule.clear(); resourceNumPerCycle.clear(); kernel.clear(); } 00050 std::vector<std::pair<MachineInstr*, int> >* getKernel() { return &kernel; } 00051 bool constructKernel(int II, std::vector<MSchedGraphNode*> &branches, std::map<const MachineInstr*, unsigned> &indVar); 00052 int getMaxStage() { return maxStage; } 00053 bool defPreviousStage(Value *def, int stage); 00054 00055 //iterators 00056 typedef std::map<int, std::vector<MSchedGraphNode*> >::iterator schedule_iterator; 00057 typedef std::map<int, std::vector<MSchedGraphNode*> >::const_iterator schedule_const_iterator; 00058 schedule_iterator begin() { return schedule.begin(); }; 00059 schedule_iterator end() { return schedule.end(); }; 00060 void print(std::ostream &os) const; 00061 00062 typedef std::vector<std::pair<MachineInstr*, int> >::iterator kernel_iterator; 00063 typedef std::vector<std::pair<MachineInstr*, int> >::const_iterator kernel_const_iterator; 00064 kernel_iterator kernel_begin() { return kernel.begin(); } 00065 kernel_iterator kernel_end() { return kernel.end(); } 00066 00067 }; 00068 00069 } 00070 00071 00072 #endif