diff options
Diffstat (limited to 'llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp')
-rw-r--r-- | llvm/lib/Target/SparcV9/RegAlloc/IGNode.cpp | 62 |
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 |