* RegisterAllocation _uses_ LiveVar analysis, instead of creating it's own copy
[oota-llvm.git] / lib / Target / SparcV9 / RegAlloc / IGNode.h
1 /* Title:   IGNode.h                      -*- C++ -*-
2    Author:  Ruchira Sasanka
3    Date:    July 25, 01
4    Purpose: Represents a node in an interference graph. 
5    Notes:
6
7    For efficiency, the AdjList is updated only once - ie. we can add but not
8    remove nodes from AdjList. 
9
10    The removal of nodes from IG is simulated by decrementing the CurDegree.
11    If this node is put on stack (that is removed from IG), the CurDegree of all
12    the neighbors are decremented and this node is marked OnSack. Hence
13    the effective neighbors in the AdjList are the ones that do not have the
14    OnStack flag set (therefore, they are in the IG).
15
16    The methods that modify/use the CurDegree Must be called only
17    after all modifications to the IG are over (i.e., all neighbors are fixed).
18
19    The vector representation is the most efficient one for adj list.
20    Though nodes are removed when coalsing is done, we access it in sequence
21    for far many times when coloring (colorNode()).
22
23 */
24
25 #ifndef IG_NODE_H
26 #define IG_NODE_H
27
28
29 #include "llvm/CodeGen/RegAllocCommon.h"
30 #include "llvm/CodeGen/LiveRange.h"
31 class LiveRange;
32 class RegClass;
33
34 //----------------------------------------------------------------------------
35 // Class IGNode
36 //
37 // Represents a node in an interference graph.
38 //----------------------------------------------------------------------------
39
40 class IGNode {
41   const int Index;            // index within IGNodeList 
42
43   bool OnStack;               // this has been pushed on to stack for coloring
44
45   std::vector<IGNode *> AdjList;   // adjacency list for this live range
46
47   int CurDegree;     
48   //
49   // set by InterferenceGraph::setCurDegreeOfIGNodes() after calculating
50   // all adjacency lists.
51   // Decremented when a neighbor is pushed on to the stack. 
52   // After that, never incremented/set again nor used.
53
54   LiveRange *const ParentLR;  // parent LR (cannot be a const)
55 public:
56
57   // constructor
58   //
59   IGNode(LiveRange *const LR, unsigned int index);
60
61   // an empty destructor
62   //
63   ~IGNode() { }                        
64
65
66   inline unsigned int getIndex() const 
67     { return Index; }
68
69   // adjLists must be updated only once.  However, the CurDegree can be changed
70   //
71   inline void addAdjIGNode( IGNode *const AdjNode) 
72     { AdjList.push_back(AdjNode);  } 
73
74   inline IGNode * getAdjIGNode(unsigned int ind) const 
75     { assert ( ind < AdjList.size()); return AdjList[ ind ]; }
76
77   // delete a node in AdjList - node must be in the list
78   // should not be called often
79   //
80   void delAdjIGNode(const IGNode *const Node); 
81
82   inline unsigned int getNumOfNeighbors() const 
83     { return AdjList.size() ; }
84
85
86   inline bool isOnStack() const 
87     { return OnStack; }
88
89   // remove form IG and pushes on to stack (reduce the degree of neighbors)
90   //
91   void pushOnStack(); 
92
93   // CurDegree is the effective number of neighbors when neighbors are
94   // pushed on to the stack during the coloring phase. Must be called
95   // after all modifications to the IG are over (i.e., all neighbors are
96   // fixed).
97   //
98   inline void setCurDegree() 
99     { assert( CurDegree == -1);   CurDegree = AdjList.size(); }
100
101   inline int getCurDegree() const 
102     { return CurDegree; }
103
104   // called when a neigh is pushed on to stack
105   //
106   inline void decCurDegree() 
107     { assert( CurDegree > 0 ); --CurDegree; }
108
109
110   // The following methods call the methods in ParentLR
111   // They are added to this class for convenience
112   // If many of these are called within a single scope,
113   // consider calling the methods directly on LR
114
115
116   inline void setRegClass(RegClass *const RC) 
117     { ParentLR->setRegClass(RC);  }
118
119   inline RegClass *const getRegClass() const {
120     return ParentLR->getRegClass();
121   }
122
123   inline bool hasColor() const 
124     { return ParentLR->hasColor();  }
125
126   inline unsigned int getColor() const 
127     { return ParentLR->getColor();  }
128
129   inline void setColor(unsigned int Col) 
130     { ParentLR->setColor(Col);  }
131
132   inline void markForSpill() 
133     { ParentLR->markForSpill();  }
134
135   inline void markForSaveAcrossCalls() 
136     { ParentLR->markForSaveAcrossCalls();  }
137
138   inline unsigned int isCallInterference() const 
139   { return ParentLR->isCallInterference(); } 
140
141   inline LiveRange *getParentLR() const 
142     { return ParentLR; }
143
144   inline Type::PrimitiveID getTypeID() const 
145     { return ParentLR->getTypeID(); }
146
147
148 };
149
150 #endif