blob: d0f1c444300169bd0c16ddd046ac6f9d577ee437 [file] [log] [blame]
Ruchira Sasanka8e604792001-09-14 21:18:34 +00001#include "llvm/CodeGen/RegClass.h"
2
3
4
5RegClass::RegClass(const Method *const M,
6 const MachineRegClassInfo *const Mrc,
7 const ReservedColorListType *const RCL)
8 : Meth(M), MRC(Mrc), RegClassID( Mrc->getRegClassID() ),
9 IG(this), IGNodeStack(), ReservedColorList(RCL)
10{
11 if( DEBUG_RA)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +000012 cout << "Created Reg Class: " << RegClassID << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000013
14 // This constructor inits IG. The actual matrix is created by a call to
15 // createInterferenceGraph() above.
16
17 IsColorUsedArr = new bool[ Mrc->getNumOfAllRegs() ];
18}
19
20
21
22void RegClass::colorAllRegs()
23{
Ruchira Sasankad1565ab2001-11-06 15:25:38 +000024 if(DEBUG_RA) cout << "Coloring IG of reg class " << RegClassID << " ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +000025
26 //preColorIGNodes(); // pre-color IGNodes
27 pushAllIGNodes(); // push all IG Nodes
28
29 unsigned int StackSize = IGNodeStack.size();
30 IGNode *CurIGNode;
31
32 // for all LRs on stack
33 for( unsigned int IGN=0; IGN < StackSize; IGN++) {
34
35 CurIGNode = IGNodeStack.top(); // pop the IGNode on top of stack
36 IGNodeStack.pop();
37 colorIGNode (CurIGNode); // color it
38 }
39
40
41 // InsertSpillCode; ********* TODO ********
42
43}
44
45
46
47void RegClass::pushAllIGNodes()
48{
49 bool NeedMoreSpills;
Ruchira Sasankad1565ab2001-11-06 15:25:38 +000050
Ruchira Sasanka8e604792001-09-14 21:18:34 +000051
52 IG.setCurDegreeOfIGNodes(); // calculate degree of IGNodes
53
54 // push non-constrained IGNodes
55 bool PushedAll = pushUnconstrainedIGNodes();
56
57 if( DEBUG_RA) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +000058 cout << " Puhsed all-unconstrained IGNodes. ";
59 if( PushedAll ) cout << " No constrained nodes left.";
60 cout << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000061 }
62
63 if( PushedAll ) // if NO constrained nodes left
64 return;
65
66
67 // now, we have constrained nodes. So, push one of them (the one with min
68 // spill cost) and try to push the others as unConstrained nodes.
69 // Repeat this.
70
71 do{
72
Vikram S. Adve04cc49b2001-11-06 05:11:05 +000073 //get node with min spill cost
Ruchira Sasankad1565ab2001-11-06 15:25:38 +000074 IGNode *IGNodeSpill = getIGNodeWithMinSpillCost();
75
Vikram S. Adve04cc49b2001-11-06 05:11:05 +000076 // push that node on to stack
Ruchira Sasanka8e604792001-09-14 21:18:34 +000077 IGNodeStack.push( IGNodeSpill );
78
Vikram S. Adve04cc49b2001-11-06 05:11:05 +000079 // set its OnStack flag and decrement degree of neighs
80 IGNodeSpill->pushOnStack();
Ruchira Sasanka8e604792001-09-14 21:18:34 +000081
82 // now push NON-constrined ones, if any
83 NeedMoreSpills = ! pushUnconstrainedIGNodes();
84
Ruchira Sasanka65480b72001-11-10 21:21:36 +000085 cerr << "\nConstrained IG Node found !@!" << IGNodeSpill->getIndex();
86
Ruchira Sasanka8e604792001-09-14 21:18:34 +000087 } while( NeedMoreSpills ); // repeat until we have pushed all
88
89}
90
91
92
93
Ruchira Sasankad1565ab2001-11-06 15:25:38 +000094//--------------------------------------------------------------------------
95// This method goes thru all IG nodes in the IGNodeList of an IG of a
96// register class and push any unconstrained IG node left (that is not
97// already pushed)
98//--------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000099
100bool RegClass::pushUnconstrainedIGNodes()
101{
102 // # of LRs for this reg class
103 unsigned int IGNodeListSize = IG.getIGNodeList().size();
104 bool pushedall = true;
105
106 // a pass over IGNodeList
107 for( unsigned i =0; i < IGNodeListSize; i++) {
108
109 // get IGNode i from IGNodeList
110 IGNode *IGNode = IG.getIGNodeList()[i];
111
Ruchira Sasankad1565ab2001-11-06 15:25:38 +0000112 if( !IGNode ) // can be null due to merging
113 continue;
114
115 // if already pushed on stack, continue. This can happen since this
116 // method can be called repeatedly until all constrained nodes are
117 // pushed
118 if( IGNode->isOnStack() )
119 continue;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000120 // if the degree of IGNode is lower
121 if( (unsigned) IGNode->getCurDegree() < MRC->getNumOfAvailRegs() ) {
122 IGNodeStack.push( IGNode ); // push IGNode on to the stack
123 IGNode->pushOnStack(); // set OnStack and dec deg of neighs
124
125 if (DEBUG_RA > 1) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000126 cout << " pushed un-constrained IGNode " << IGNode->getIndex() ;
127 cout << " on to stack" << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000128 }
129 }
130 else pushedall = false; // we didn't push all live ranges
131
132 } // for
133
134 // returns true if we pushed all live ranges - else false
135 return pushedall;
136}
137
138
139
140
141IGNode * RegClass::getIGNodeWithMinSpillCost()
142{
143 IGNode *IGNode=NULL;
144 unsigned int IGNodeListSize = IG.getIGNodeList().size();
145
146 // pass over IGNodeList
147 for( unsigned int i =0; i < IGNodeListSize; i++) {
148 IGNode = IG.getIGNodeList()[i];
149
150 if( ! IGNode ) // can be null due to merging
151 continue;
152
153 // return the first IGNode ########## Change this #######
154 if( ! IGNode->isOnStack() ) return IGNode;
155 }
156
157 assert(0);
158 return NULL;
159}
160
161
162
163
164void RegClass::colorIGNode(IGNode *const Node)
165{
166
167 if( ! Node->hasColor() ) { // not colored as an arg etc.
168
169
170 // init all elements to false;
171 for( unsigned i=0; i < MRC->getNumOfAllRegs(); i++) {
172 IsColorUsedArr[ i ] = false;
173 }
174
175 // init all reserved_regs to true - we can't use them
176 for( unsigned i=0; i < ReservedColorList->size() ; i++) {
177 IsColorUsedArr[ (*ReservedColorList)[i] ] = true;
178 }
179
180 MRC->colorIGNode(Node, IsColorUsedArr);
181 }
182 else {
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000183 if( DEBUG_RA ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000184 cout << " Node " << Node->getIndex();
185 cout << " already colored with color " << Node->getColor() << endl;
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000186 }
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000187 }
188
189
190 if( !Node->hasColor() ) {
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000191 if( DEBUG_RA ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000192 cout << " Node " << Node->getIndex();
193 cout << " - could not find a color (needs spilling)" << endl;
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000194 }
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000195 }
196
197}
198
199
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000200