-#include "llvm/CodeGen/IGNode.h"
-
-
-IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
- AdjList(),
- 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();
+}
+
+