blob: b5f9275be4bf543db868cad5c1d7f81fc1ec6bb9 [file] [log] [blame]
Ruchira Sasanka8e604792001-09-14 21:18:34 +00001#include "llvm/CodeGen/LiveRangeInfo.h"
Chris Lattner0a8ed942002-02-04 05:56:09 +00002#include "llvm/CodeGen/RegClass.h"
3#include "llvm/CodeGen/MachineInstr.h"
4#include "llvm/Target/TargetMachine.h"
5#include "llvm/Method.h"
Chris Lattner697954c2002-01-20 22:54:45 +00006#include <iostream>
7using std::cerr;
Ruchira Sasanka8e604792001-09-14 21:18:34 +00008
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +00009//---------------------------------------------------------------------------
10// Constructor
11//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000012LiveRangeInfo::LiveRangeInfo(const Method *const M,
13 const TargetMachine& tm,
Chris Lattner697954c2002-01-20 22:54:45 +000014 std::vector<RegClass *> &RCL)
15 : Meth(M), LiveRangeMap(), TM(tm),
16 RegClassList(RCL), MRI(tm.getRegInfo())
Ruchira Sasanka8e604792001-09-14 21:18:34 +000017{ }
18
19
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000020//---------------------------------------------------------------------------
21// Destructor: Deletes all LiveRanges in the LiveRangeMap
22//---------------------------------------------------------------------------
23LiveRangeInfo::~LiveRangeInfo() {
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000024 LiveRangeMapType::iterator MI = LiveRangeMap.begin();
25
26 for( ; MI != LiveRangeMap.end() ; ++MI) {
Chris Lattner697954c2002-01-20 22:54:45 +000027 if (MI->first && MI->second) {
28 LiveRange *LR = MI->second;
29
30 // we need to be careful in deleting LiveRanges in LiveRangeMap
31 // since two/more Values in the live range map can point to the same
32 // live range. We have to make the other entries NULL when we delete
33 // a live range.
34
35 LiveRange::iterator LI = LR->begin();
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000036
Chris Lattner697954c2002-01-20 22:54:45 +000037 for( ; LI != LR->end() ; ++LI)
38 LiveRangeMap[*LI] = 0;
39
40 delete LR;
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000041 }
42 }
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000043}
44
45
46//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000047// union two live ranges into one. The 2nd LR is deleted. Used for coalescing.
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000048// Note: the caller must make sure that L1 and L2 are distinct and both
49// LRs don't have suggested colors
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000050//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000051void LiveRangeInfo::unionAndUpdateLRs(LiveRange *const L1, LiveRange *L2)
52{
53 assert( L1 != L2);
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000054 L1->setUnion( L2 ); // add elements of L2 to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000055 ValueSet::iterator L2It;
56
57 for( L2It = L2->begin() ; L2It != L2->end(); ++L2It) {
58
59 //assert(( L1->getTypeID() == L2->getTypeID()) && "Merge:Different types");
60
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000061 L1->add( *L2It ); // add the var in L2 to L1
62 LiveRangeMap[ *L2It ] = L1; // now the elements in L2 should map
63 //to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000064 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000065
66
67 // Now if LROfDef(L1) has a suggested color, it will remain.
68 // But, if LROfUse(L2) has a suggested color, the new range
69 // must have the same color.
70
71 if(L2->hasSuggestedColor())
72 L1->setSuggestedColor( L2->getSuggestedColor() );
73
Ruchira Sasanka958faf32001-10-19 17:21:03 +000074
75 if( L2->isCallInterference() )
76 L1->setCallInterference();
77
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000078
79 L1->addSpillCost( L2->getSpillCost() ); // add the spill costs
Ruchira Sasanka958faf32001-10-19 17:21:03 +000080
Chris Lattner697954c2002-01-20 22:54:45 +000081 delete L2; // delete L2 as it is no longer needed
Ruchira Sasanka8e604792001-09-14 21:18:34 +000082}
83
84
85
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000086//---------------------------------------------------------------------------
87// Method for constructing all live ranges in a method. It creates live
88// ranges for all values defined in the instruction stream. Also, it
89// creates live ranges for all incoming arguments of the method.
90//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000091void LiveRangeInfo::constructLiveRanges()
92{
93
94 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +000095 cerr << "Consturcting Live Ranges ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +000096
97 // first find the live ranges for all incoming args of the method since
98 // those LRs start from the start of the method
99
100 // get the argument list
101 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
102 // get an iterator to arg list
103 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
104
105
106 for( ; ArgIt != ArgList.end() ; ++ArgIt) { // for each argument
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000107 LiveRange * ArgRange = new LiveRange(); // creates a new LR and
108 const Value *const Val = (const Value *) *ArgIt;
109
110 assert( Val);
111
Chris Lattner697954c2002-01-20 22:54:45 +0000112 ArgRange->add(Val); // add the arg (def) to it
113 LiveRangeMap[Val] = ArgRange;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000114
115 // create a temp machine op to find the register class of value
116 //const MachineOperand Op(MachineOperand::MO_VirtualRegister);
117
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000118 unsigned rcid = MRI.getRegClassIDOfValue( Val );
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000119 ArgRange->setRegClass(RegClassList[ rcid ] );
120
121
122 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000123 cerr << " adding LiveRange for argument ";
124 printValue((const Value *) *ArgIt); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000125 }
126 }
127
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000128 // Now suggest hardware registers for these method args
129 MRI.suggestRegs4MethodArgs(Meth, *this);
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000130
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000131
132
133 // Now find speical LLVM instructions (CALL, RET) and LRs in machine
134 // instructions.
135
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000136
137 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000138 for( ; BBI != Meth->end(); ++BBI) { // go thru BBs in random order
139
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000140 // Now find all LRs for machine the instructions. A new LR will be created
141 // only for defs in the machine instr since, we assume that all Values are
142 // defined before they are used. However, there can be multiple defs for
143 // the same Value in machine instructions.
144
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000145 // get the iterator for machine instructions
146 const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
Chris Lattner697954c2002-01-20 22:54:45 +0000147 MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000148
149 // iterate over all the machine instructions in BB
150 for( ; MInstIterator != MIVec.end(); MInstIterator++) {
151
152 const MachineInstr * MInst = *MInstIterator;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000153
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000154 // Now if the machine instruction is a call/return instruction,
155 // add it to CallRetInstrList for processing its implicit operands
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000156
Chris Lattner697954c2002-01-20 22:54:45 +0000157 if(TM.getInstrInfo().isReturn(MInst->getOpCode()) ||
158 TM.getInstrInfo().isCall(MInst->getOpCode()))
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000159 CallRetInstrList.push_back( MInst );
160
161
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000162 // iterate over MI operands to find defs
Chris Lattner697954c2002-01-20 22:54:45 +0000163 for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
164 if(DEBUG_RA) {
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000165 MachineOperand::MachineOperandType OpTyp =
166 OpI.getMachineOperand().getOperandType();
Ruchira Sasankae727f852001-09-18 22:43:57 +0000167
Chris Lattner697954c2002-01-20 22:54:45 +0000168 if (OpTyp == MachineOperand::MO_CCRegister) {
169 cerr << "\n**CC reg found. Is Def=" << OpI.isDef() << " Val:";
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000170 printValue( OpI.getMachineOperand().getVRegValue() );
Chris Lattner697954c2002-01-20 22:54:45 +0000171 cerr << "\n";
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000172 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000173 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000174
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000175 // create a new LR iff this operand is a def
176 if( OpI.isDef() ) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000177 const Value *const Def = *OpI;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000178
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000179 // Only instruction values are accepted for live ranges here
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000180 if( Def->getValueType() != Value::InstructionVal ) {
Chris Lattner697954c2002-01-20 22:54:45 +0000181 cerr << "\n**%%Error: Def is not an instruction val. Def=";
182 printValue( Def ); cerr << "\n";
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000183 continue;
184 }
185
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000186 LiveRange *DefRange = LiveRangeMap[Def];
187
188 // see LR already there (because of multiple defs)
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000189 if( !DefRange) { // if it is not in LiveRangeMap
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000190 DefRange = new LiveRange(); // creates a new live range and
191 DefRange->add( Def ); // add the instruction (def) to it
192 LiveRangeMap[ Def ] = DefRange; // update the map
193
194 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000195 cerr << " creating a LR for def: ";
196 printValue(Def); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000197 }
198
199 // set the register class of the new live range
200 //assert( RegClassList.size() );
201 MachineOperand::MachineOperandType OpTy =
202 OpI.getMachineOperand().getOperandType();
203
204 bool isCC = ( OpTy == MachineOperand::MO_CCRegister);
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000205 unsigned rcid = MRI.getRegClassIDOfValue(
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000206 OpI.getMachineOperand().getVRegValue(), isCC );
207
208
Ruchira Sasankae727f852001-09-18 22:43:57 +0000209 if(isCC && DEBUG_RA) {
Chris Lattner697954c2002-01-20 22:54:45 +0000210 cerr << "\a**created a LR for a CC reg:";
Ruchira Sasanka0931a012001-09-15 19:06:58 +0000211 printValue( OpI.getMachineOperand().getVRegValue() );
212 }
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000213
214 DefRange->setRegClass( RegClassList[ rcid ] );
215
216 }
217 else {
218 DefRange->add( Def ); // add the opearand to def range
219 // update the map - Operand points
220 // to the merged set
221 LiveRangeMap[ Def ] = DefRange;
222
223 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000224 cerr << " added to an existing LR for def: ";
225 printValue( Def ); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000226 }
227 }
228
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000229 } // if isDef()
230
231 } // for all opereands in machine instructions
232
233 } // for all machine instructions in the BB
234
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000235 } // for all BBs in method
236
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000237
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000238 // Now we have to suggest clors for call and return arg live ranges.
239 // Also, if there are implicit defs (e.g., retun value of a call inst)
240 // they must be added to the live range list
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000241
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000242 suggestRegs4CallRets();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000243
244 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000245 cerr << "Initial Live Ranges constructed!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000246
247}
248
249
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000250//---------------------------------------------------------------------------
251// If some live ranges must be colored with specific hardware registers
252// (e.g., for outgoing call args), suggesting of colors for such live
253// ranges is done using target specific method. Those methods are called
254// from this function. The target specific methods must:
255// 1) suggest colors for call and return args.
256// 2) create new LRs for implicit defs in machine instructions
257//---------------------------------------------------------------------------
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000258void LiveRangeInfo::suggestRegs4CallRets()
259{
260
261 CallRetInstrListType::const_iterator It = CallRetInstrList.begin();
262
263 for( ; It != CallRetInstrList.end(); ++It ) {
264
265 const MachineInstr *MInst = *It;
266 MachineOpCode OpCode = MInst->getOpCode();
267
268 if( (TM.getInstrInfo()).isReturn(OpCode) )
269 MRI.suggestReg4RetValue( MInst, *this);
270
271 else if( (TM.getInstrInfo()).isCall( OpCode ) )
272 MRI.suggestRegs4CallArgs( MInst, *this, RegClassList );
273
274 else
275 assert( 0 && "Non call/ret instr in CallRetInstrList" );
276 }
277
278}
279
280
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000281//--------------------------------------------------------------------------
282// The following method coalesces live ranges when possible. This method
283// must be called after the interference graph has been constructed.
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000284
285
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000286/* Algorithm:
287 for each BB in method
288 for each machine instruction (inst)
289 for each definition (def) in inst
290 for each operand (op) of inst that is a use
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000291 if the def and op are of the same register type
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000292 if the def and op do not interfere //i.e., not simultaneously live
293 if (degree(LR of def) + degree(LR of op)) <= # avail regs
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000294 if both LRs do not have suggested colors
295 merge2IGNodes(def, op) // i.e., merge 2 LRs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000296
297*/
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000298//---------------------------------------------------------------------------
299void LiveRangeInfo::coalesceLRs()
300{
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000301 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000302 cerr << "\nCoalscing LRs ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000303
304 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
305
306 for( ; BBI != Meth->end(); ++BBI) { // traverse BBs in random order
307
308 // get the iterator for machine instructions
309 const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
Chris Lattner697954c2002-01-20 22:54:45 +0000310 MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000311
312 // iterate over all the machine instructions in BB
313 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
314
315 const MachineInstr * MInst = *MInstIterator;
316
317 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000318 cerr << " *Iterating over machine instr ";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000319 MInst->dump();
Chris Lattner697954c2002-01-20 22:54:45 +0000320 cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000321 }
322
323
324 // iterate over MI operands to find defs
Chris Lattner7a176752001-12-04 00:03:30 +0000325 for(MachineInstr::val_const_op_iterator DefI(MInst);!DefI.done();++DefI){
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000326
327 if( DefI.isDef() ) { // iff this operand is a def
328
329 LiveRange *const LROfDef = getLiveRangeForValue( *DefI );
330 assert( LROfDef );
331 RegClass *const RCOfDef = LROfDef->getRegClass();
332
Chris Lattner7a176752001-12-04 00:03:30 +0000333 MachineInstr::val_const_op_iterator UseI(MInst);
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000334 for( ; !UseI.done(); ++UseI){ // for all uses
335
336 LiveRange *const LROfUse = getLiveRangeForValue( *UseI );
337
338 if( ! LROfUse ) { // if LR of use is not found
339
340 //don't warn about labels
341 if (!((*UseI)->getType())->isLabelType() && DEBUG_RA) {
Chris Lattner697954c2002-01-20 22:54:45 +0000342 cerr<<" !! Warning: No LR for use "; printValue(*UseI);
343 cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000344 }
345 continue; // ignore and continue
346 }
347
348 if( LROfUse == LROfDef) // nothing to merge if they are same
349 continue;
350
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000351 //RegClass *const RCOfUse = LROfUse->getRegClass();
352 //if( RCOfDef == RCOfUse ) { // if the reg classes are the same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000353
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000354 if( MRI.getRegType(LROfDef) == MRI.getRegType(LROfUse) ) {
355
356 // If the two RegTypes are the same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000357
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000358 if( ! RCOfDef->getInterference(LROfDef, LROfUse) ) {
359
360 unsigned CombinedDegree =
361 LROfDef->getUserIGNode()->getNumOfNeighbors() +
362 LROfUse->getUserIGNode()->getNumOfNeighbors();
363
364 if( CombinedDegree <= RCOfDef->getNumOfAvailRegs() ) {
365
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000366 // if both LRs do not have suggested colors
367 if( ! (LROfDef->hasSuggestedColor() &&
368 LROfUse->hasSuggestedColor() ) ) {
369
370 RCOfDef->mergeIGNodesOfLRs(LROfDef, LROfUse);
371 unionAndUpdateLRs(LROfDef, LROfUse);
372 }
373
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000374
375 } // if combined degree is less than # of regs
376
377 } // if def and use do not interfere
378
Ruchira Sasankad33238b2001-10-12 17:48:18 +0000379 }// if reg classes are the same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000380
381 } // for all uses
382
383 } // if def
384
385 } // for all defs
386
387 } // for all machine instructions
388
389 } // for all BBs
390
391 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000392 cerr << "\nCoalscing Done!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000393
394}
395
396
397
398
399
400/*--------------------------- Debug code for printing ---------------*/
401
402
403void LiveRangeInfo::printLiveRanges()
404{
405 LiveRangeMapType::iterator HMI = LiveRangeMap.begin(); // hash map iterator
Chris Lattner697954c2002-01-20 22:54:45 +0000406 cerr << "\nPrinting Live Ranges from Hash Map:\n";
407 for( ; HMI != LiveRangeMap.end() ; ++HMI) {
408 if( HMI->first && HMI->second ) {
409 cerr <<" "; printValue((*HMI).first); cerr << "\t: ";
410 HMI->second->printSet(); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000411 }
412 }
413}
414
415