summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp')
-rw-r--r--llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp b/llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp
new file mode 100644
index 00000000000..a76fdeaa037
--- /dev/null
+++ b/llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp
@@ -0,0 +1,62 @@
+//===-- IGNode.cpp --------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements an Interference graph node for coloring-based register
+// allocation.
+//
+//===----------------------------------------------------------------------===//
+
+#include "IGNode.h"
+#include <algorithm>
+#include <iostream>
+
+namespace llvm {
+
+//-----------------------------------------------------------------------------
+// Sets this IGNode on stack and reduce the degree of neighbors
+//-----------------------------------------------------------------------------
+
+void IGNode::pushOnStack() {
+ OnStack = true;
+ int neighs = AdjList.size();
+
+ if (neighs < 0) {
+ std::cerr << "\nAdj List size = " << neighs;
+ assert(0 && "Invalid adj list size");
+ }
+
+ 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 *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();
+}
+
+} // End llvm namespace
OpenPOWER on IntegriCloud