Use higher level method
[oota-llvm.git] / lib / Target / SparcV9 / RegAlloc / IGNode.cpp
index a2257420529e712fb9d484129a00ac02b712e1e9..caee2961664abb377cd3c80306993f9e6b65b849 100644 (file)
@@ -1,29 +1,23 @@
+//===-- IGNode.cpp -------------------------------------------------------===//
+// 
+//  class IGNode for coloring-based register allocation for LLVM.
+// 
+//===----------------------------------------------------------------------===//
+
 #include "llvm/CodeGen/IGNode.h"
 #include <algorithm>
 #include <iostream>
 using std::cerr;
 
-//-----------------------------------------------------------------------------
-// Constructor
-//-----------------------------------------------------------------------------
-IGNode::IGNode(LiveRange *const PLR, unsigned int Ind) : Index(Ind),
-                                                         ParentLR(PLR)
-{
-  OnStack = false;
-  CurDegree = -1 ;
-  ParentLR->setUserIGNode( this );
-}
-
-
 //-----------------------------------------------------------------------------
 // Sets this IGNode on stack and reduce the degree of neighbors  
 //-----------------------------------------------------------------------------
-void IGNode::pushOnStack()             
-{                                     
+
+void IGNode::pushOnStack() {
   OnStack = true; 
   int neighs = AdjList.size();
 
-  ifneighs < 0) {
+  if (neighs < 0) {
     cerr << "\nAdj List size = " << neighs;
     assert(0 && "Invalid adj list size");
   }
@@ -36,10 +30,25 @@ void IGNode::pushOnStack()
 // Deletes an adjacency node. IGNodes are deleted when coalescing merges
 // two IGNodes together.
 //-----------------------------------------------------------------------------
-void IGNode::delAdjIGNode(const IGNode *const Node) {
-  std::vector<IGNode *>::iterator It = 
-    find(AdjList.begin(), AdjList.end(), Node);
+
+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);
 }
+
+//-----------------------------------------------------------------------------
+// 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();
+}
+
+