Fixed bug where instructions in the kernel were not ordered right to preserve dependencies in a cycle.

llvm-svn: 18314
diff --git a/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp b/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
index 7ee7751..29aba15 100644
--- a/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
+++ b/llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp
@@ -27,7 +27,8 @@
     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);
+	//Insert to preserve dependencies
+	addToSchedule(cycle,node);
 	DEBUG(std::cerr << "Found spot in map, and there is an issue slot\n");
 	return false;
       }
@@ -49,6 +50,24 @@
   
 }
 
+void MSSchedule::addToSchedule(int cycle, MSchedGraphNode *node) {
+  std::vector<MSchedGraphNode*> nodesAtCycle = schedule[cycle];
+
+  std::map<unsigned, MSchedGraphNode*> indexMap;
+  for(unsigned i=0; i < nodesAtCycle.size(); ++i) {
+    indexMap[nodesAtCycle[i]->getIndex()] = nodesAtCycle[i];
+  }
+
+  indexMap[node->getIndex()] = node;
+
+  std::vector<MSchedGraphNode*> nodes;
+  for(std::map<unsigned, MSchedGraphNode*>::iterator I = indexMap.begin(), E = indexMap.end(); I != E; ++I)
+    nodes.push_back(I->second);
+  
+  schedule[cycle] =  nodes;
+}
+
+
 bool MSSchedule::resourcesFree(MSchedGraphNode *node, int cycle) {
   
   //Get Resource usage for this instruction