Use higher level method
[oota-llvm.git] / lib / Target / SparcV9 / RegAlloc / IGNode.cpp
index 0e8a124cd3d9249c35077d8b6839d622f283b1db..caee2961664abb377cd3c80306993f9e6b65b849 100644 (file)
@@ -1,31 +1,54 @@
-#include "llvm/CodeGen/IGNode.h"
-
-
-IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
-                                                        ParentLR(PLR)
-{
-  OnStack = false;
-  CurDegree = -1 ;
-  ParentLR->setUserIGNode( this );
-}
+//===-- IGNode.cpp -------------------------------------------------------===//
+// 
+//  class IGNode for coloring-based register allocation for LLVM.
+// 
+//===----------------------------------------------------------------------===//
 
+#include "llvm/CodeGen/IGNode.h"
+#include <algorithm>
+#include <iostream>
+using std::cerr;
 
+//-----------------------------------------------------------------------------
+// Sets this IGNode on stack and reduce the degree of neighbors  
+//-----------------------------------------------------------------------------
 
-void IGNode::pushOnStack()            // sets on to stack and 
-{                                     // reduce the degree of neighbors  
+void IGNode::pushOnStack() {
   OnStack = true; 
-  unsigned int neighs = AdjList.size();
+  int neighs = AdjList.size();
+
+  if (neighs < 0) {
+    cerr << "\nAdj List size = " << neighs;
+    assert(0 && "Invalid adj list size");
+  }
 
-  for(unsigned int i=0; i < neighs; i++)  (AdjList[i])->decCurDegree();
+  for(int i=0; i < neighs; i++)
+    AdjList[i]->decCurDegree();
 }
  
+//-----------------------------------------------------------------------------
+// Deletes an adjacency node. IGNodes are deleted when coalescing merges
+// two IGNodes together.
+//-----------------------------------------------------------------------------
 
-void IGNode::delAdjIGNode(const IGNode *const Node) {
-  vector <IGNode *>::iterator It = AdjList.begin();
-    
-  // find Node
-  for( ; It != AdjList.end() && (*It != Node); It++ ) ;
+void IGNode::delAdjIGNode(const IGNode *Node) {
+  std::vector<IGNode *>::iterator It=find(AdjList.begin(), AdjList.end(), Node);
   assert( It != AdjList.end() );      // the node must be there
-  
-  AdjList.erase( It );
+  AdjList.erase(It);
 }
+
+//-----------------------------------------------------------------------------
+// Get the number of unique neighbors if these two nodes are merged
+//-----------------------------------------------------------------------------
+
+unsigned
+IGNode::getCombinedDegree(const IGNode* otherNode) const
+{
+  std::vector<IGNode*> nbrs(AdjList);
+  nbrs.insert(nbrs.end(), otherNode->AdjList.begin(), otherNode->AdjList.end());
+  sort(nbrs.begin(), nbrs.end());
+  std::vector<IGNode*>::iterator new_end = unique(nbrs.begin(), nbrs.end());
+  return new_end - nbrs.begin();
+}
+
+