blob: 01ecc1378354a4faabc6a1afdbb1a3dec08bea2e [file] [log] [blame]
Chris Lattner1b40a1b2001-09-07 21:04:20 +00001/* Title: IGNode.h -*- C++ -*-
Ruchira Sasankaf2a64772001-08-31 20:59:58 +00002 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
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000017 after all modifications to the IG are over (i.e., all neighbors are fixed).
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000018
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000019 The vector representation is the most efficient one for adj list.
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000020 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"
Chris Lattner2182c782002-02-04 05:52:08 +000031class LiveRange;
32class RegClass;
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000033
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000034//----------------------------------------------------------------------------
35// Class IGNode
36//
37// Represents a node in an interference graph.
38//----------------------------------------------------------------------------
39
Chris Lattner2182c782002-02-04 05:52:08 +000040class IGNode {
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000041 const int Index; // index within IGNodeList
42
43 bool OnStack; // this has been pushed on to stack for coloring
44
Chris Lattner697954c2002-01-20 22:54:45 +000045 std::vector<IGNode *> AdjList; // adjacency list for this live range
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000046
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000047 int CurDegree;
48 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000049 // 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.
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000053
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000054 LiveRange *const ParentLR; // parent LR (cannot be a const)
Chris Lattner2182c782002-02-04 05:52:08 +000055public:
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000056
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000057 // constructor
58 //
59 IGNode(LiveRange *const LR, unsigned int index);
60
61 // an empty destructor
62 //
63 ~IGNode() { }
64
65
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000066 inline unsigned int getIndex() const
67 { return Index; }
68
69 // adjLists must be updated only once. However, the CurDegree can be changed
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000070 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000071 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
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000079 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000080 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)
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000090 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000091 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).
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000097 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +000098 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
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000105 //
Ruchira Sasankaf2a64772001-08-31 20:59:58 +0000106 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
Chris Lattner2182c782002-02-04 05:52:08 +0000119 inline RegClass *const getRegClass() const {
120 return ParentLR->getRegClass();
121 }
Ruchira Sasankaf2a64772001-08-31 20:59:58 +0000122
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
Ruchira Sasanka36f77072001-10-19 17:21:59 +0000138 inline unsigned int isCallInterference() const
139 { return ParentLR->isCallInterference(); }
Ruchira Sasankaf2a64772001-08-31 20:59:58 +0000140
141 inline LiveRange *getParentLR() const
142 { return ParentLR; }
143
144 inline Type::PrimitiveID getTypeID() const
145 { return ParentLR->getTypeID(); }
146
147
Ruchira Sasankaf2a64772001-08-31 20:59:58 +0000148};
149
Ruchira Sasankaf2a64772001-08-31 20:59:58 +0000150#endif