blob: acf6585779eaa8c4e79b1b292ca0cf973cd8152e [file] [log] [blame]
Ruchira Sasanka8e604792001-09-14 21:18:34 +00001#include "llvm/CodeGen/PhyRegAlloc.h"
2
Chris Lattner045e7c82001-09-19 16:26:23 +00003cl::Enum<RegAllocDebugLevel_t> DEBUG_RA("dregalloc", cl::NoFlags,
4 "enable register allocation debugging information",
5 clEnumValN(RA_DEBUG_None , "n", "disable debug output"),
6 clEnumValN(RA_DEBUG_Normal , "y", "enable debug output"),
7 clEnumValN(RA_DEBUG_Verbose, "v", "enable extra debug output"), 0);
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +00008
9
10//----------------------------------------------------------------------------
11// Constructor: Init local composite objects and create register classes.
12//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000013PhyRegAlloc::PhyRegAlloc(const Method *const M,
14 const TargetMachine& tm,
15 MethodLiveVarInfo *const Lvi)
16 : RegClassList(),
17 Meth(M), TM(tm), LVI(Lvi), LRI(M, tm, RegClassList),
18 MRI( tm.getRegInfo() ),
19 NumOfRegClasses(MRI.getNumOfRegClasses()),
Ruchira Sasanka8e604792001-09-14 21:18:34 +000020 AddedInstrMap()
21
22{
23 // **TODO: use an actual reserved color list
24 ReservedColorListType *RCL = new ReservedColorListType();
25
26 // create each RegisterClass and put in RegClassList
27 for( unsigned int rc=0; rc < NumOfRegClasses; rc++)
28 RegClassList.push_back( new RegClass(M, MRI.getMachineRegClass(rc), RCL) );
29
30}
31
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +000032//----------------------------------------------------------------------------
33// This method initally creates interference graphs (one in each reg class)
34// and IGNodeList (one in each IG). The actual nodes will be pushed later.
35//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000036
37void PhyRegAlloc::createIGNodeListsAndIGs()
38{
Ruchira Sasankac4d4b762001-10-16 01:23:19 +000039 if(DEBUG_RA ) cout << "Creating LR lists ..." << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000040
41 // hash map iterator
42 LiveRangeMapType::const_iterator HMI = (LRI.getLiveRangeMap())->begin();
43
44 // hash map end
45 LiveRangeMapType::const_iterator HMIEnd = (LRI.getLiveRangeMap())->end();
46
47 for( ; HMI != HMIEnd ; ++HMI ) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000048
49 if( (*HMI).first ) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +000050
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000051 LiveRange *L = (*HMI).second; // get the LiveRange
Ruchira Sasanka8e604792001-09-14 21:18:34 +000052
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000053 if( !L) {
54 if( DEBUG_RA) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +000055 cout << "\n*?!?Warning: Null liver range found for: ";
56 printValue( (*HMI).first) ; cout << endl;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000057 }
58 continue;
59 }
Ruchira Sasanka8e604792001-09-14 21:18:34 +000060 // if the Value * is not null, and LR
61 // is not yet written to the IGNodeList
62 if( !(L->getUserIGNode()) ) {
63
64 RegClass *const RC = // RegClass of first value in the LR
65 //RegClassList [MRI.getRegClassIDOfValue(*(L->begin()))];
66 RegClassList[ L->getRegClass()->getID() ];
67
68 RC-> addLRToIG( L ); // add this LR to an IG
69 }
70 }
71 }
72
73 // init RegClassList
74 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
75 RegClassList[ rc ]->createInterferenceGraph();
76
77 if( DEBUG_RA)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +000078 cout << "LRLists Created!" << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000079}
80
81
82
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +000083//----------------------------------------------------------------------------
84// This method will add all interferences at for a given instruction.
Ruchira Sasanka8e604792001-09-14 21:18:34 +000085// Interence occurs only if the LR of Def (Inst or Arg) is of the same reg
86// class as that of live var. The live var passed to this function is the
87// LVset AFTER the instruction
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +000088//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000089
90void PhyRegAlloc::addInterference(const Value *const Def,
91 const LiveVarSet *const LVSet,
92 const bool isCallInst) {
93
94 LiveVarSet::const_iterator LIt = LVSet->begin();
95
96 // get the live range of instruction
97 const LiveRange *const LROfDef = LRI.getLiveRangeForValue( Def );
98
99 IGNode *const IGNodeOfDef = LROfDef->getUserIGNode();
100 assert( IGNodeOfDef );
101
102 RegClass *const RCOfDef = LROfDef->getRegClass();
103
104 // for each live var in live variable set
105 for( ; LIt != LVSet->end(); ++LIt) {
106
107 if( DEBUG_RA > 1) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000108 cout << "< Def="; printValue(Def);
109 cout << ", Lvar="; printValue( *LIt); cout << "> ";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000110 }
111
112 // get the live range corresponding to live var
113 LiveRange *const LROfVar = LRI.getLiveRangeForValue(*LIt );
114
115 // LROfVar can be null if it is a const since a const
116 // doesn't have a dominating def - see Assumptions above
117 if( LROfVar) {
118
119 if(LROfDef == LROfVar) // do not set interf for same LR
120 continue;
121
122 // if 2 reg classes are the same set interference
123 if( RCOfDef == LROfVar->getRegClass() ){
124 RCOfDef->setInterference( LROfDef, LROfVar);
125
126 }
127
128 //the live range of this var interferes with this call
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000129 if( isCallInst ) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000130 LROfVar->addCallInterference( (const Instruction *const) Def );
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000131 // cout << "\n ++Added Call Interf to set:";
Ruchira Sasanka47c13722001-10-16 01:33:55 +0000132 //LROfVar->printSet();
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000133 }
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000134 }
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000135 else if(DEBUG_RA > 1) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000136 // we will not have LRs for values not explicitly allocated in the
137 // instruction stream (e.g., constants)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000138 cout << " warning: no live range for " ;
139 printValue( *LIt); cout << endl; }
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000140
141 }
142
143}
144
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000145//----------------------------------------------------------------------------
146// This method will walk thru code and create interferences in the IG of
147// each RegClass.
148//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000149
150void PhyRegAlloc::buildInterferenceGraphs()
151{
152
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000153 if(DEBUG_RA) cout << "Creating interference graphs ..." << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000154
155 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
156
157 for( ; BBI != Meth->end(); ++BBI) { // traverse BBs in random order
158
159 // get the iterator for machine instructions
160 const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
161 MachineCodeForBasicBlock::const_iterator
162 MInstIterator = MIVec.begin();
163
164 // iterate over all the machine instructions in BB
165 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000166
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000167 const MachineInstr *const MInst = *MInstIterator;
168
169 // get the LV set after the instruction
170 const LiveVarSet *const LVSetAI =
171 LVI->getLiveVarSetAfterMInst(MInst, *BBI);
172
173 const bool isCallInst = TM.getInstrInfo().isCall(MInst->getOpCode());
174
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000175 // if( isCallInst) cout << "\n%%% Found call Inst:\n";
176
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000177 // iterate over MI operands to find defs
178 for( MachineInstr::val_op_const_iterator OpI(MInst);!OpI.done(); ++OpI) {
179
180 if( OpI.isDef() ) {
181 // create a new LR iff this operand is a def
182 addInterference(*OpI, LVSetAI, isCallInst );
183
184 } //if this is a def
185
186 } // for all operands
187
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000188
189 // Also add interference for any implicit definitions in a machine
190 // instr (currently, only calls have this).
191
192 unsigned NumOfImpRefs = MInst->getNumImplicitRefs();
193 if( NumOfImpRefs > 0 ) {
194 for(unsigned z=0; z < NumOfImpRefs; z++)
195 if( MInst->implicitRefIsDefined(z) )
196 addInterference( MInst->getImplicitRef(z), LVSetAI, isCallInst );
197 }
198
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000199 } // for all machine instructions in BB
200
201
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000202#if 0
203
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000204 // go thru LLVM instructions in the basic block and record all CALL
Ruchira Sasankae727f852001-09-18 22:43:57 +0000205 // instructions and Return instructions in the CallInstrList
206 // This is done because since there are no reverse pointers in machine
207 // instructions to find the llvm instruction, when we encounter a call
208 // or a return whose args must be specailly colored (e.g., %o's for args)
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000209 BasicBlock::const_iterator InstIt = (*BBI)->begin();
210
211 for( ; InstIt != (*BBI)->end() ; ++ InstIt) {
Ruchira Sasankae727f852001-09-18 22:43:57 +0000212 unsigned OpCode = (*InstIt)->getOpcode();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000213
Ruchira Sasankae727f852001-09-18 22:43:57 +0000214 if( OpCode == Instruction::Call )
215 CallInstrList.push_back( *InstIt );
216
217 else if( OpCode == Instruction::Ret )
218 RetInstrList.push_back( *InstIt );
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000219 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000220
221#endif
222
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000223
224 } // for all BBs in method
225
226
227 // add interferences for method arguments. Since there are no explict
228 // defs in method for args, we have to add them manually
229
230 addInterferencesForArgs(); // add interference for method args
231
232 if( DEBUG_RA)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000233 cout << "Interference graphs calculted!" << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000234
235}
236
237
238
239
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000240//----------------------------------------------------------------------------
241// This method will add interferences for incoming arguments to a method.
242//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000243void PhyRegAlloc::addInterferencesForArgs()
244{
245 // get the InSet of root BB
246 const LiveVarSet *const InSet = LVI->getInSetOfBB( Meth->front() );
247
248 // get the argument list
249 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
250
251 // get an iterator to arg list
252 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
253
254
255 for( ; ArgIt != ArgList.end() ; ++ArgIt) { // for each argument
256 addInterference( *ArgIt, InSet, false ); // add interferences between
257 // args and LVars at start
258 if( DEBUG_RA > 1) {
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000259 cout << " - %% adding interference for argument ";
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000260 printValue( (const Value *) *ArgIt); cout << endl;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000261 }
262 }
263}
264
265
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000266
267//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000268// This method inserts caller saving/restoring instructons before/after
269// a call machine instruction.
270//----------------------------------------------------------------------------
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000271
272
273void PhyRegAlloc::insertCallerSavingCode(const MachineInstr *MInst,
274 const BasicBlock *BB )
275{
276 assert( (TM.getInstrInfo()).isCall( MInst->getOpCode() ) );
277
Ruchira Sasanka47c13722001-10-16 01:33:55 +0000278 int StackOff = -8; // ****TODO : Change
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000279 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000280
281 // Now find the LR of the return value of the call
282 // The last *implicit operand* is the return value of a call
283 // Insert it to to he PushedRegSet since we must not save that register
284 // and restore it after the call.
285 // We do this because, we look at the LV set *after* the instruction
286 // to determine, which LRs must be saved across calls. The return value
287 // of the call is live in this set - but we must not save/restore it.
288
289 unsigned NumOfImpRefs = MInst->getNumImplicitRefs();
290 if( NumOfImpRefs > 0 ) {
291
292 if( MInst->implicitRefIsDefined(NumOfImpRefs-1) ) {
293
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000294 const Value *RetVal = MInst->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000295 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
296 assert( RetValLR && "No LR for RetValue of call");
297
298 PushedRegSet.insert(
299 MRI.getUnifiedRegNum((RetValLR->getRegClass())->getID(),
300 RetValLR->getColor() ) );
301 }
302
303 }
304
305
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000306 const LiveVarSet *LVSetAft = LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000307
308 LiveVarSet::const_iterator LIt = LVSetAft->begin();
309
310 // for each live var in live variable set after machine inst
311 for( ; LIt != LVSetAft->end(); ++LIt) {
312
313 // get the live range corresponding to live var
314 LiveRange *const LR = LRI.getLiveRangeForValue(*LIt );
315
316 // LROfVar can be null if it is a const since a const
317 // doesn't have a dominating def - see Assumptions above
318 if( LR ) {
319
320 if( LR->hasColor() ) {
321
322 unsigned RCID = (LR->getRegClass())->getID();
323 unsigned Color = LR->getColor();
324
325 if ( MRI.isRegVolatile(RCID, Color) ) {
326
327 // if the value is in both LV sets (i.e., live before and after
328 // the call machine instruction)
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000329
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000330 unsigned Reg = MRI.getUnifiedRegNum(RCID, Color);
331
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000332 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000333
334 // if we haven't already pushed that register
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000335
336 unsigned RegType = MRI.getRegType( LR );
337
338 // Now get two instructions - to push on stack and pop from stack
339 // and add them to InstrnsBefore and InstrnsAfter of the
340 // call instruction
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000341
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000342 MachineInstr *AdIBef =
343 MRI.cpReg2MemMI(Reg, MRI.getFramePointer(), StackOff, RegType );
344
345 MachineInstr *AdIAft =
346 MRI.cpMem2RegMI(MRI.getFramePointer(), StackOff, Reg, RegType );
347
348 ((AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
349 ((AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000350
351 PushedRegSet.insert( Reg );
Ruchira Sasanka47c13722001-10-16 01:33:55 +0000352 StackOff -= 8; // ****TODO: Correct ??????
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000353
354 if(DEBUG_RA) {
355 cout << "For callee save call inst:" << *MInst << endl;
356 cerr << "\n -inserted caller saving instrs:\n\t ";
357 cerr << *AdIBef << "\n\t" << *AdIAft ;
358 }
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000359 } // if not already pushed
360
361 } // if LR has a volatile color
362
363 } // if LR has color
364
365 } // if there is a LR for Var
366
367 } // for each value in the LV set after instruction
368
369}
370
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000371
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000372//----------------------------------------------------------------------------
373// This method is called after register allocation is complete to set the
374// allocated reisters in the machine code. This code will add register numbers
375// to MachineOperands that contain a Value.
376//----------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000377
378void PhyRegAlloc::updateMachineCode()
379{
380
381 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
382
383 for( ; BBI != Meth->end(); ++BBI) { // traverse BBs in random order
384
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000385 // get the iterator for machine instructions
386 MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
387 MachineCodeForBasicBlock::iterator MInstIterator = MIVec.begin();
388
389 // iterate over all the machine instructions in BB
390 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
391
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000392 MachineInstr *MInst = *MInstIterator;
393
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000394 // if this machine instr is call, insert caller saving code
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000395
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000396 if( (TM.getInstrInfo()).isCall( MInst->getOpCode()) )
397 insertCallerSavingCode(MInst, *BBI );
398
399 // If there are instructions to be added, *before* this machine
400 // instruction, add them now.
401
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000402 if( AddedInstrMap[ MInst ] ) {
403
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000404 deque<MachineInstr *> &IBef = (AddedInstrMap[MInst])->InstrnsBefore;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000405
406 if( ! IBef.empty() ) {
407
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000408 deque<MachineInstr *>::iterator AdIt;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000409
410 for( AdIt = IBef.begin(); AdIt != IBef.end() ; ++AdIt ) {
411
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000412 if( DEBUG_RA)
413 cerr << " *$* PREPENDed instr " << *AdIt << endl;
414
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000415 MInstIterator = MIVec.insert( MInstIterator, *AdIt );
416 ++MInstIterator;
417 }
418
419 }
420
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000421 }
422
423
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000424
425 //for(MachineInstr::val_op_const_iterator OpI(MInst);!OpI.done();++OpI) {
426
427 for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
428
429 MachineOperand& Op = MInst->getOperand(OpNum);
430
431 if( Op.getOperandType() == MachineOperand::MO_VirtualRegister ||
432 Op.getOperandType() == MachineOperand::MO_CCRegister) {
433
434 const Value *const Val = Op.getVRegValue();
435
436 // delete this condition checking later (must assert if Val is null)
Chris Lattner045e7c82001-09-19 16:26:23 +0000437 if( !Val) {
438 if (DEBUG_RA)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000439 cout << "Warning: NULL Value found for operand" << endl;
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000440 continue;
441 }
442 assert( Val && "Value is NULL");
443
444 const LiveRange *const LR = LRI.getLiveRangeForValue(Val);
445
446 if ( !LR ) {
Ruchira Sasankae727f852001-09-18 22:43:57 +0000447
448 // nothing to worry if it's a const or a label
449
Chris Lattner4c3aaa42001-09-19 16:09:04 +0000450 if (DEBUG_RA) {
Ruchira Sasanka1b732fd2001-10-16 16:34:44 +0000451 cout << "*NO LR for operand : " << Op ;
452 cout << " [reg:" << Op.getAllocatedRegNum() << "]";
453 cout << " in inst:\t" << *MInst << endl;
Chris Lattner4c3aaa42001-09-19 16:09:04 +0000454 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000455
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000456 // if register is not allocated, mark register as invalid
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000457 if( Op.getAllocatedRegNum() == -1)
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000458 Op.setRegForValue( MRI.getInvalidRegNum());
Ruchira Sasankae727f852001-09-18 22:43:57 +0000459
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000460#if 0
Ruchira Sasankae727f852001-09-18 22:43:57 +0000461 if( ((Val->getType())->isLabelType()) ||
462 (Val->getValueType() == Value::ConstantVal) )
463 ; // do nothing
464
465 // The return address is not explicitly defined within a
466 // method. So, it is not colored by usual algorithm. In that case
467 // color it here.
468
469 //else if (TM.getInstrInfo().isCall(MInst->getOpCode()))
470 //Op.setRegForValue( MRI.getCallAddressReg() );
471
472 //TM.getInstrInfo().isReturn(MInst->getOpCode())
473 else if(TM.getInstrInfo().isReturn(MInst->getOpCode()) ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000474 if (DEBUG_RA) cout << endl << "RETURN found" << endl;
Ruchira Sasankae727f852001-09-18 22:43:57 +0000475 Op.setRegForValue( MRI.getReturnAddressReg() );
476
477 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000478
479 if (Val->getValueType() == Value::InstructionVal)
Ruchira Sasankae727f852001-09-18 22:43:57 +0000480 {
Ruchira Sasanka1b732fd2001-10-16 16:34:44 +0000481 if( DEBUG_RA ) {
482 cout << "!Warning: No LiveRange for: ";
483 printValue( Val); cout << " Type: " << Val->getValueType();
484 cout << " RegVal=" << Op.getAllocatedRegNum() << endl;
485 }
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000486 }
487
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000488#endif
489
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000490 continue;
491 }
492
493 unsigned RCID = (LR->getRegClass())->getID();
494
495 Op.setRegForValue( MRI.getUnifiedRegNum(RCID, LR->getColor()) );
496
497 int RegNum = MRI.getUnifiedRegNum(RCID, LR->getColor());
498
Ruchira Sasankae727f852001-09-18 22:43:57 +0000499 }
500
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000501 } // for each operand
502
503
504 // If there are instructions to be added *after* this machine
505 // instruction, add them now
506
507 if( AddedInstrMap[ MInst ] ) {
508
509 deque<MachineInstr *> &IAft = (AddedInstrMap[MInst])->InstrnsAfter;
510
511 if( ! IAft.empty() ) {
512
513 deque<MachineInstr *>::iterator AdIt;
514
515 ++MInstIterator; // advance to the next instruction
516
517 for( AdIt = IAft.begin(); AdIt != IAft.end() ; ++AdIt ) {
518
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000519 if(DEBUG_RA)
520 cerr << " *#* APPENDed instr opcode: " << *AdIt << endl;
521
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000522 MInstIterator = MIVec.insert( MInstIterator, *AdIt );
523 ++MInstIterator;
524 }
525
526 // MInsterator already points to the next instr. Since the
527 // for loop also increments it, decrement it to point to the
528 // instruction added last
529 --MInstIterator;
530
531 }
532
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000533 }
534
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000535 } // for each machine instruction
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000536 }
537}
538
539
540
541
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000542//----------------------------------------------------------------------------
543// This method prints the code with registers after register allocation is
544// complete.
545//----------------------------------------------------------------------------
546void PhyRegAlloc::printMachineCode()
547{
548
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000549 cout << endl << ";************** Method ";
550 cout << Meth->getName() << " *****************" << endl;
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000551
552 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
553
554 for( ; BBI != Meth->end(); ++BBI) { // traverse BBs in random order
555
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000556 cout << endl ; printLabel( *BBI); cout << ": ";
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000557
558 // get the iterator for machine instructions
559 MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
560 MachineCodeForBasicBlock::iterator MInstIterator = MIVec.begin();
561
562 // iterate over all the machine instructions in BB
563 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
564
565 MachineInstr *const MInst = *MInstIterator;
566
567
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000568 cout << endl << "\t";
569 cout << TargetInstrDescriptors[MInst->getOpCode()].opCodeString;
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000570
571
572 //for(MachineInstr::val_op_const_iterator OpI(MInst);!OpI.done();++OpI) {
573
574 for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
575
576 MachineOperand& Op = MInst->getOperand(OpNum);
577
578 if( Op.getOperandType() == MachineOperand::MO_VirtualRegister ||
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000579 Op.getOperandType() == MachineOperand::MO_CCRegister /*||
580 Op.getOperandType() == MachineOperand::MO_PCRelativeDisp*/ ) {
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000581
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000582 const Value *const Val = Op.getVRegValue () ;
Ruchira Sasankae727f852001-09-18 22:43:57 +0000583 // ****this code is temporary till NULL Values are fixed
584 if( ! Val ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000585 cout << "\t<*NULL*>";
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000586 continue;
587 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000588
589 // if a label or a constant
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000590 if( (Val->getValueType() == Value::BasicBlockVal) ) {
Ruchira Sasankae727f852001-09-18 22:43:57 +0000591
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000592 cout << "\t"; printLabel( Op.getVRegValue () );
Ruchira Sasankae727f852001-09-18 22:43:57 +0000593 }
594 else {
595 // else it must be a register value
596 const int RegNum = Op.getAllocatedRegNum();
597
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000598 //if( RegNum != 1000)
599
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000600 cout << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
601 // else cout << "\t<*NoReg*>";
Ruchira Sasankae727f852001-09-18 22:43:57 +0000602
603 }
604
605 }
606 else if(Op.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000607 cout << "\t" << "%" << MRI.getUnifiedRegName(Op.getMachineRegNum());
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000608 }
609
610 else
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000611 cout << "\t" << Op; // use dump field
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000612 }
613
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000614
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000615
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000616 unsigned NumOfImpRefs = MInst->getNumImplicitRefs();
617 if( NumOfImpRefs > 0 ) {
618
619 cout << "\tImplicit:";
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000620
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000621 for(unsigned z=0; z < NumOfImpRefs; z++) {
622 printValue( MInst->getImplicitRef(z) );
623 cout << "\t";
624 }
625
626 }
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000627
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000628 } // for all machine instructions
629
630
631 cout << endl;
632
633 } // for all BBs
634
635 cout << endl;
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000636}
637
Ruchira Sasankae727f852001-09-18 22:43:57 +0000638
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000639//----------------------------------------------------------------------------
640//
641//----------------------------------------------------------------------------
642
643void PhyRegAlloc::colorCallRetArgs()
644{
645
646 CallRetInstrListType &CallRetInstList = LRI.getCallRetInstrList();
647 CallRetInstrListType::const_iterator It = CallRetInstList.begin();
648
649 for( ; It != CallRetInstList.end(); ++It ) {
650
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000651 const MachineInstr *const CRMI = *It;
652 unsigned OpCode = CRMI->getOpCode();
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000653
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000654 // get the added instructions for this Call/Ret instruciton
655 AddedInstrns *AI = AddedInstrMap[ CRMI ];
656 if ( !AI ) {
657 AI = new AddedInstrns();
658 AddedInstrMap[ CRMI ] = AI;
659 }
660
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000661 if( (TM.getInstrInfo()).isCall( OpCode ) )
662 MRI.colorCallArgs( CRMI, LRI, AI );
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000663
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000664 else if ( (TM.getInstrInfo()).isReturn(OpCode) )
665 MRI.colorRetValue( CRMI, LRI, AI );
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000666
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000667 else assert( 0 && "Non Call/Ret instrn in CallRetInstrList\n" );
668
669 }
670
671}
672
673//----------------------------------------------------------------------------
674
675//----------------------------------------------------------------------------
676void PhyRegAlloc::colorIncomingArgs()
677{
678 const BasicBlock *const FirstBB = Meth->front();
679 const MachineInstr *FirstMI = *((FirstBB->getMachineInstrVec()).begin());
680 assert( FirstMI && "No machine instruction in entry BB");
681
682 AddedInstrns *AI = AddedInstrMap[ FirstMI ];
683 if ( !AI ) {
684 AI = new AddedInstrns();
685 AddedInstrMap[ FirstMI ] = AI;
686 }
687
688 MRI.colorMethodArgs(Meth, LRI, AI );
689}
690
Ruchira Sasankae727f852001-09-18 22:43:57 +0000691
692//----------------------------------------------------------------------------
693// Used to generate a label for a basic block
694//----------------------------------------------------------------------------
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000695void PhyRegAlloc::printLabel(const Value *const Val)
696{
697 if( Val->hasName() )
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000698 cout << Val->getName();
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000699 else
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000700 cout << "Label" << Val;
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000701}
702
703
Ruchira Sasankae727f852001-09-18 22:43:57 +0000704//----------------------------------------------------------------------------
705// The entry pont to Register Allocation
706//----------------------------------------------------------------------------
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000707
708void PhyRegAlloc::allocateRegisters()
709{
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000710
711 // make sure that we put all register classes into the RegClassList
712 // before we call constructLiveRanges (now done in the constructor of
713 // PhyRegAlloc class).
714
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000715 constructLiveRanges(); // create LR info
716
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000717 if( DEBUG_RA )
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000718 LRI.printLiveRanges();
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000719
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000720 createIGNodeListsAndIGs(); // create IGNode list and IGs
721
722 buildInterferenceGraphs(); // build IGs in all reg classes
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000723
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000724
725 if( DEBUG_RA ) {
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000726 // print all LRs in all reg classes
727 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
728 RegClassList[ rc ]->printIGNodeList();
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000729
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000730 // print IGs in all register classes
731 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
732 RegClassList[ rc ]->printIG();
733 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000734
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000735 LRI.coalesceLRs(); // coalesce all live ranges
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000736
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000737 if( DEBUG_RA) {
738 // print all LRs in all reg classes
739 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
740 RegClassList[ rc ]->printIGNodeList();
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000741
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000742 // print IGs in all register classes
743 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
744 RegClassList[ rc ]->printIG();
745 }
746
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000747 // color all register classes
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000748 for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)
749 RegClassList[ rc ]->colorAllRegs();
750
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000751
752 // color incoming args and call args
753 colorIncomingArgs();
754 colorCallRetArgs();
755
Ruchira Sasanka97b8b442001-10-18 22:36:26 +0000756
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000757 updateMachineCode();
Chris Lattner045e7c82001-09-19 16:26:23 +0000758 if (DEBUG_RA) {
Ruchira Sasanka1b732fd2001-10-16 16:34:44 +0000759 PrintMachineInstructions(Meth);
Chris Lattner045e7c82001-09-19 16:26:23 +0000760 printMachineCode(); // only for DEBUGGING
761 }
Ruchira Sasanka6b0a8b52001-09-15 21:11:11 +0000762}
763
Ruchira Sasankae727f852001-09-18 22:43:57 +0000764
765
766