ce502d6e31be4385b198e15048e95590a8f188a4
[oota-llvm.git] / lib / CodeGen / RegAlloc / IGNode.cpp
1 //===-- IGNode.cpp --------------------------------------------------------===//
2 // 
3 //  class IGNode for coloring-based register allocation for LLVM.
4 // 
5 //===----------------------------------------------------------------------===//
6
7 #include "IGNode.h"
8 #include <algorithm>
9 #include <iostream>
10
11 //-----------------------------------------------------------------------------
12 // Sets this IGNode on stack and reduce the degree of neighbors  
13 //-----------------------------------------------------------------------------
14
15 void IGNode::pushOnStack() {
16   OnStack = true; 
17   int neighs = AdjList.size();
18
19   if (neighs < 0) {
20     std::cerr << "\nAdj List size = " << neighs;
21     assert(0 && "Invalid adj list size");
22   }
23
24   for(int i=0; i < neighs; i++)
25     AdjList[i]->decCurDegree();
26 }
27  
28 //-----------------------------------------------------------------------------
29 // Deletes an adjacency node. IGNodes are deleted when coalescing merges
30 // two IGNodes together.
31 //-----------------------------------------------------------------------------
32
33 void IGNode::delAdjIGNode(const IGNode *Node) {
34   std::vector<IGNode *>::iterator It=find(AdjList.begin(), AdjList.end(), Node);
35   assert( It != AdjList.end() );      // the node must be there
36   AdjList.erase(It);
37 }
38
39 //-----------------------------------------------------------------------------
40 // Get the number of unique neighbors if these two nodes are merged
41 //-----------------------------------------------------------------------------
42
43 unsigned
44 IGNode::getCombinedDegree(const IGNode* otherNode) const
45 {
46   std::vector<IGNode*> nbrs(AdjList);
47   nbrs.insert(nbrs.end(), otherNode->AdjList.begin(), otherNode->AdjList.end());
48   sort(nbrs.begin(), nbrs.end());
49   std::vector<IGNode*>::iterator new_end = unique(nbrs.begin(), nbrs.end());
50   return new_end - nbrs.begin();
51 }
52
53