Convert operand iterator over to work like an STL iterator
[oota-llvm.git] / lib / CodeGen / RegAlloc / PhyRegAlloc.cpp
1 // $Id$
2 //***************************************************************************
3 // File:
4 //      PhyRegAlloc.cpp
5 // 
6 // Purpose:
7 //      Register allocation for LLVM.
8 //      
9 // History:
10 //      9/10/01  -  Ruchira Sasanka - created.
11 //**************************************************************************/
12
13 #include "llvm/CodeGen/RegisterAllocation.h"
14 #include "llvm/CodeGen/PhyRegAlloc.h"
15 #include "llvm/CodeGen/MachineInstr.h"
16 #include "llvm/CodeGen/MachineCodeForMethod.h"
17 #include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
18 #include "llvm/Analysis/LoopInfo.h"
19 #include "llvm/Target/TargetMachine.h"
20 #include "llvm/Target/MachineFrameInfo.h"
21 #include "llvm/Method.h"
22 #include "llvm/Type.h"
23 #include <iostream>
24 #include <math.h>
25 using std::cerr;
26
27
28 // ***TODO: There are several places we add instructions. Validate the order
29 //          of adding these instructions.
30
31 cl::Enum<RegAllocDebugLevel_t> DEBUG_RA("dregalloc", cl::NoFlags,
32   "enable register allocation debugging information",
33   clEnumValN(RA_DEBUG_None   , "n", "disable debug output"),
34   clEnumValN(RA_DEBUG_Normal , "y", "enable debug output"),
35   clEnumValN(RA_DEBUG_Verbose, "v", "enable extra debug output"), 0);
36
37
38 //----------------------------------------------------------------------------
39 // RegisterAllocation pass front end...
40 //----------------------------------------------------------------------------
41 namespace {
42   class RegisterAllocator : public MethodPass {
43     TargetMachine &Target;
44   public:
45     inline RegisterAllocator(TargetMachine &T) : Target(T) {}
46     
47     bool runOnMethod(Method *M) {
48       if (DEBUG_RA)
49         cerr << "\n******************** Method "<< M->getName()
50              << " ********************\n";
51       
52       PhyRegAlloc PRA(M, Target, &getAnalysis<MethodLiveVarInfo>(),
53                       &getAnalysis<cfg::LoopInfo>());
54       PRA.allocateRegisters();
55       
56       if (DEBUG_RA) cerr << "\nRegister allocation complete!\n";
57       return false;
58     }
59
60     virtual void getAnalysisUsageInfo(Pass::AnalysisSet &Requires,
61                                       Pass::AnalysisSet &Destroyed,
62                                       Pass::AnalysisSet &Provided) {
63       Requires.push_back(cfg::LoopInfo::ID);
64       Requires.push_back(MethodLiveVarInfo::ID);
65     }
66   };
67 }
68
69 MethodPass *getRegisterAllocator(TargetMachine &T) {
70   return new RegisterAllocator(T);
71 }
72
73 //----------------------------------------------------------------------------
74 // Constructor: Init local composite objects and create register classes.
75 //----------------------------------------------------------------------------
76 PhyRegAlloc::PhyRegAlloc(Method *M, 
77                          const TargetMachine& tm, 
78                          MethodLiveVarInfo *Lvi,
79                          cfg::LoopInfo *LDC) 
80                        :  TM(tm), Meth(M),
81                           mcInfo(MachineCodeForMethod::get(M)),
82                           LVI(Lvi), LRI(M, tm, RegClassList), 
83                           MRI( tm.getRegInfo() ),
84                           NumOfRegClasses(MRI.getNumOfRegClasses()),
85                           LoopDepthCalc(LDC) {
86
87   // create each RegisterClass and put in RegClassList
88   //
89   for(unsigned int rc=0; rc < NumOfRegClasses; rc++)  
90     RegClassList.push_back( new RegClass(M, MRI.getMachineRegClass(rc), 
91                                          &ResColList) );
92 }
93
94
95 //----------------------------------------------------------------------------
96 // Destructor: Deletes register classes
97 //----------------------------------------------------------------------------
98 PhyRegAlloc::~PhyRegAlloc() { 
99   for( unsigned int rc=0; rc < NumOfRegClasses; rc++)
100     delete RegClassList[rc];
101
102
103 //----------------------------------------------------------------------------
104 // This method initally creates interference graphs (one in each reg class)
105 // and IGNodeList (one in each IG). The actual nodes will be pushed later. 
106 //----------------------------------------------------------------------------
107 void PhyRegAlloc::createIGNodeListsAndIGs() {
108   if (DEBUG_RA) cerr << "Creating LR lists ...\n";
109
110   // hash map iterator
111   LiveRangeMapType::const_iterator HMI = LRI.getLiveRangeMap()->begin();   
112
113   // hash map end
114   LiveRangeMapType::const_iterator HMIEnd = LRI.getLiveRangeMap()->end();   
115
116   for (; HMI != HMIEnd ; ++HMI ) {
117     if (HMI->first) { 
118       LiveRange *L = HMI->second;   // get the LiveRange
119       if (!L) { 
120         if( DEBUG_RA) {
121           cerr << "\n*?!?Warning: Null liver range found for: "
122                << RAV(HMI->first) << "\n";
123         }
124         continue;
125       }
126                                         // if the Value * is not null, and LR  
127                                         // is not yet written to the IGNodeList
128       if( !(L->getUserIGNode())  ) {  
129         RegClass *const RC =           // RegClass of first value in the LR
130           RegClassList[ L->getRegClass()->getID() ];
131         
132         RC->addLRToIG(L);              // add this LR to an IG
133       }
134     }
135   }
136     
137   // init RegClassList
138   for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
139     RegClassList[rc]->createInterferenceGraph();
140
141   if( DEBUG_RA)
142     cerr << "LRLists Created!\n";
143 }
144
145
146
147
148 //----------------------------------------------------------------------------
149 // This method will add all interferences at for a given instruction.
150 // Interence occurs only if the LR of Def (Inst or Arg) is of the same reg 
151 // class as that of live var. The live var passed to this function is the 
152 // LVset AFTER the instruction
153 //----------------------------------------------------------------------------
154 void PhyRegAlloc::addInterference(const Value *Def, 
155                                   const ValueSet *LVSet,
156                                   bool isCallInst) {
157
158   ValueSet::const_iterator LIt = LVSet->begin();
159
160   // get the live range of instruction
161   //
162   const LiveRange *const LROfDef = LRI.getLiveRangeForValue( Def );   
163
164   IGNode *const IGNodeOfDef = LROfDef->getUserIGNode();
165   assert( IGNodeOfDef );
166
167   RegClass *const RCOfDef = LROfDef->getRegClass(); 
168
169   // for each live var in live variable set
170   //
171   for( ; LIt != LVSet->end(); ++LIt) {
172
173     if (DEBUG_RA > 1)
174       cerr << "< Def=" << RAV(Def) << ", Lvar=" << RAV(*LIt) << "> ";
175
176     //  get the live range corresponding to live var
177     //
178     LiveRange *LROfVar = LRI.getLiveRangeForValue(*LIt);
179
180     // LROfVar can be null if it is a const since a const 
181     // doesn't have a dominating def - see Assumptions above
182     //
183     if (LROfVar) {  
184       if(LROfDef == LROfVar)            // do not set interf for same LR
185         continue;
186
187       // if 2 reg classes are the same set interference
188       //
189       if (RCOfDef == LROfVar->getRegClass()) {
190         RCOfDef->setInterference( LROfDef, LROfVar);  
191       } else if (DEBUG_RA > 1)  { 
192         // we will not have LRs for values not explicitly allocated in the
193         // instruction stream (e.g., constants)
194         cerr << " warning: no live range for " << RAV(*LIt) << "\n";
195       }
196     }
197   }
198 }
199
200
201
202 //----------------------------------------------------------------------------
203 // For a call instruction, this method sets the CallInterference flag in 
204 // the LR of each variable live int the Live Variable Set live after the
205 // call instruction (except the return value of the call instruction - since
206 // the return value does not interfere with that call itself).
207 //----------------------------------------------------------------------------
208
209 void PhyRegAlloc::setCallInterferences(const MachineInstr *MInst, 
210                                        const ValueSet *LVSetAft) {
211
212   // Now find the LR of the return value of the call
213   // We do this because, we look at the LV set *after* the instruction
214   // to determine, which LRs must be saved across calls. The return value
215   // of the call is live in this set - but it does not interfere with call
216   // (i.e., we can allocate a volatile register to the return value)
217   //
218   LiveRange *RetValLR = NULL;
219   const Value *RetVal = MRI.getCallInstRetVal( MInst );
220
221   if( RetVal ) {
222     RetValLR = LRI.getLiveRangeForValue( RetVal );
223     assert( RetValLR && "No LR for RetValue of call");
224   }
225
226   if( DEBUG_RA)
227     cerr << "\n For call inst: " << *MInst;
228
229   ValueSet::const_iterator LIt = LVSetAft->begin();
230
231   // for each live var in live variable set after machine inst
232   //
233   for( ; LIt != LVSetAft->end(); ++LIt) {
234
235     //  get the live range corresponding to live var
236     //
237     LiveRange *const LR = LRI.getLiveRangeForValue(*LIt ); 
238
239     if( LR && DEBUG_RA) {
240       cerr << "\n\tLR Aft Call: ";
241       printSet(*LR);
242     }
243    
244
245     // LR can be null if it is a const since a const 
246     // doesn't have a dominating def - see Assumptions above
247     //
248     if( LR && (LR != RetValLR) )   {  
249       LR->setCallInterference();
250       if( DEBUG_RA) {
251         cerr << "\n  ++Added call interf for LR: " ;
252         printSet(*LR);
253       }
254     }
255
256   }
257
258 }
259
260
261
262
263 //----------------------------------------------------------------------------
264 // This method will walk thru code and create interferences in the IG of
265 // each RegClass. Also, this method calculates the spill cost of each
266 // Live Range (it is done in this method to save another pass over the code).
267 //----------------------------------------------------------------------------
268 void PhyRegAlloc::buildInterferenceGraphs()
269 {
270
271   if(DEBUG_RA) cerr << "Creating interference graphs ...\n";
272
273   unsigned BBLoopDepthCost;
274   Method::const_iterator BBI = Meth->begin();  // random iterator for BBs   
275
276   for( ; BBI != Meth->end(); ++BBI) {          // traverse BBs in random order
277
278     // find the 10^(loop_depth) of this BB 
279     //
280     BBLoopDepthCost = (unsigned) pow( 10.0, LoopDepthCalc->getLoopDepth(*BBI));
281
282     // get the iterator for machine instructions
283     //
284     const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
285     MachineCodeForBasicBlock::const_iterator 
286       MInstIterator = MIVec.begin();
287
288     // iterate over all the machine instructions in BB
289     //
290     for( ; MInstIterator != MIVec.end(); ++MInstIterator) {  
291
292       const MachineInstr *MInst = *MInstIterator; 
293
294       // get the LV set after the instruction
295       //
296       const ValueSet &LVSetAI = LVI->getLiveVarSetAfterMInst(MInst, *BBI);
297     
298       const bool isCallInst = TM.getInstrInfo().isCall(MInst->getOpCode());
299
300       if( isCallInst ) {
301         // set the isCallInterference flag of each live range wich extends
302         // accross this call instruction. This information is used by graph
303         // coloring algo to avoid allocating volatile colors to live ranges
304         // that span across calls (since they have to be saved/restored)
305         //
306         setCallInterferences(MInst, &LVSetAI);
307       }
308
309
310       // iterate over all MI operands to find defs
311       //
312       for (MachineInstr::const_val_op_iterator OpI = MInst->begin(),
313              OpE = MInst->end(); OpI != OpE; ++OpI) {
314         if (OpI.isDef())    // create a new LR iff this operand is a def
315           addInterference(*OpI, &LVSetAI, isCallInst);
316
317         // Calculate the spill cost of each live range
318         //
319         LiveRange *LR = LRI.getLiveRangeForValue(*OpI);
320         if (LR) LR->addSpillCost(BBLoopDepthCost);
321       } 
322
323
324       // if there are multiple defs in this instruction e.g. in SETX
325       //   
326       if (TM.getInstrInfo().isPseudoInstr(MInst->getOpCode()))
327         addInterf4PseudoInstr(MInst);
328
329
330       // Also add interference for any implicit definitions in a machine
331       // instr (currently, only calls have this).
332       //
333       unsigned NumOfImpRefs =  MInst->getNumImplicitRefs();
334       if(  NumOfImpRefs > 0 ) {
335         for(unsigned z=0; z < NumOfImpRefs; z++) 
336           if( MInst->implicitRefIsDefined(z) )
337             addInterference( MInst->getImplicitRef(z), &LVSetAI, isCallInst );
338       }
339
340
341     } // for all machine instructions in BB
342     
343   } // for all BBs in method
344
345
346   // add interferences for method arguments. Since there are no explict 
347   // defs in method for args, we have to add them manually
348   //  
349   addInterferencesForArgs();          
350
351   if( DEBUG_RA)
352     cerr << "Interference graphs calculted!\n";
353
354 }
355
356
357
358 //--------------------------------------------------------------------------
359 // Pseudo instructions will be exapnded to multiple instructions by the
360 // assembler. Consequently, all the opernds must get distinct registers.
361 // Therefore, we mark all operands of a pseudo instruction as they interfere
362 // with one another.
363 //--------------------------------------------------------------------------
364 void PhyRegAlloc::addInterf4PseudoInstr(const MachineInstr *MInst) {
365
366   bool setInterf = false;
367
368   // iterate over  MI operands to find defs
369   //
370   for (MachineInstr::const_val_op_iterator It1 = MInst->begin(),
371          ItE = MInst->end(); It1 != ItE; ++It1) {
372     const LiveRange *LROfOp1 = LRI.getLiveRangeForValue(*It1); 
373     assert((LROfOp1 || !It1.isDef()) && "No LR for Def in PSEUDO insruction");
374
375     MachineInstr::const_val_op_iterator It2 = It1;
376     for(++It2; It2 != ItE; ++It2) {
377       const LiveRange *LROfOp2 = LRI.getLiveRangeForValue(*It2); 
378
379       if (LROfOp2) {
380         RegClass *RCOfOp1 = LROfOp1->getRegClass(); 
381         RegClass *RCOfOp2 = LROfOp2->getRegClass(); 
382  
383         if( RCOfOp1 == RCOfOp2 ){ 
384           RCOfOp1->setInterference( LROfOp1, LROfOp2 );  
385           setInterf = true;
386         }
387       } // if Op2 has a LR
388     } // for all other defs in machine instr
389   } // for all operands in an instruction
390
391   if (!setInterf && MInst->getNumOperands() > 2) {
392     cerr << "\nInterf not set for any operand in pseudo instr:\n";
393     cerr << *MInst;
394     assert(0 && "Interf not set for pseudo instr with > 2 operands" );
395   }
396
397
398
399
400 //----------------------------------------------------------------------------
401 // This method will add interferences for incoming arguments to a method.
402 //----------------------------------------------------------------------------
403 void PhyRegAlloc::addInterferencesForArgs() {
404   // get the InSet of root BB
405   const ValueSet &InSet = LVI->getInSetOfBB(Meth->front());  
406
407   // get the argument list
408   const Method::ArgumentListType& ArgList = Meth->getArgumentList();  
409
410   // get an iterator to arg list
411   Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();          
412
413
414   for( ; ArgIt != ArgList.end() ; ++ArgIt) {  // for each argument
415     addInterference((Value*)*ArgIt, &InSet, false);// add interferences between 
416                                               // args and LVars at start
417     if( DEBUG_RA > 1)
418       cerr << " - %% adding interference for  argument "
419            << RAV((const Value *)*ArgIt) << "\n";
420   }
421 }
422
423
424
425
426 //----------------------------------------------------------------------------
427 // This method is called after register allocation is complete to set the
428 // allocated reisters in the machine code. This code will add register numbers
429 // to MachineOperands that contain a Value. Also it calls target specific
430 // methods to produce caller saving instructions. At the end, it adds all
431 // additional instructions produced by the register allocator to the 
432 // instruction stream. 
433 //----------------------------------------------------------------------------
434 void PhyRegAlloc::updateMachineCode()
435 {
436
437   Method::const_iterator BBI = Meth->begin();  // random iterator for BBs   
438
439   for( ; BBI != Meth->end(); ++BBI) {          // traverse BBs in random order
440
441     // get the iterator for machine instructions
442     //
443     MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
444     MachineCodeForBasicBlock::iterator MInstIterator = MIVec.begin();
445
446     // iterate over all the machine instructions in BB
447     //
448     for( ; MInstIterator != MIVec.end(); ++MInstIterator) {  
449       
450       MachineInstr *MInst = *MInstIterator; 
451       
452       unsigned Opcode =  MInst->getOpCode();
453     
454       // do not process Phis
455       if (TM.getInstrInfo().isPhi(Opcode))
456         continue;
457
458       // Now insert speical instructions (if necessary) for call/return
459       // instructions. 
460       //
461       if (TM.getInstrInfo().isCall(Opcode) ||
462           TM.getInstrInfo().isReturn(Opcode)) {
463
464         AddedInstrns *AI = AddedInstrMap[ MInst];
465         if ( !AI ) { 
466           AI = new AddedInstrns();
467           AddedInstrMap[ MInst ] = AI;
468         }
469         
470         // Tmp stack poistions are needed by some calls that have spilled args
471         // So reset it before we call each such method
472         //
473         mcInfo.popAllTempValues(TM);  
474         
475         if (TM.getInstrInfo().isCall(Opcode))
476           MRI.colorCallArgs(MInst, LRI, AI, *this, *BBI);
477         else if (TM.getInstrInfo().isReturn(Opcode))
478           MRI.colorRetValue(MInst, LRI, AI);
479       }
480       
481
482       /* -- Using above code instead of this
483
484       // if this machine instr is call, insert caller saving code
485
486       if( (TM.getInstrInfo()).isCall( MInst->getOpCode()) )
487         MRI.insertCallerSavingCode(MInst,  *BBI, *this );
488         
489       */
490
491       
492       // reset the stack offset for temporary variables since we may
493       // need that to spill
494       // mcInfo.popAllTempValues(TM);
495       // TODO ** : do later
496       
497       //for(MachineInstr::val_const_op_iterator OpI(MInst);!OpI.done();++OpI) {
498
499
500       // Now replace set the registers for operands in the machine instruction
501       //
502       for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
503
504         MachineOperand& Op = MInst->getOperand(OpNum);
505
506         if( Op.getOperandType() ==  MachineOperand::MO_VirtualRegister || 
507             Op.getOperandType() ==  MachineOperand::MO_CCRegister) {
508
509           const Value *const Val =  Op.getVRegValue();
510
511           // delete this condition checking later (must assert if Val is null)
512           if( !Val) {
513             if (DEBUG_RA)
514               cerr << "Warning: NULL Value found for operand\n";
515             continue;
516           }
517           assert( Val && "Value is NULL");   
518
519           LiveRange *const LR = LRI.getLiveRangeForValue(Val);
520
521           if ( !LR ) {
522
523             // nothing to worry if it's a const or a label
524
525             if (DEBUG_RA) {
526               cerr << "*NO LR for operand : " << Op ;
527               cerr << " [reg:" <<  Op.getAllocatedRegNum() << "]";
528               cerr << " in inst:\t" << *MInst << "\n";
529             }
530
531             // if register is not allocated, mark register as invalid
532             if( Op.getAllocatedRegNum() == -1)
533               Op.setRegForValue( MRI.getInvalidRegNum()); 
534             
535
536             continue;
537           }
538         
539           unsigned RCID = (LR->getRegClass())->getID();
540
541           if( LR->hasColor() ) {
542             Op.setRegForValue( MRI.getUnifiedRegNum(RCID, LR->getColor()) );
543           }
544           else {
545
546             // LR did NOT receive a color (register). Now, insert spill code
547             // for spilled opeands in this machine instruction
548
549             //assert(0 && "LR must be spilled");
550             insertCode4SpilledLR(LR, MInst, *BBI, OpNum );
551
552           }
553         }
554
555       } // for each operand
556
557
558       // Now add instructions that the register allocator inserts before/after 
559       // this machine instructions (done only for calls/rets/incoming args)
560       // We do this here, to ensure that spill for an instruction is inserted
561       // closest as possible to an instruction (see above insertCode4Spill...)
562       // 
563       // If there are instructions to be added, *before* this machine
564       // instruction, add them now.
565       //      
566       if( AddedInstrMap[ MInst ] ) {
567         std::deque<MachineInstr *> &IBef = AddedInstrMap[MInst]->InstrnsBefore;
568
569         if( ! IBef.empty() ) {
570           std::deque<MachineInstr *>::iterator AdIt; 
571
572           for( AdIt = IBef.begin(); AdIt != IBef.end() ; ++AdIt ) {
573
574             if( DEBUG_RA) {
575               cerr << "For inst " << *MInst;
576               cerr << " PREPENDed instr: " << **AdIt << "\n";
577             }
578                     
579             MInstIterator = MIVec.insert( MInstIterator, *AdIt );
580             ++MInstIterator;
581           }
582
583         }
584
585       }
586
587       // If there are instructions to be added *after* this machine
588       // instruction, add them now
589       //
590       if(AddedInstrMap[MInst] && 
591          !AddedInstrMap[MInst]->InstrnsAfter.empty() ) {
592
593         // if there are delay slots for this instruction, the instructions
594         // added after it must really go after the delayed instruction(s)
595         // So, we move the InstrAfter of the current instruction to the 
596         // corresponding delayed instruction
597         
598         unsigned delay;
599         if ((delay=TM.getInstrInfo().getNumDelaySlots(MInst->getOpCode())) >0){ 
600           move2DelayedInstr(MInst,  *(MInstIterator+delay) );
601
602           if(DEBUG_RA)  cerr<< "\nMoved an added instr after the delay slot";
603         }
604        
605         else {
606         
607
608           // Here we can add the "instructions after" to the current
609           // instruction since there are no delay slots for this instruction
610
611           std::deque<MachineInstr *> &IAft = AddedInstrMap[MInst]->InstrnsAfter;
612           
613           if( ! IAft.empty() ) {     
614             
615             std::deque<MachineInstr *>::iterator AdIt; 
616             
617             ++MInstIterator;   // advance to the next instruction
618             
619             for( AdIt = IAft.begin(); AdIt != IAft.end() ; ++AdIt ) {
620               
621               if(DEBUG_RA) {
622                 cerr << "For inst " << *MInst;
623                 cerr << " APPENDed instr: "  << **AdIt << "\n";
624               }       
625
626               MInstIterator = MIVec.insert( MInstIterator, *AdIt );
627               ++MInstIterator;
628             }
629
630             // MInsterator already points to the next instr. Since the
631             // for loop also increments it, decrement it to point to the
632             // instruction added last
633             --MInstIterator;  
634             
635           }
636           
637         }  // if not delay
638         
639       }
640       
641     } // for each machine instruction
642   }
643 }
644
645
646
647 //----------------------------------------------------------------------------
648 // This method inserts spill code for AN operand whose LR was spilled.
649 // This method may be called several times for a single machine instruction
650 // if it contains many spilled operands. Each time it is called, it finds
651 // a register which is not live at that instruction and also which is not
652 // used by other spilled operands of the same instruction. Then it uses
653 // this register temporarily to accomodate the spilled value.
654 //----------------------------------------------------------------------------
655 void PhyRegAlloc::insertCode4SpilledLR(const LiveRange *LR, 
656                                        MachineInstr *MInst,
657                                        const BasicBlock *BB,
658                                        const unsigned OpNum) {
659
660   assert(! TM.getInstrInfo().isCall(MInst->getOpCode()) &&
661          (! TM.getInstrInfo().isReturn(MInst->getOpCode())) &&
662          "Arg of a call/ret must be handled elsewhere");
663
664   MachineOperand& Op = MInst->getOperand(OpNum);
665   bool isDef =  MInst->operandIsDefined(OpNum);
666   unsigned RegType = MRI.getRegType( LR );
667   int SpillOff = LR->getSpillOffFromFP();
668   RegClass *RC = LR->getRegClass();
669   const ValueSet &LVSetBef = LVI->getLiveVarSetBeforeMInst(MInst, BB);
670
671   mcInfo.pushTempValue(TM, MRI.getSpilledRegSize(RegType) );
672   
673   MachineInstr *MIBef=NULL,  *AdIMid=NULL, *MIAft=NULL;
674   
675   int TmpRegU = getUsableUniRegAtMI(RC, RegType, MInst,&LVSetBef, MIBef, MIAft);
676   
677   // get the added instructions for this instruciton
678   AddedInstrns *AI = AddedInstrMap[ MInst ];
679   if ( !AI ) { 
680     AI = new AddedInstrns();
681     AddedInstrMap[ MInst ] = AI;
682   }
683
684     
685   if( !isDef ) {
686
687     // for a USE, we have to load the value of LR from stack to a TmpReg
688     // and use the TmpReg as one operand of instruction
689
690     // actual loading instruction
691     AdIMid = MRI.cpMem2RegMI(MRI.getFramePointer(), SpillOff, TmpRegU,RegType);
692
693     if(MIBef)
694       AI->InstrnsBefore.push_back(MIBef);
695
696     AI->InstrnsBefore.push_back(AdIMid);
697
698     if(MIAft)
699       AI->InstrnsAfter.push_front(MIAft);
700     
701   } else {   // if this is a Def
702     // for a DEF, we have to store the value produced by this instruction
703     // on the stack position allocated for this LR
704
705     // actual storing instruction
706     AdIMid = MRI.cpReg2MemMI(TmpRegU, MRI.getFramePointer(), SpillOff,RegType);
707
708     if (MIBef)
709       AI->InstrnsBefore.push_back(MIBef);
710
711     AI->InstrnsAfter.push_front(AdIMid);
712
713     if (MIAft)
714       AI->InstrnsAfter.push_front(MIAft);
715
716   }  // if !DEF
717
718   cerr << "\nFor Inst " << *MInst;
719   cerr << " - SPILLED LR: "; printSet(*LR);
720   cerr << "\n - Added Instructions:";
721   if (MIBef) cerr <<  *MIBef;
722   cerr <<  *AdIMid;
723   if (MIAft) cerr <<  *MIAft;
724
725   Op.setRegForValue(TmpRegU);    // set the opearnd
726 }
727
728
729
730 //----------------------------------------------------------------------------
731 // We can use the following method to get a temporary register to be used
732 // BEFORE any given machine instruction. If there is a register available,
733 // this method will simply return that register and set MIBef = MIAft = NULL.
734 // Otherwise, it will return a register and MIAft and MIBef will contain
735 // two instructions used to free up this returned register.
736 // Returned register number is the UNIFIED register number
737 //----------------------------------------------------------------------------
738
739 int PhyRegAlloc::getUsableUniRegAtMI(RegClass *RC, 
740                                   const int RegType,
741                                   const MachineInstr *MInst, 
742                                   const ValueSet *LVSetBef,
743                                   MachineInstr *MIBef,
744                                   MachineInstr *MIAft) {
745
746   int RegU =  getUnusedUniRegAtMI(RC, MInst, LVSetBef);
747
748
749   if( RegU != -1) {
750     // we found an unused register, so we can simply use it
751     MIBef = MIAft = NULL;
752   }
753   else {
754     // we couldn't find an unused register. Generate code to free up a reg by
755     // saving it on stack and restoring after the instruction
756
757     int TmpOff = mcInfo.pushTempValue(TM,  MRI.getSpilledRegSize(RegType) );
758     
759     RegU = getUniRegNotUsedByThisInst(RC, MInst);
760     MIBef = MRI.cpReg2MemMI(RegU, MRI.getFramePointer(), TmpOff, RegType );
761     MIAft = MRI.cpMem2RegMI(MRI.getFramePointer(), TmpOff, RegU, RegType );
762   }
763
764   return RegU;
765 }
766
767 //----------------------------------------------------------------------------
768 // This method is called to get a new unused register that can be used to
769 // accomodate a spilled value. 
770 // This method may be called several times for a single machine instruction
771 // if it contains many spilled operands. Each time it is called, it finds
772 // a register which is not live at that instruction and also which is not
773 // used by other spilled operands of the same instruction.
774 // Return register number is relative to the register class. NOT
775 // unified number
776 //----------------------------------------------------------------------------
777 int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC, 
778                                   const MachineInstr *MInst, 
779                                   const ValueSet *LVSetBef) {
780
781   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
782   
783   bool *IsColorUsedArr = RC->getIsColorUsedArr();
784   
785   for(unsigned i=0; i <  NumAvailRegs; i++)     // Reset array
786       IsColorUsedArr[i] = false;
787       
788   ValueSet::const_iterator LIt = LVSetBef->begin();
789
790   // for each live var in live variable set after machine inst
791   for( ; LIt != LVSetBef->end(); ++LIt) {
792
793    //  get the live range corresponding to live var
794     LiveRange *const LRofLV = LRI.getLiveRangeForValue(*LIt );    
795
796     // LR can be null if it is a const since a const 
797     // doesn't have a dominating def - see Assumptions above
798     if( LRofLV )     
799       if( LRofLV->hasColor() ) 
800         IsColorUsedArr[ LRofLV->getColor() ] = true;
801   }
802
803   // It is possible that one operand of this MInst was already spilled
804   // and it received some register temporarily. If that's the case,
805   // it is recorded in machine operand. We must skip such registers.
806
807   setRelRegsUsedByThisInst(RC, MInst);
808
809   unsigned c;                         // find first unused color
810   for( c=0; c < NumAvailRegs; c++)  
811      if( ! IsColorUsedArr[ c ] ) break;
812    
813   if(c < NumAvailRegs) 
814     return  MRI.getUnifiedRegNum(RC->getID(), c);
815   else 
816     return -1;
817
818
819 }
820
821
822 //----------------------------------------------------------------------------
823 // Get any other register in a register class, other than what is used
824 // by operands of a machine instruction. Returns the unified reg number.
825 //----------------------------------------------------------------------------
826 int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC, 
827                                          const MachineInstr *MInst) {
828
829   bool *IsColorUsedArr = RC->getIsColorUsedArr();
830   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
831
832
833   for(unsigned i=0; i < NumAvailRegs ; i++)   // Reset array
834     IsColorUsedArr[i] = false;
835
836   setRelRegsUsedByThisInst(RC, MInst);
837
838   unsigned c;                         // find first unused color
839   for( c=0; c <  RC->getNumOfAvailRegs(); c++)  
840      if( ! IsColorUsedArr[ c ] ) break;
841    
842   if(c < NumAvailRegs) 
843     return  MRI.getUnifiedRegNum(RC->getID(), c);
844   else 
845     assert( 0 && "FATAL: No free register could be found in reg class!!");
846   return 0;
847 }
848
849
850 //----------------------------------------------------------------------------
851 // This method modifies the IsColorUsedArr of the register class passed to it.
852 // It sets the bits corresponding to the registers used by this machine
853 // instructions. Both explicit and implicit operands are set.
854 //----------------------------------------------------------------------------
855 void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC, 
856                                        const MachineInstr *MInst ) {
857
858  bool *IsColorUsedArr = RC->getIsColorUsedArr();
859   
860  for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
861     
862    const MachineOperand& Op = MInst->getOperand(OpNum);
863
864     if( Op.getOperandType() ==  MachineOperand::MO_VirtualRegister || 
865         Op.getOperandType() ==  MachineOperand::MO_CCRegister ) {
866
867       const Value *const Val =  Op.getVRegValue();
868
869       if( Val ) 
870         if( MRI.getRegClassIDOfValue(Val) == RC->getID() ) {   
871           int Reg;
872           if( (Reg=Op.getAllocatedRegNum()) != -1) {
873             IsColorUsedArr[ Reg ] = true;
874           }
875           else {
876             // it is possilbe that this operand still is not marked with
877             // a register but it has a LR and that received a color
878
879             LiveRange *LROfVal =  LRI.getLiveRangeForValue(Val);
880             if( LROfVal) 
881               if( LROfVal->hasColor() )
882                 IsColorUsedArr[ LROfVal->getColor() ] = true;
883           }
884         
885         } // if reg classes are the same
886     }
887     else if (Op.getOperandType() ==  MachineOperand::MO_MachineRegister) {
888       IsColorUsedArr[ Op.getMachineRegNum() ] = true;
889     }
890  }
891  
892  // If there are implicit references, mark them as well
893
894  for(unsigned z=0; z < MInst->getNumImplicitRefs(); z++) {
895
896    LiveRange *const LRofImpRef = 
897      LRI.getLiveRangeForValue( MInst->getImplicitRef(z)  );    
898    
899    if(LRofImpRef && LRofImpRef->hasColor())
900      IsColorUsedArr[LRofImpRef->getColor()] = true;
901  }
902 }
903
904
905
906
907
908
909
910
911 //----------------------------------------------------------------------------
912 // If there are delay slots for an instruction, the instructions
913 // added after it must really go after the delayed instruction(s).
914 // So, we move the InstrAfter of that instruction to the 
915 // corresponding delayed instruction using the following method.
916
917 //----------------------------------------------------------------------------
918 void PhyRegAlloc:: move2DelayedInstr(const MachineInstr *OrigMI,
919                                      const MachineInstr *DelayedMI) {
920
921   // "added after" instructions of the original instr
922   std::deque<MachineInstr *> &OrigAft = AddedInstrMap[OrigMI]->InstrnsAfter;
923
924   // "added instructions" of the delayed instr
925   AddedInstrns *DelayAdI = AddedInstrMap[DelayedMI];
926
927   if(! DelayAdI )  {                // create a new "added after" if necessary
928     DelayAdI = new AddedInstrns();
929     AddedInstrMap[DelayedMI] =  DelayAdI;
930   }
931
932   // "added after" instructions of the delayed instr
933   std::deque<MachineInstr *> &DelayedAft = DelayAdI->InstrnsAfter;
934
935   // go thru all the "added after instructions" of the original instruction
936   // and append them to the "addded after instructions" of the delayed
937   // instructions
938   DelayedAft.insert(DelayedAft.end(), OrigAft.begin(), OrigAft.end());
939
940   // empty the "added after instructions" of the original instruction
941   OrigAft.clear();
942 }
943
944 //----------------------------------------------------------------------------
945 // This method prints the code with registers after register allocation is
946 // complete.
947 //----------------------------------------------------------------------------
948 void PhyRegAlloc::printMachineCode()
949 {
950
951   cerr << "\n;************** Method " << Meth->getName()
952        << " *****************\n";
953
954   Method::const_iterator BBI = Meth->begin();  // random iterator for BBs   
955
956   for( ; BBI != Meth->end(); ++BBI) {          // traverse BBs in random order
957
958     cerr << "\n"; printLabel( *BBI); cerr << ": ";
959
960     // get the iterator for machine instructions
961     MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
962     MachineCodeForBasicBlock::iterator MInstIterator = MIVec.begin();
963
964     // iterate over all the machine instructions in BB
965     for( ; MInstIterator != MIVec.end(); ++MInstIterator) {  
966       
967       MachineInstr *const MInst = *MInstIterator; 
968
969
970       cerr << "\n\t";
971       cerr << TargetInstrDescriptors[MInst->getOpCode()].opCodeString;
972       
973
974       //for(MachineInstr::val_const_op_iterator OpI(MInst);!OpI.done();++OpI) {
975
976       for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
977
978         MachineOperand& Op = MInst->getOperand(OpNum);
979
980         if( Op.getOperandType() ==  MachineOperand::MO_VirtualRegister || 
981             Op.getOperandType() ==  MachineOperand::MO_CCRegister /*|| 
982             Op.getOperandType() ==  MachineOperand::MO_PCRelativeDisp*/ ) {
983
984           const Value *const Val = Op.getVRegValue () ;
985           // ****this code is temporary till NULL Values are fixed
986           if( ! Val ) {
987             cerr << "\t<*NULL*>";
988             continue;
989           }
990
991           // if a label or a constant
992           if(isa<BasicBlock>(Val)) {
993             cerr << "\t"; printLabel(   Op.getVRegValue () );
994           } else {
995             // else it must be a register value
996             const int RegNum = Op.getAllocatedRegNum();
997
998             cerr << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
999             if (Val->hasName() )
1000               cerr << "(" << Val->getName() << ")";
1001             else 
1002               cerr << "(" << Val << ")";
1003
1004             if( Op.opIsDef() )
1005               cerr << "*";
1006
1007             const LiveRange *LROfVal = LRI.getLiveRangeForValue(Val);
1008             if( LROfVal )
1009               if( LROfVal->hasSpillOffset() )
1010                 cerr << "$";
1011           }
1012
1013         } 
1014         else if(Op.getOperandType() ==  MachineOperand::MO_MachineRegister) {
1015           cerr << "\t" << "%" << MRI.getUnifiedRegName(Op.getMachineRegNum());
1016         }
1017
1018         else 
1019           cerr << "\t" << Op;      // use dump field
1020       }
1021
1022     
1023
1024       unsigned NumOfImpRefs =  MInst->getNumImplicitRefs();
1025       if( NumOfImpRefs > 0) {
1026         cerr << "\tImplicit:";
1027
1028         for(unsigned z=0; z < NumOfImpRefs; z++)
1029           cerr << RAV(MInst->getImplicitRef(z)) << "\t";
1030       }
1031
1032     } // for all machine instructions
1033
1034     cerr << "\n";
1035
1036   } // for all BBs
1037
1038   cerr << "\n";
1039 }
1040
1041
1042 #if 0
1043
1044 //----------------------------------------------------------------------------
1045 //
1046 //----------------------------------------------------------------------------
1047
1048 void PhyRegAlloc::colorCallRetArgs()
1049 {
1050
1051   CallRetInstrListType &CallRetInstList = LRI.getCallRetInstrList();
1052   CallRetInstrListType::const_iterator It = CallRetInstList.begin();
1053
1054   for( ; It != CallRetInstList.end(); ++It ) {
1055
1056     const MachineInstr *const CRMI = *It;
1057     unsigned OpCode =  CRMI->getOpCode();
1058  
1059     // get the added instructions for this Call/Ret instruciton
1060     AddedInstrns *AI = AddedInstrMap[ CRMI ];
1061     if ( !AI ) { 
1062       AI = new AddedInstrns();
1063       AddedInstrMap[ CRMI ] = AI;
1064     }
1065
1066     // Tmp stack poistions are needed by some calls that have spilled args
1067     // So reset it before we call each such method
1068     //mcInfo.popAllTempValues(TM);  
1069
1070
1071     
1072     if (TM.getInstrInfo().isCall(OpCode))
1073       MRI.colorCallArgs(CRMI, LRI, AI, *this);
1074     else if (TM.getInstrInfo().isReturn(OpCode)) 
1075       MRI.colorRetValue( CRMI, LRI, AI );
1076     else
1077       assert(0 && "Non Call/Ret instrn in CallRetInstrList\n");
1078   }
1079 }
1080
1081 #endif 
1082
1083 //----------------------------------------------------------------------------
1084
1085 //----------------------------------------------------------------------------
1086 void PhyRegAlloc::colorIncomingArgs()
1087 {
1088   const BasicBlock *const FirstBB = Meth->front();
1089   const MachineInstr *FirstMI = FirstBB->getMachineInstrVec().front();
1090   assert(FirstMI && "No machine instruction in entry BB");
1091
1092   AddedInstrns *AI = AddedInstrMap[FirstMI];
1093   if (!AI)
1094     AddedInstrMap[FirstMI] = AI = new AddedInstrns();
1095
1096   MRI.colorMethodArgs(Meth, LRI, AI);
1097 }
1098
1099
1100 //----------------------------------------------------------------------------
1101 // Used to generate a label for a basic block
1102 //----------------------------------------------------------------------------
1103 void PhyRegAlloc::printLabel(const Value *const Val) {
1104   if (Val->hasName())
1105     cerr  << Val->getName();
1106   else
1107     cerr << "Label" <<  Val;
1108 }
1109
1110
1111 //----------------------------------------------------------------------------
1112 // This method calls setSugColorUsable method of each live range. This
1113 // will determine whether the suggested color of LR is  really usable.
1114 // A suggested color is not usable when the suggested color is volatile
1115 // AND when there are call interferences
1116 //----------------------------------------------------------------------------
1117
1118 void PhyRegAlloc::markUnusableSugColors()
1119 {
1120   if(DEBUG_RA ) cerr << "\nmarking unusable suggested colors ...\n";
1121
1122   // hash map iterator
1123   LiveRangeMapType::const_iterator HMI = (LRI.getLiveRangeMap())->begin();   
1124   LiveRangeMapType::const_iterator HMIEnd = (LRI.getLiveRangeMap())->end();   
1125
1126     for(; HMI != HMIEnd ; ++HMI ) {
1127       if (HMI->first) { 
1128         LiveRange *L = HMI->second;      // get the LiveRange
1129         if (L) { 
1130           if(L->hasSuggestedColor()) {
1131             int RCID = L->getRegClass()->getID();
1132             if( MRI.isRegVolatile( RCID,  L->getSuggestedColor()) &&
1133                 L->isCallInterference() )
1134               L->setSuggestedColorUsable( false );
1135             else
1136               L->setSuggestedColorUsable( true );
1137           }
1138         } // if L->hasSuggestedColor()
1139       }
1140     } // for all LR's in hash map
1141 }
1142
1143
1144
1145 //----------------------------------------------------------------------------
1146 // The following method will set the stack offsets of the live ranges that
1147 // are decided to be spillled. This must be called just after coloring the
1148 // LRs using the graph coloring algo. For each live range that is spilled,
1149 // this method allocate a new spill position on the stack.
1150 //----------------------------------------------------------------------------
1151
1152 void PhyRegAlloc::allocateStackSpace4SpilledLRs() {
1153   if (DEBUG_RA) cerr << "\nsetting LR stack offsets ...\n";
1154
1155   LiveRangeMapType::const_iterator HMI    = LRI.getLiveRangeMap()->begin();   
1156   LiveRangeMapType::const_iterator HMIEnd = LRI.getLiveRangeMap()->end();   
1157
1158   for( ; HMI != HMIEnd ; ++HMI) {
1159     if (HMI->first && HMI->second) {
1160       LiveRange *L = HMI->second;      // get the LiveRange
1161       if (!L->hasColor())   //  NOTE: ** allocating the size of long Type **
1162         L->setSpillOffFromFP(mcInfo.allocateSpilledValue(TM, Type::LongTy));
1163     }
1164   } // for all LR's in hash map
1165 }
1166
1167
1168
1169 //----------------------------------------------------------------------------
1170 // The entry pont to Register Allocation
1171 //----------------------------------------------------------------------------
1172
1173 void PhyRegAlloc::allocateRegisters()
1174 {
1175
1176   // make sure that we put all register classes into the RegClassList 
1177   // before we call constructLiveRanges (now done in the constructor of 
1178   // PhyRegAlloc class).
1179   //
1180   LRI.constructLiveRanges();            // create LR info
1181
1182   if (DEBUG_RA)
1183     LRI.printLiveRanges();
1184   
1185   createIGNodeListsAndIGs();            // create IGNode list and IGs
1186
1187   buildInterferenceGraphs();            // build IGs in all reg classes
1188   
1189   
1190   if (DEBUG_RA) {
1191     // print all LRs in all reg classes
1192     for( unsigned int rc=0; rc < NumOfRegClasses  ; rc++)  
1193       RegClassList[ rc ]->printIGNodeList(); 
1194     
1195     // print IGs in all register classes
1196     for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
1197       RegClassList[ rc ]->printIG();       
1198   }
1199   
1200
1201   LRI.coalesceLRs();                    // coalesce all live ranges
1202   
1203
1204   if( DEBUG_RA) {
1205     // print all LRs in all reg classes
1206     for( unsigned int rc=0; rc < NumOfRegClasses  ; rc++)  
1207       RegClassList[ rc ]->printIGNodeList(); 
1208     
1209     // print IGs in all register classes
1210     for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
1211       RegClassList[ rc ]->printIG();       
1212   }
1213
1214
1215   // mark un-usable suggested color before graph coloring algorithm.
1216   // When this is done, the graph coloring algo will not reserve
1217   // suggested color unnecessarily - they can be used by another LR
1218   //
1219   markUnusableSugColors(); 
1220
1221   // color all register classes using the graph coloring algo
1222   for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
1223     RegClassList[ rc ]->colorAllRegs();    
1224
1225   // Atter grpah coloring, if some LRs did not receive a color (i.e, spilled)
1226   // a poistion for such spilled LRs
1227   //
1228   allocateStackSpace4SpilledLRs();
1229
1230   mcInfo.popAllTempValues(TM);  // TODO **Check
1231
1232   // color incoming args - if the correct color was not received
1233   // insert code to copy to the correct register
1234   //
1235   colorIncomingArgs();
1236
1237   // Now update the machine code with register names and add any 
1238   // additional code inserted by the register allocator to the instruction
1239   // stream
1240   //
1241   updateMachineCode(); 
1242
1243   if (DEBUG_RA) {
1244     MachineCodeForMethod::get(Meth).dump();
1245     printMachineCode();                   // only for DEBUGGING
1246   }
1247 }
1248
1249
1250