diff options
Diffstat (limited to 'lib/CodeGen/ModuloScheduling/MSSchedule.cpp')
-rw-r--r-- | lib/CodeGen/ModuloScheduling/MSSchedule.cpp | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/lib/CodeGen/ModuloScheduling/MSSchedule.cpp b/lib/CodeGen/ModuloScheduling/MSSchedule.cpp deleted file mode 100644 index 4ce85e4949..0000000000 --- a/lib/CodeGen/ModuloScheduling/MSSchedule.cpp +++ /dev/null @@ -1,196 +0,0 @@ -//===-- MSSchedule.cpp 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. -// -//===----------------------------------------------------------------------===// -// -// -// -//===----------------------------------------------------------------------===// -#define DEBUG_TYPE "ModuloSched" - -#include "MSSchedule.h" -#include "llvm/Support/Debug.h" -#include "llvm/Target/TargetSchedInfo.h" -#include "../../Target/SparcV9/SparcV9Internals.h" - -using namespace llvm; - -bool MSSchedule::insert(MSchedGraphNode *node, int cycle) { - - //First, check if the cycle has a spot free to start - if(schedule.find(cycle) != schedule.end()) { - if (schedule[cycle].size() < numIssue) { - if(resourcesFree(node, cycle)) { - schedule[cycle].push_back(node); - DEBUG(std::cerr << "Found spot in map, and there is an issue slot\n"); - return false; - } - } - } - //Not in the map yet so put it in - else { - if(resourcesFree(node,cycle)) { - std::vector<MSchedGraphNode*> nodes; - nodes.push_back(node); - schedule[cycle] = nodes; - DEBUG(std::cerr << "Nothing in map yet so taking an issue slot\n"); - return false; - } - } - - DEBUG(std::cerr << "All issue slots taken\n"); - return true; - -} - -bool MSSchedule::resourcesFree(MSchedGraphNode *node, int cycle) { - - //Get Resource usage for this instruction - const TargetSchedInfo *msi = node->getParent()->getTarget()->getSchedInfo(); - int currentCycle = cycle; - bool success = true; - - //Get resource usage for this instruction - InstrRUsage rUsage = msi->getInstrRUsage(node->getInst()->getOpcode()); - std::vector<std::vector<resourceId_t> > resources = rUsage.resourcesByCycle; - - //Loop over resources in each cycle and increments their usage count - for(unsigned i=0; i < resources.size(); ++i) { - for(unsigned j=0; j < resources[i].size(); ++j) { - int resourceNum = resources[i][j]; - - //Check if this resource is available for this cycle - std::map<int, std::map<int,int> >::iterator resourcesForCycle = resourceNumPerCycle.find(currentCycle); - - //First check map of resources for this cycle - if(resourcesForCycle != resourceNumPerCycle.end()) { - //A map exists for this cycle, so lets check for the resource - std::map<int, int>::iterator resourceUse = resourcesForCycle->second.find(resourceNum); - if(resourceUse != resourcesForCycle->second.end()) { - //Check if there are enough of this resource and if so, increase count and move on - if(resourceUse->second < CPUResource::getCPUResource(resourceNum)->maxNumUsers) - ++resourceUse->second; - else { - success = false; - } - } - //Not in the map yet, so put it - else - resourcesForCycle->second[resourceNum] = 1; - - } - else { - //Create a new map and put in our resource - std::map<int, int> resourceMap; - resourceMap[resourceNum] = 1; - resourceNumPerCycle[cycle] = resourceMap; - } - if(!success) - break; - } - if(!success) - break; - //Increase cycle - currentCycle++; - } - - if(!success) { - int oldCycle = cycle; - DEBUG(std::cerr << "Backtrack\n"); - //Get resource usage for this instruction - InstrRUsage rUsage = msi->getInstrRUsage(node->getInst()->getOpcode()); - std::vector<std::vector<resourceId_t> > resources = rUsage.resourcesByCycle; - - //Loop over resources in each cycle and increments their usage count - for(unsigned i=0; i < resources.size(); ++i) { - if(oldCycle < currentCycle) { - - //Check if this resource is available for this cycle - std::map<int, std::map<int,int> >::iterator resourcesForCycle = resourceNumPerCycle.find(oldCycle); - - for(unsigned j=0; j < resources[i].size(); ++j) { - int resourceNum = resources[i][j]; - //remove from map - std::map<int, int>::iterator resourceUse = resourcesForCycle->second.find(resourceNum); - //assert if not in the map.. since it should be! - //assert(resourceUse != resourcesForCycle.end() && "Resource should be in map!"); - --resourceUse->second; - } - } - else - break; - oldCycle++; - } - return false; - - } - - return true; - -} - -bool MSSchedule::constructKernel(int II) { - MSchedGraphNode *branchNode = 0; - MSchedGraphNode *branchANode = 0; - - int stageNum = (schedule.rbegin()->first)/ II; - DEBUG(std::cerr << "Number of Stages: " << stageNum << "\n"); - - for(int index = 0; index < II; ++index) { - int count = 0; - for(int i = index; i <= (schedule.rbegin()->first); i+=II) { - if(schedule.count(i)) { - for(std::vector<MSchedGraphNode*>::iterator I = schedule[i].begin(), - E = schedule[i].end(); I != E; ++I) { - //Check if its a branch - if((*I)->isBranch()) { - if((*I)->getInst()->getOpcode() == V9::BA) - branchANode = *I; - else - branchNode = *I; - assert(count == 0 && "Branch can not be from a previous iteration"); - } - else - //FIXME: Check if the instructions in the earlier stage conflict - kernel.push_back(std::make_pair(*I, count)); - } - } - ++count; - } - } - - //Add Branch to the end - kernel.push_back(std::make_pair(branchNode, 0)); - - //Add Branch Always to the end - kernel.push_back(std::make_pair(branchANode, 0)); - - - if(stageNum > 0) - maxStage = stageNum; - else - maxStage = 0; - - return true; -} - - -void MSSchedule::print(std::ostream &os) const { - os << "Schedule:\n"; - - for(schedule_const_iterator I = schedule.begin(), E = schedule.end(); I != E; ++I) { - os << "Cycle: " << I->first << "\n"; - for(std::vector<MSchedGraphNode*>::const_iterator node = I->second.begin(), nodeEnd = I->second.end(); node != nodeEnd; ++node) - os << **node << "\n"; - } - - os << "Kernel:\n"; - for(std::vector<std::pair<MSchedGraphNode*, int> >::const_iterator I = kernel.begin(), - E = kernel.end(); I != E; ++I) - os << "Node: " << *(I->first) << " Stage: " << I->second << "\n"; -} - |