Forced branches to be first to be scheduled.

llvm-svn: 18195
diff --git a/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp b/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
index 25bd55f..7ee7751 100644
--- a/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
+++ b/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
@@ -23,7 +23,9 @@
   
   //First, check if the cycle has a spot free to start
   if(schedule.find(cycle) != schedule.end()) {
+    //Check if we have a free issue slot at this cycle
     if (schedule[cycle].size() < numIssue) {
+      //Now check if all the resources in their respective cycles are available
       if(resourcesFree(node, cycle)) {
 	schedule[cycle].push_back(node);
 	DEBUG(std::cerr << "Found spot in map, and there is an issue slot\n");
@@ -44,45 +46,43 @@
 
   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;
-
-  //map for easy backtracking, resource num at a certain cycle
-  //std::map<int, int> backtrackMap;
-
-    //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];
-
-	DEBUG(std::cerr << "Attempting to schedule Resource Num: " << resourceNum << " in cycle: " << currentCycle << "\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) {
+    for(unsigned j=0; j < resources[i].size(); ++j) {
+      
+      //Get Resource to check its availability
+      int resourceNum = resources[i][j];
+      
+      DEBUG(std::cerr << "Attempting to schedule Resource Num: " << resourceNum << " in cycle: " << currentCycle << "\n");
+      
 	//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
+	//First check if map exists 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) {
+	    if(resourceUse->second < CPUResource::getCPUResource(resourceNum)->maxNumUsers)
 	      ++resourceUse->second;
-	      //Document that we increased the usage count for this resource at this cycle
 	    
-	    }
 	    else {
+	      DEBUG(std::cerr << "No resource num " << resourceNum << " available for cycle " << currentCycle << "\n");
 	      success = false;
 	    }
 	  }
@@ -96,50 +96,51 @@
 	  std::map<int, int> resourceMap;
 	  resourceMap[resourceNum] = 1;
 	  resourceNumPerCycle[currentCycle] = 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);
-	  if(resourcesForCycle != resourceNumPerCycle.end()) {
-	    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;
-	    }
+      //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);
+	if(resourcesForCycle != resourceNumPerCycle.end()) {
+	  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;
-
+      else
+	break;
+      oldCycle++;
     }
+    return false;
+    
+  }
 
-    return true;
+  return true;
 
 }