aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/RegAlloc/IGNode.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/RegAlloc/IGNode.h')
-rw-r--r--lib/CodeGen/RegAlloc/IGNode.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/lib/CodeGen/RegAlloc/IGNode.h b/lib/CodeGen/RegAlloc/IGNode.h
new file mode 100644
index 0000000000..03bcfc07b1
--- /dev/null
+++ b/lib/CodeGen/RegAlloc/IGNode.h
@@ -0,0 +1,152 @@
+/* Title: IGNode.h
+ Author: Ruchira Sasanka
+ Date: July 25, 01
+ Purpose: Represents a node in an interference graph.
+ Notes:
+
+ For efficiency, the AdjList is updated only once - ie. we can add but not
+ remove nodes from AdjList.
+
+ The removal of nodes from IG is simulated by decrementing the CurDegree.
+ If this node is put on stack (that is removed from IG), the CurDegree of all
+ the neighbors are decremented and this node is marked OnSack. Hence
+ the effective neighbors in the AdjList are the ones that do not have the
+ OnStack flag set (therefore, they are in the IG).
+
+ The methods that modify/use the CurDegree Must be called only
+ fter all modifications to the IG are over (i.e., all neighbors are fixed).
+
+ The vector representation the most efficient one for adj list.
+ Though nodes are removed when coalsing is done, we access it in sequence
+ for far many times when coloring (colorNode()).
+
+*/
+
+#ifndef IG_NODE_H
+#define IG_NODE_H
+
+
+#include "llvm/CodeGen/RegAllocCommon.h"
+#include "llvm/CodeGen/LiveRange.h"
+
+class IGNode
+{
+ private:
+
+ const int Index; // index within IGNodeList
+
+ bool OnStack; // this has been pushed on to stack for coloring
+
+ vector<IGNode *> AdjList; // adjacency list for this live range
+
+
+ // set by InterferenceGraph::setCurDegreeOfIGNodes() after calculating
+ // all adjacency lists.
+ // Decremented when a neighbor is pushed on to the stack.
+ // After that, never incremented/set again nor used.
+ int CurDegree;
+
+ LiveRange *const ParentLR; // parent LR (cannot be a const)
+
+
+ public:
+
+ inline unsigned int getIndex() const
+ { return Index; }
+
+ // adjLists must be updated only once. However, the CurDegree can be changed
+ inline void addAdjIGNode( IGNode *const AdjNode)
+ { AdjList.push_back(AdjNode); }
+
+ inline IGNode * getAdjIGNode(unsigned int ind) const
+ { assert ( ind < AdjList.size()); return AdjList[ ind ]; }
+
+ // delete a node in AdjList - node must be in the list
+ // should not be called often
+ void delAdjIGNode(const IGNode *const Node);
+
+ inline unsigned int getNumOfNeighbors() const
+ { return AdjList.size() ; }
+
+
+ inline bool isOnStack() const
+ { return OnStack; }
+
+ // remove form IG and pushes on to stack (reduce the degree of neighbors)
+ void pushOnStack();
+
+ // CurDegree is the effective number of neighbors when neighbors are
+ // pushed on to the stack during the coloring phase. Must be called
+ // after all modifications to the IG are over (i.e., all neighbors are
+ // fixed).
+
+ inline void setCurDegree()
+ { assert( CurDegree == -1); CurDegree = AdjList.size(); }
+
+ inline int getCurDegree() const
+ { return CurDegree; }
+
+ // called when a neigh is pushed on to stack
+ inline void decCurDegree()
+ { assert( CurDegree > 0 ); --CurDegree; }
+
+
+ // The following methods call the methods in ParentLR
+ // They are added to this class for convenience
+ // If many of these are called within a single scope,
+ // consider calling the methods directly on LR
+
+
+ inline void setRegClass(RegClass *const RC)
+ { ParentLR->setRegClass(RC); }
+
+ inline RegClass *const getRegClass() const
+ { return ParentLR->getRegClass(); }
+
+ inline bool hasColor() const
+ { return ParentLR->hasColor(); }
+
+ inline unsigned int getColor() const
+ { return ParentLR->getColor(); }
+
+ inline void setColor(unsigned int Col)
+ { ParentLR->setColor(Col); }
+
+ inline void markForSpill()
+ { ParentLR->markForSpill(); }
+
+ inline void markForSaveAcrossCalls()
+ { ParentLR->markForSaveAcrossCalls(); }
+
+ // inline void markForLoadFromStack()
+ // { ParentLR->markForLoadFromStack(); }
+
+
+ inline unsigned int getNumOfCallInterferences() const
+ { return ParentLR->getNumOfCallInterferences(); }
+
+ inline LiveRange *getParentLR() const
+ { return ParentLR; }
+
+ inline Type::PrimitiveID getTypeID() const
+ { return ParentLR->getTypeID(); }
+
+
+
+ //---- constructor and destructor ----
+
+
+ IGNode(LiveRange *const LR, unsigned int index);
+
+ ~IGNode() { } // an empty destructor
+
+
+};
+
+
+
+
+
+
+
+#endif