e59a3ab2b41025a7e97233e64ad52ea34198eccc
[oota-llvm.git] / lib / Target / SparcV9 / SparcV9RegInfo.cpp
1 #include "llvm/Target/Sparc.h"
2 #include "SparcInternals.h"
3 #include "llvm/Method.h"
4 #include "llvm/iTerminators.h"
5 #include "llvm/iOther.h"
6 #include "llvm/CodeGen/InstrScheduling.h"
7 #include "llvm/CodeGen/InstrSelection.h"
8
9 #include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
10 #include "llvm/CodeGen/PhyRegAlloc.h"
11
12
13
14
15 //---------------------------------------------------------------------------
16 // UltraSparcRegInfo
17 //---------------------------------------------------------------------------
18
19 //---------------------------------------------------------------------------
20 // Finds the return value of a call instruction
21 //---------------------------------------------------------------------------
22
23 const Value * 
24 UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const{
25
26   unsigned OpCode = CallMI->getOpCode();
27   unsigned NumOfImpRefs =  CallMI->getNumImplicitRefs();
28
29   if( OpCode == CALL ) {
30
31     // The one before the last implicit operand is the return value of 
32     // a CALL instr
33     if( NumOfImpRefs > 1 )
34       if(  CallMI->implicitRefIsDefined(NumOfImpRefs-2) ) 
35         return  CallMI->getImplicitRef(NumOfImpRefs-2); 
36
37   }
38   else if( OpCode == JMPLCALL) {
39
40     // The last implicit operand is the return value of a JMPL in   
41     if( NumOfImpRefs > 0 )
42       if(  CallMI->implicitRefIsDefined(NumOfImpRefs-1) ) 
43         return  CallMI->getImplicitRef(NumOfImpRefs-1); 
44   }
45   else
46     assert(0 && "OpCode must be CALL/JMPL for a call instr");
47
48   return NULL;
49
50 }
51
52 //---------------------------------------------------------------------------
53 // Finds the return address of a call instruction
54 //---------------------------------------------------------------------------
55
56 const Value *
57 UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI)const {
58
59   unsigned OpCode = CallMI->getOpCode();
60
61   if( OpCode == CALL) {
62
63     unsigned NumOfImpRefs =  CallMI->getNumImplicitRefs();
64
65     assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
66     // The last implicit operand is the return address of a CALL instr
67     return  CallMI->getImplicitRef(NumOfImpRefs-1); 
68
69   }
70   else if( OpCode == JMPLCALL ) {
71
72     MachineOperand & MO  = ( MachineOperand &) CallMI->getOperand(2);
73     return MO.getVRegValue();
74
75   }
76   else
77     assert(0 && "OpCode must be CALL/JMPL for a call instr");
78
79   assert(0  && "There must be a return addr for a call instr");
80
81   return NULL;
82
83 }
84
85
86 //---------------------------------------------------------------------------
87 // Finds the # of actual arguments of the call instruction
88 //---------------------------------------------------------------------------
89
90 const unsigned 
91 UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
92
93   unsigned OpCode = CallMI->getOpCode();
94   unsigned NumOfImpRefs =  CallMI->getNumImplicitRefs();
95   int NumArgs = -1;
96
97   if( OpCode == CALL ) {
98
99     switch( NumOfImpRefs ) {
100
101     case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
102
103     case 1: NumArgs = 0;
104             break;
105     
106     default:  // two or more implicit refs
107       if(  CallMI->implicitRefIsDefined(NumOfImpRefs-2) ) 
108         NumArgs = NumOfImpRefs - 2;    // i.e., NumOfImpRef-2 is the ret val
109       else 
110         NumArgs = NumOfImpRefs - 1;
111     }
112
113   }
114   else if( OpCode == JMPLCALL ) {
115
116     // The last implicit operand is the return value of a JMPL instr
117     if( NumOfImpRefs > 0 ) {
118       if(  CallMI->implicitRefIsDefined(NumOfImpRefs-1) ) 
119         NumArgs = NumOfImpRefs - 1;    // i.e., NumOfImpRef-1 is the ret val
120       else 
121         NumArgs = NumOfImpRefs;
122     }
123     else 
124       NumArgs = NumOfImpRefs;
125   }
126   else
127     assert(0 && "OpCode must be CALL/JMPL for a call instr");
128
129   assert( (NumArgs != -1)  && "Internal error in getCallInstNumArgs" );
130   return (unsigned) NumArgs;
131  
132   
133 }
134
135
136 //---------------------------------------------------------------------------
137 // Suggests a register for the ret address in the RET machine instruction
138 //---------------------------------------------------------------------------
139
140 void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI, 
141                                            LiveRangeInfo& LRI) const {
142
143   assert( (RetMI->getNumOperands() >= 2)
144           && "JMPL/RETURN must have 3 and 2 operands respectively");
145   
146   MachineOperand & MO  = ( MachineOperand &) RetMI->getOperand(0);
147
148   MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
149   
150   // TODO (Optimize): 
151   // Instead of setting the color, we can suggest one. In that case,
152   // we have to test later whether it received the suggested color.
153   // In that case, a LR has to be created at the start of method.
154   // It has to be done as follows (remove the setRegVal above):
155
156   /*
157   const Value *RetAddrVal = MO.getVRegValue();
158
159   assert( RetAddrVal && "LR for ret address must be created at start");
160
161   LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);  
162   RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID, 
163   SparcIntRegOrdr::i7) );
164   */
165
166
167 }
168
169
170 //---------------------------------------------------------------------------
171 // Suggests a register for the ret address in the JMPL/CALL machine instr
172 //---------------------------------------------------------------------------
173 void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
174                                             LiveRangeInfo& LRI,
175                                             vector<RegClass *> RCList) const {
176
177
178   const Value *RetAddrVal = getCallInstRetAddr( CallMI );
179
180   // RetAddrVal cannot be NULL (asserted in  getCallInstRetAddr)
181   // create a new LR for the return address and color it
182   
183   LiveRange * RetAddrLR = new LiveRange();  
184   RetAddrLR->add( RetAddrVal );
185   unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
186   RetAddrLR->setRegClass( RCList[RegClassID] );
187   RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
188   LRI.addLRToMap( RetAddrVal, RetAddrLR);
189   
190
191   /*  
192   assert( (CallMI->getNumOperands() == 3) && "JMPL must have 3 operands");
193
194   // directly set color since the LR of ret address (if there were one) 
195   // will not extend after the call instr
196
197   MachineOperand & MO  = ( MachineOperand &) CallMI->getOperand(2);
198   MO.setRegForValue( getUnifiedRegNum( IntRegClassID,SparcIntRegOrder::o7) );
199
200   */
201
202 }
203
204
205
206
207 //---------------------------------------------------------------------------
208 //  This method will suggest colors to incoming args to a method. 
209 //  If the arg is passed on stack due to the lack of regs, NOTHING will be
210 //  done - it will be colored (or spilled) as a normal value.
211 //---------------------------------------------------------------------------
212
213 void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *const Meth, 
214                                                LiveRangeInfo& LRI) const 
215 {
216
217                                                  // get the argument list
218   const Method::ArgumentListType& ArgList = Meth->getArgumentList();           
219                                                  // get an iterator to arg list
220   Method::ArgumentListType::const_iterator ArgIt = ArgList.begin(); 
221
222   // for each argument
223   for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {    
224
225     // get the LR of arg
226     LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt); 
227     assert( LR && "No live range found for method arg");
228
229     unsigned RegType = getRegType( LR );
230
231
232     // if the arg is in int class - allocate a reg for an int arg
233     if( RegType == IntRegType ) {
234
235       if( argNo < NumOfIntArgRegs) {
236         LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
237
238       }
239   
240       else {
241         // Do NOTHING as this will be colored as a normal value.
242         if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
243       }
244      
245     }
246     else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs) 
247       LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
248     
249  
250     else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs) 
251       LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) ); 
252     
253
254   }
255   
256 }
257
258 //---------------------------------------------------------------------------
259 // 
260 //---------------------------------------------------------------------------
261
262 void UltraSparcRegInfo::colorMethodArgs(const Method *const Meth, 
263                                         LiveRangeInfo& LRI,
264                                         AddedInstrns *const FirstAI) const {
265
266                                                  // get the argument list
267   const Method::ArgumentListType& ArgList = Meth->getArgumentList();           
268                                                  // get an iterator to arg list
269   Method::ArgumentListType::const_iterator ArgIt = ArgList.begin(); 
270
271   MachineInstr *AdMI;
272
273
274   // for each argument
275   for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {    
276
277     // get the LR of arg
278     LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt); 
279     assert( LR && "No live range found for method arg");
280
281
282     unsigned RegType = getRegType( LR );
283     unsigned RegClassID = (LR->getRegClass())->getID();
284
285
286     // find whether this argument is coming in a register (if not, on stack)
287
288     bool isArgInReg = false;
289     unsigned UniArgReg = InvalidRegNum;  // reg that LR MUST be colored with
290
291     if( (RegType== IntRegType && argNo <  NumOfIntArgRegs)) {
292       isArgInReg = true;
293       UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
294     }
295     else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs)  { 
296       isArgInReg = true;
297       UniArgReg = getUnifiedRegNum( RegClassID, 
298                                     SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
299     }
300     else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs)  { 
301       isArgInReg = true;
302       UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
303     }
304
305     
306     if( LR->hasColor() ) {
307
308       unsigned UniLRReg = getUnifiedRegNum(  RegClassID, LR->getColor() );
309
310       // if LR received the correct color, nothing to do
311       if( UniLRReg == UniArgReg )
312         continue;
313
314       // We are here because the LR did not have a suggested 
315       // color or did not receive the suggested color but LR got a register.
316       // Now we have to copy %ix reg (or stack pos of arg) 
317       // to the register it was colored with.
318       
319       // if the arg is coming in UniArgReg register MUST go into
320       // the UniLRReg register
321       if( isArgInReg ) 
322         AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
323
324       else {
325
326         // Now the arg is coming on stack. Since the LR recieved a register,
327         // we just have to load the arg on stack into that register
328         const MachineFrameInfo& frameInfo = target.getFrameInfo();
329         assert(frameInfo.argsOnStackHaveFixedSize()); 
330         
331         bool growUp;
332         int firstArg =
333           frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
334         int offsetFromFP =
335           growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
336                 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
337         
338         AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP, 
339                            UniLRReg, RegType );
340       }
341
342       FirstAI->InstrnsBefore.push_back( AdMI );   
343       
344     } // if LR received a color
345
346     else {                             
347
348       // Now, the LR did not receive a color. But it has a stack offset for
349       // spilling.
350
351       // So, if the arg is coming in UniArgReg register,  we can just move
352       // that on to the stack pos of LR
353
354
355       if( isArgInReg ) {
356
357         MachineInstr *AdIBef = 
358           cpReg2MemMI(UniArgReg, getFramePointer(), 
359                       LR->getSpillOffFromFP(), RegType );
360
361         FirstAI->InstrnsBefore.push_back( AdMI );   
362       }
363
364       else {
365
366         // Now the arg is coming on stack. Since the LR did NOT 
367         // recieved a register as well, it is allocated a stack position. We
368         // can simply change the stack poistion of the LR. We can do this,
369         // since this method is called before any other method that makes
370         // uses of the stack pos of the LR (e.g., updateMachineInstr)
371
372         const MachineFrameInfo& frameInfo = target.getFrameInfo();
373         assert(frameInfo.argsOnStackHaveFixedSize()); 
374         
375         bool growUp;
376         int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
377         int offsetFromFP =
378           growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
379                 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
380         
381         LR->modifySpillOffFromFP( offsetFromFP );
382       }
383
384     }
385
386   }  // for each incoming argument
387
388 }
389
390
391
392
393 //---------------------------------------------------------------------------
394 // This method is called before graph coloring to suggest colors to the
395 // outgoing call args and the return value of the call.
396 //---------------------------------------------------------------------------
397 void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI, 
398                                              LiveRangeInfo& LRI,
399                                              vector<RegClass *> RCList) const {
400
401   assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
402
403   suggestReg4CallAddr(CallMI, LRI, RCList);
404
405
406   // First color the return value of the call instruction. The return value
407   // will be in %o0 if the value is an integer type, or in %f0 if the 
408   // value is a float type.
409
410   // the return value cannot have a LR in machine instruction since it is
411   // only defined by the call instruction
412
413   // if type is not void,  create a new live range and set its 
414   // register class and add to LRI
415
416
417   const Value *RetVal = getCallInstRetVal( CallMI );
418
419
420   if( RetVal ) {
421
422     assert( (! LRI.getLiveRangeForValue( RetVal ) ) && 
423             "LR for ret Value of call already definded!");
424
425
426       // create a new LR for the return value
427
428     LiveRange * RetValLR = new LiveRange();  
429     RetValLR->add( RetVal );
430     unsigned RegClassID = getRegClassIDOfValue( RetVal );
431     RetValLR->setRegClass( RCList[RegClassID] );
432     LRI.addLRToMap( RetVal, RetValLR);
433     
434     // now suggest a register depending on the register class of ret arg
435
436     if( RegClassID == IntRegClassID ) 
437       RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
438     else if (RegClassID == FloatRegClassID ) 
439       RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
440     else assert( 0 && "Unknown reg class for return value of call\n");
441
442   }
443
444   
445   // Now suggest colors for arguments (operands) of the call instruction.
446   // Colors are suggested only if the arg number is smaller than the
447   // the number of registers allocated for argument passing.
448   // Now, go thru call args - implicit operands of the call MI
449
450   unsigned NumOfCallArgs =  getCallInstNumArgs( CallMI );
451   
452   for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
453
454     const Value *CallArg = CallMI->getImplicitRef(i);
455     
456     // get the LR of call operand (parameter)
457     LiveRange *const LR = LRI.getLiveRangeForValue(CallArg); 
458
459     // not possible to have a null LR since all args (even consts)  
460     // must be defined before
461     if( !LR ) {          
462       if( DEBUG_RA) {
463         cerr << " ERROR: In call instr, no LR for arg:  " ;
464         printValue(CallArg); cerr << endl;
465       }
466       assert(0 && "NO LR for call arg");  
467       // continue;
468     }
469     
470     unsigned RegType = getRegType( LR );
471
472     // if the arg is in int class - allocate a reg for an int arg
473     if( RegType == IntRegType ) {
474
475       if( argNo < NumOfIntArgRegs) 
476         LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
477
478       else if (DEBUG_RA) 
479         // Do NOTHING as this will be colored as a normal value.
480         cerr << " Regr not suggested for int call arg" << endl;
481       
482     }
483     else if( RegType == FPSingleRegType &&  (argNo*2 +1)< NumOfFloatArgRegs) 
484       LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
485     
486  
487     else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs) 
488       LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) ); 
489     
490
491   } // for all call arguments
492
493 }
494
495
496 //---------------------------------------------------------------------------
497 // After graph coloring, we have call this method to see whehter the return
498 // value and the call args received the correct colors. If not, we have
499 // to instert copy instructions.
500 //---------------------------------------------------------------------------
501
502 void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
503                                       LiveRangeInfo& LRI,
504                                       AddedInstrns *const CallAI,
505                                       PhyRegAlloc &PRA) const {
506
507   assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
508
509   // Reset the optional args area in the stack frame
510   // since that is reused for each call
511   // 
512   PRA.mcInfo.resetOptionalArgs(target);
513   
514   // First color the return value of the call.
515   // If there is a LR for the return value, it means this
516   // method returns a value
517   
518   MachineInstr *AdMI;
519
520   const Value *RetVal = getCallInstRetVal( CallMI );
521
522   if( RetVal ) {
523
524     LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
525
526     if( !RetValLR ) {
527       cerr << "\nNo LR for:";
528       printValue( RetVal );
529       cerr << endl;
530       assert( RetValLR && "ERR:No LR for non-void return value");
531       //return;
532     }
533
534     unsigned RegClassID = (RetValLR->getRegClass())->getID();    
535     bool recvCorrectColor = false;
536
537     unsigned CorrectCol;                // correct color for ret value
538     if(RegClassID == IntRegClassID)
539       CorrectCol = SparcIntRegOrder::o0;
540     else if(RegClassID == FloatRegClassID)
541       CorrectCol = SparcFloatRegOrder::f0;
542     else {
543       assert( 0 && "Unknown RegClass");
544       return;
545     }
546
547     // if the LR received the correct color, NOTHING to do
548
549     if(  RetValLR->hasColor() )
550       if( RetValLR->getColor() == CorrectCol )
551         recvCorrectColor = true;
552
553
554     // if we didn't receive the correct color for some reason, 
555     // put copy instruction
556     
557     if( !recvCorrectColor ) {
558
559       unsigned RegType = getRegType( RetValLR );
560
561       // the  reg that LR must be colored with 
562       unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);   
563       
564       if( RetValLR->hasColor() ) {
565         
566         unsigned 
567           UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
568         
569         // the return value is coming in UniRetReg but has to go into
570         // the UniRetLRReg
571
572         AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );  
573
574       } // if LR has color
575       else {
576
577         // if the LR did NOT receive a color, we have to move the return
578         // value coming in UniRetReg to the stack pos of spilled LR
579         
580         AdMI =  cpReg2MemMI(UniRetReg, getFramePointer(), 
581                             RetValLR->getSpillOffFromFP(), RegType );
582       }
583
584       CallAI->InstrnsAfter.push_back( AdMI );
585       
586     } // the LR didn't receive the suggested color  
587     
588   } // if there a return value
589   
590
591   // Now color all args of the call instruction
592
593   vector <MachineInstr *> AddedInstrnsBefore;
594
595   unsigned NumOfCallArgs =  getCallInstNumArgs( CallMI );
596
597   for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
598
599     const Value *CallArg = CallMI->getImplicitRef(i);
600
601     // get the LR of call operand (parameter)
602     LiveRange *const LR = LRI.getLiveRangeForValue(CallArg); 
603
604     unsigned RegType = getRegType( CallArg );
605     unsigned RegClassID =  getRegClassIDOfValue( CallArg);
606     
607     // find whether this argument is coming in a register (if not, on stack)
608
609     bool isArgInReg = false;
610     unsigned UniArgReg = InvalidRegNum;  // reg that LR must be colored with
611
612     if( (RegType== IntRegType && argNo <  NumOfIntArgRegs)) {
613       isArgInReg = true;
614       UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
615     }
616     else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs)  { 
617       isArgInReg = true;
618       UniArgReg = getUnifiedRegNum(RegClassID, 
619                                    SparcFloatRegOrder::f0 + (argNo*2 + 1) );
620     }
621     else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs)  { 
622       isArgInReg = true;
623       UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
624     }
625
626
627     // not possible to have a null LR since all args (even consts)  
628     // must be defined before
629     if( !LR ) {          
630       if( DEBUG_RA) {
631         cerr << " ERROR: In call instr, no LR for arg:  " ;
632         printValue(CallArg); cerr << endl;
633       }
634       assert(0 && "NO LR for call arg");  
635       // continue;
636     }
637
638
639     // if the LR received the suggested color, NOTHING to do
640
641
642     if( LR->hasColor() ) {
643
644
645       unsigned UniLRReg = getUnifiedRegNum( RegClassID,  LR->getColor() );
646
647       // if LR received the correct color, nothing to do
648       if( UniLRReg == UniArgReg )
649         continue;
650
651       // We are here because though the LR is allocated a register, it
652       // was not allocated the suggested register. So, we have to copy %ix reg 
653       // (or stack pos of arg) to the register it was colored with
654
655       // the LR is colored with UniLRReg but has to go into  UniArgReg
656       // to pass it as an argument
657
658       if( isArgInReg ) {
659         AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
660         AddedInstrnsBefore.push_back( AdMI ); 
661       }
662       
663       else {
664         // Now, we have to pass the arg on stack. Since LR received a register
665         // we just have to move that register to the stack position where
666         // the argument must be passed
667
668         int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType()); 
669
670         AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
671
672         // Now add the instruction. We can directly add to
673         // CallAI->InstrnsBefore since we are just saving a reg on stack
674         //
675         CallAI->InstrnsBefore.push_back( AdMI ); 
676
677         //cerr << "\nCaution: Passing a reg on stack";
678       }
679
680
681     }
682
683     else {                          // LR is not colored (i.e., spilled)      
684       
685       if( isArgInReg ) {
686
687         // Now the LR did NOT recieve a register but has a stack poistion.
688         // Since, the outgoing arg goes in a register we just have to insert
689         // a load instruction to load the LR to outgoing register
690
691
692         AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
693                            UniArgReg, RegType );
694         
695         cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
696         AddedInstrnsBefore.push_back( AdMI );  // Now add the instruction
697       }
698       
699       else {
700         // Now, we have to pass the arg on stack. Since LR  also did NOT
701         // receive a register we have to move an argument in memory to 
702         // outgoing parameter on stack.
703         
704         // Optoimize: Optimize when reverse pointers in MahineInstr are
705         // introduced. 
706         // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
707         // fails, then use the following code. Currently, we cannot call the
708         // above method since we cannot find LVSetBefore without the BB 
709         
710         int TReg = PRA.getRegNotUsedByThisInst( LR->getRegClass(), CallMI );
711
712     /**** NOTE: THIS SHOULD USE THE RIGHT SIZE FOR THE REG BEING PUSHED ****/
713         int TmpOff = PRA.mcInfo.pushTempValue(target, 8);
714                           // target.findOptimalStorageSize(LR->getType()));
715         
716         int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType()); 
717         
718         MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
719         
720         // Sequence:
721         // (1) Save TReg on stack    
722         // (2) Load LR value into TReg from stack pos of LR
723         // (3) Store Treg on outgoing Arg pos on stack
724         // (4) Load the old value of TReg from stack to TReg (restore it)
725
726         Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
727         Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), 
728                           TReg, RegType ); 
729         Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
730         Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType ); 
731
732         // We directly add to CallAI->InstrnsBefore instead of adding to
733         // AddedInstrnsBefore since these instructions must not be
734         // reordered.
735         
736         CallAI->InstrnsBefore.push_back( Ad1 );  
737         CallAI->InstrnsBefore.push_back( Ad2 );  
738         CallAI->InstrnsBefore.push_back( Ad3 );  
739         CallAI->InstrnsBefore.push_back( Ad4 );  
740
741         cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
742       }
743
744     }
745
746   }  // for each parameter in call instruction
747
748
749   // if we added any instruction before the call instruction, verify
750   // that they are in the proper order and if not, reorder them
751
752   if( ! AddedInstrnsBefore.empty() ) {
753
754     if( DEBUG_RA  ) {
755       cerr << "\nCalling reorder with instrns: \n";
756       for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
757         cerr  << *(AddedInstrnsBefore[i]);
758     }
759
760     vector <MachineInstr *> TmpVec;
761     OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
762
763     if( DEBUG_RA   ) {
764       cerr << "\nAfter reordering instrns: \n";
765       for(unsigned i=0; i < TmpVec.size(); i++)
766         cerr << *(TmpVec[i]);
767     }
768
769     // copy the results back from TmpVec to InstrnsBefore
770     for(unsigned i=0; i < TmpVec.size(); i++)
771       CallAI->InstrnsBefore.push_back( TmpVec[i] );
772   }
773
774
775   // Reset optional args area again to be safe
776   PRA.mcInfo.resetOptionalArgs(target);
777   
778   
779 }
780
781 //---------------------------------------------------------------------------
782 // This method is called for an LLVM return instruction to identify which
783 // values will be returned from this method and to suggest colors.
784 //---------------------------------------------------------------------------
785 void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI, 
786                                              LiveRangeInfo& LRI) const {
787
788   assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
789
790     suggestReg4RetAddr(RetMI, LRI);
791
792   // if there is an implicit ref, that has to be the ret value
793   if(  RetMI->getNumImplicitRefs() > 0 ) {
794
795     // The first implicit operand is the return value of a return instr
796     const Value *RetVal =  RetMI->getImplicitRef(0);
797
798     MachineInstr *AdMI;
799     LiveRange *const LR = LRI.getLiveRangeForValue( RetVal ); 
800
801     if( !LR ) {
802      cerr << "\nNo LR for:";
803      printValue( RetVal );
804      cerr << endl;
805      assert( LR && "No LR for return value of non-void method");
806      //return;
807    }
808
809     unsigned RegClassID = (LR->getRegClass())->getID();
810       
811     if( RegClassID == IntRegClassID ) 
812       LR->setSuggestedColor(SparcIntRegOrder::i0);
813     
814     else if ( RegClassID == FloatRegClassID ) 
815       LR->setSuggestedColor(SparcFloatRegOrder::f0);
816       
817   }
818
819 }
820
821
822
823 //---------------------------------------------------------------------------
824 // Colors the return value of a method to %i0 or %f0, if possible. If it is
825 // not possilbe to directly color the LR, insert a copy instruction to move
826 // the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we 
827 // have to put a load instruction.
828 //---------------------------------------------------------------------------
829 void UltraSparcRegInfo::colorRetValue(const  MachineInstr *const RetMI, 
830                                       LiveRangeInfo& LRI,
831                                       AddedInstrns *const RetAI) const {
832
833   assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
834
835   // if there is an implicit ref, that has to be the ret value
836   if(  RetMI->getNumImplicitRefs() > 0 ) {
837
838     // The first implicit operand is the return value of a return instr
839     const Value *RetVal =  RetMI->getImplicitRef(0);
840
841     MachineInstr *AdMI;
842     LiveRange *const LR = LRI.getLiveRangeForValue( RetVal ); 
843
844     if( ! LR ) {
845         cerr << "\nNo LR for:";
846         printValue( RetVal );
847         cerr << endl;
848         // assert( LR && "No LR for return value of non-void method");
849         return;
850     }
851
852     unsigned RegClassID =  getRegClassIDOfValue(RetVal);
853     unsigned RegType = getRegType( RetVal );
854
855     unsigned CorrectCol;
856     if(RegClassID == IntRegClassID)
857       CorrectCol = SparcIntRegOrder::i0;
858     else if(RegClassID == FloatRegClassID)
859       CorrectCol = SparcFloatRegOrder::f0;
860     else {
861       assert( 0 && "Unknown RegClass");
862       return;
863     }
864
865     // if the LR received the correct color, NOTHING to do
866
867     if(  LR->hasColor() )
868       if( LR->getColor() == CorrectCol )
869         return;
870
871     unsigned UniRetReg =  getUnifiedRegNum( RegClassID, CorrectCol );
872
873     if( LR->hasColor() ) {
874
875       // We are here because the LR was allocted a regiter
876       // It may be the suggested register or not
877
878       // copy the LR of retun value to i0 or f0
879
880       unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
881
882       // the LR received  UniLRReg but must be colored with UniRetReg
883       // to pass as the return value
884
885       AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType); 
886       RetAI->InstrnsBefore.push_back( AdMI );
887     }
888     else {                              // if the LR is spilled
889
890       AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), 
891                          UniRetReg, RegType); 
892       RetAI->InstrnsBefore.push_back( AdMI );
893       cout << "\nCopied the return value from stack";
894     }
895   
896   } // if there is a return value
897
898 }
899
900
901 //---------------------------------------------------------------------------
902 // Copy from a register to register. Register number must be the unified
903 // register number
904 //---------------------------------------------------------------------------
905
906 MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg, 
907                                               const unsigned DestReg,
908                                               const int RegType) const {
909
910   assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
911           "Invalid Register");
912   
913   MachineInstr * MI = NULL;
914
915   switch( RegType ) {
916     
917   case IntRegType:
918   case IntCCRegType:
919   case FloatCCRegType: 
920     MI = new MachineInstr(ADD, 3);
921     MI->SetMachineOperand(0, SrcReg, false);
922     MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
923     MI->SetMachineOperand(2, DestReg, true);
924     break;
925
926   case FPSingleRegType:
927     MI = new MachineInstr(FMOVS, 2);
928     MI->SetMachineOperand(0, SrcReg, false);
929     MI->SetMachineOperand(1, DestReg, true);
930     break;
931
932   case FPDoubleRegType:
933     MI = new MachineInstr(FMOVD, 2);
934     MI->SetMachineOperand(0, SrcReg, false);    
935     MI->SetMachineOperand(1, DestReg, true);
936     break;
937
938   default:
939     assert(0 && "Unknow RegType");
940   }
941
942   return MI;
943 }
944
945
946 //---------------------------------------------------------------------------
947 // Copy from a register to memory (i.e., Store). Register number must 
948 // be the unified register number
949 //---------------------------------------------------------------------------
950
951
952 MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg, 
953                                               const unsigned DestPtrReg,
954                                               const int Offset,
955                                               const int RegType) const {
956
957
958   MachineInstr * MI = NULL;
959
960   switch( RegType ) {
961     
962   case IntRegType:
963   case FloatCCRegType: 
964     MI = new MachineInstr(STX, 3);
965     MI->SetMachineOperand(0, SrcReg, false);
966     MI->SetMachineOperand(1, DestPtrReg, false);
967     MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed, 
968                           (int64_t) Offset, false);
969     break;
970
971   case FPSingleRegType:
972     MI = new MachineInstr(ST, 3);
973     MI->SetMachineOperand(0, SrcReg, false);
974     MI->SetMachineOperand(1, DestPtrReg, false);
975     MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed, 
976                           (int64_t) Offset, false);
977     break;
978
979   case FPDoubleRegType:
980     MI = new MachineInstr(STD, 3);
981     MI->SetMachineOperand(0, SrcReg, false);
982     MI->SetMachineOperand(1, DestPtrReg, false);
983     MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed, 
984                           (int64_t) Offset, false);
985     break;
986
987   case IntCCRegType:
988     assert( 0 && "Cannot directly store %ccr to memory");
989     
990   default:
991     assert(0 && "Unknow RegType in cpReg2MemMI");
992   }
993
994   return MI;
995 }
996
997
998 //---------------------------------------------------------------------------
999 // Copy from memory to a reg (i.e., Load) Register number must be the unified
1000 // register number
1001 //---------------------------------------------------------------------------
1002
1003
1004 MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg, 
1005                                               const int Offset,
1006                                               const unsigned DestReg,
1007                                               const int RegType) const {
1008   
1009   MachineInstr * MI = NULL;
1010
1011   switch( RegType ) {
1012     
1013   case IntRegType:
1014   case FloatCCRegType: 
1015     MI = new MachineInstr(LDX, 3);
1016     MI->SetMachineOperand(0, SrcPtrReg, false);
1017     MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed, 
1018                           (int64_t) Offset, false);
1019     MI->SetMachineOperand(2, DestReg, true);
1020     break;
1021
1022   case FPSingleRegType:
1023     MI = new MachineInstr(LD, 3);
1024     MI->SetMachineOperand(0, SrcPtrReg, false);
1025     MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed, 
1026                           (int64_t) Offset, false);
1027     MI->SetMachineOperand(2, DestReg, true);
1028
1029     break;
1030
1031   case FPDoubleRegType:
1032     MI = new MachineInstr(LDD, 3);
1033     MI->SetMachineOperand(0, SrcPtrReg, false);
1034     MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed, 
1035                           (int64_t) Offset, false);
1036     MI->SetMachineOperand(2, DestReg, true);
1037     break;
1038
1039   case IntCCRegType:
1040     assert( 0 && "Cannot directly load into %ccr from memory");
1041
1042   default:
1043     assert(0 && "Unknown RegType in cpMem2RegMI");
1044   }
1045
1046   return MI;
1047 }
1048
1049
1050
1051
1052
1053 //---------------------------------------------------------------------------
1054 // Generate a copy instruction to copy a value to another. Temporarily
1055 // used by PhiElimination code.
1056 //---------------------------------------------------------------------------
1057
1058
1059 MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1060
1061   int RegType = getRegType( Src );
1062
1063   assert( (RegType==getRegType(Src))  && "Src & Dest are diff types");
1064
1065   MachineInstr * MI = NULL;
1066
1067   switch( RegType ) {
1068     
1069   case IntRegType:
1070
1071     MI = new MachineInstr(ADD, 3);
1072     MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1073     MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1074     MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1075     break;
1076
1077   case FPSingleRegType:
1078     MI = new MachineInstr(FMOVS, 2);
1079     MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1080     MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1081     break;
1082
1083
1084   case FPDoubleRegType:
1085     MI = new MachineInstr(FMOVD, 2);
1086     MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1087     MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1088     break;
1089
1090   default:
1091     assert(0 && "Unknow RegType in CpValu2Value");
1092   }
1093
1094   return MI;
1095 }
1096
1097
1098
1099
1100
1101
1102 //----------------------------------------------------------------------------
1103 // This method inserts caller saving/restoring instructons before/after
1104 // a call machine instruction.
1105 //----------------------------------------------------------------------------
1106
1107
1108 void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst, 
1109                                                const BasicBlock *BB,
1110                                                PhyRegAlloc &PRA) const {
1111   // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
1112
1113   // Clear the temp area of the stack
1114   PRA.mcInfo.popAllTempValues(target);
1115
1116   hash_set<unsigned> PushedRegSet;
1117
1118   // Now find the LR of the return value of the call
1119   // The last *implicit operand* is the return value of a call
1120   // Insert it to to he PushedRegSet since we must not save that register
1121   // and restore it after the call.
1122   // We do this because, we look at the LV set *after* the instruction
1123   // to determine, which LRs must be saved across calls. The return value
1124   // of the call is live in this set - but we must not save/restore it.
1125
1126
1127   const Value *RetVal = getCallInstRetVal( MInst );
1128
1129   if( RetVal ) {
1130
1131     LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1132     assert( RetValLR && "No LR for RetValue of call");
1133
1134     if(  RetValLR->hasColor())
1135       PushedRegSet.insert(
1136          getUnifiedRegNum((RetValLR->getRegClass())->getID(), 
1137                                       RetValLR->getColor() ) );
1138   }
1139
1140
1141   const LiveVarSet *LVSetAft =  PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
1142
1143   LiveVarSet::const_iterator LIt = LVSetAft->begin();
1144
1145   // for each live var in live variable set after machine inst
1146   for( ; LIt != LVSetAft->end(); ++LIt) {
1147
1148    //  get the live range corresponding to live var
1149     LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );    
1150
1151     // LR can be null if it is a const since a const 
1152     // doesn't have a dominating def - see Assumptions above
1153     if( LR )   {  
1154       
1155       if( LR->hasColor() ) {
1156
1157         unsigned RCID = (LR->getRegClass())->getID();
1158         unsigned Color = LR->getColor();
1159
1160         if ( isRegVolatile(RCID, Color) ) {
1161
1162           // if the value is in both LV sets (i.e., live before and after 
1163           // the call machine instruction)
1164
1165           unsigned Reg = getUnifiedRegNum(RCID, Color);
1166           
1167           if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1168             
1169             // if we haven't already pushed that register
1170
1171             unsigned RegType = getRegType( LR );
1172
1173             // Now get two instructions - to push on stack and pop from stack
1174             // and add them to InstrnsBefore and InstrnsAfter of the
1175             // call instruction
1176
1177     /**** NOTE: THIS SHOULD USE THE RIGHT SIZE FOR THE REG BEING PUSHED ****/
1178             int StackOff =  PRA.mcInfo.pushTempValue(target, 8);
1179                 // target.findOptimalStorageSize(LR->getType()));
1180             
1181             MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
1182             MachineInstr *AdIBef, *AdIAft;
1183
1184
1185             //---- Insert code for pushing the reg on stack ----------
1186                   
1187             if( RegType == IntCCRegType ) {
1188
1189               // Handle IntCCRegType specially since we cannot directly 
1190               // push %ccr on to the stack
1191
1192               const LiveVarSet *LVSetBef = 
1193                 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1194
1195               // get a free INTEGER register
1196               int FreeIntReg = 
1197                 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst, 
1198                                      LVSetBef, AdIBefCC, AdIAftCC);
1199
1200               // insert the instructions in reverse order since we are
1201               // adding them to the front of InstrnsBefore
1202
1203               if(AdIAftCC)
1204                 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1205
1206               AdICpCC = cpCCR2IntMI(FreeIntReg);
1207               (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1208
1209               if(AdIBefCC)
1210                 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1211
1212               if(DEBUG_RA) {
1213                 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1214                 if(AdIBefCC) cerr << "\t" <<  *(AdIBefCC);
1215                 cerr  << "\t" << *AdICpCC;
1216                 if(AdIAftCC) cerr  << "\t" << *(AdIAftCC);
1217               }
1218
1219             } else  {  
1220               // for any other register type, just add the push inst
1221               AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
1222               ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1223             }
1224
1225
1226             //---- Insert code for popping the reg from the stack ----------
1227
1228             if( RegType == IntCCRegType ) {
1229
1230               // Handle IntCCRegType specially since we cannot directly 
1231               // pop %ccr on from the stack
1232               
1233               // get a free INT register
1234               int FreeIntReg = 
1235                 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst, 
1236                                      LVSetAft, AdIBefCC, AdIAftCC);
1237               
1238               if(AdIBefCC)
1239                 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1240
1241               AdICpCC = cpInt2CCRMI(FreeIntReg);
1242               (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1243             
1244               if(AdIAftCC)
1245                 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1246
1247               if(DEBUG_RA) {
1248
1249                 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1250                 if(AdIBefCC) cerr << "\t" <<  *(AdIBefCC);
1251                 cerr  << "\t" << *AdICpCC;
1252                 if(AdIAftCC) cerr  << "\t" << *(AdIAftCC);
1253               }
1254
1255             } else {
1256               // for any other register type, just add the pop inst
1257               AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
1258               ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
1259             }
1260             
1261             PushedRegSet.insert( Reg );
1262
1263             if(DEBUG_RA) {
1264               cerr << "\nFor call inst:" << *MInst;
1265               cerr << " -inserted caller saving instrs:\n\t ";
1266               if( RegType == IntCCRegType )
1267                 cerr << *AdIBefCC << "\t" << *AdIAftCC  ;
1268               else
1269                 cerr << *AdIBef   << "\t" << *AdIAft    ;
1270             }       
1271           } // if not already pushed
1272
1273         } // if LR has a volatile color
1274         
1275       } // if LR has color
1276
1277     } // if there is a LR for Var
1278     
1279   } // for each value in the LV set after instruction
1280   
1281   // Clear the temp area of the stack
1282   PRA.mcInfo.popAllTempValues(target);
1283
1284 }
1285
1286 //---------------------------------------------------------------------------
1287 // Copies %ccr into an integer register. IntReg is the UNIFIED register
1288 // number.
1289 //---------------------------------------------------------------------------
1290
1291 MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1292   MachineInstr * MI = NULL;
1293
1294   MI = new MachineInstr(RDCCR, 2);
1295   MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1296   MI->SetMachineOperand(1, IntReg, true);
1297
1298   return MI;
1299 }
1300
1301 //---------------------------------------------------------------------------
1302 // Copies an integer register into  %ccr. IntReg is the UNIFIED register
1303 // number.
1304 //---------------------------------------------------------------------------
1305
1306 MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1307   MachineInstr * MI = NULL;
1308
1309   MI = new MachineInstr(WRCCR, 3);
1310   MI->SetMachineOperand(0, IntReg, false);
1311   MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1312   MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1313
1314   return MI;
1315 }
1316
1317
1318
1319
1320 //---------------------------------------------------------------------------
1321 // Print the register assigned to a LR
1322 //---------------------------------------------------------------------------
1323
1324 void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1325
1326   unsigned RegClassID = (LR->getRegClass())->getID();
1327
1328   cerr << " *Node " << (LR->getUserIGNode())->getIndex();
1329
1330   if( ! LR->hasColor() ) {
1331     cerr << " - could not find a color" << endl;
1332     return;
1333   }
1334   
1335   // if a color is found
1336
1337   cerr << " colored with color "<< LR->getColor();
1338
1339   if( RegClassID == IntRegClassID ) {
1340
1341     cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1342     cerr << "]" << endl;
1343   }
1344   else if ( RegClassID == FloatRegClassID) {
1345     cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
1346     if( LR->getTypeID() == Type::DoubleTyID )
1347       cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1348     cerr << "]" << endl;
1349   }
1350 }
1351
1352 //---------------------------------------------------------------------------
1353 // This method examines instructions inserted by RegAlloc code before a
1354 // machine instruction to detect invalid orders that destroy values before
1355 // they are used. If it detects such conditions, it reorders the instructions.
1356 //
1357 // The unordered instructions come in the UnordVec. These instructions are
1358 // instructions inserted by RegAlloc. All such instruction MUST have 
1359 // their USES BEFORE THE DEFS after reordering.
1360
1361 // The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1362 // this method is called.
1363
1364 // This method uses two vectors for efficiency in accessing
1365
1366 // Since instructions are inserted in RegAlloc, this assumes that the 
1367 // first operand is the source reg and the last operand is the dest reg.
1368
1369 // All the uses are before THE def to a register
1370
1371
1372 //---------------------------------------------------------------------------
1373 void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec, 
1374                                            vector<MachineInstr *> &OrdVec,
1375                                            PhyRegAlloc &PRA) const{
1376
1377   /*
1378     Problem: We can have instructions inserted by RegAlloc like
1379     1. add %ox %g0 %oy
1380     2. add %oy %g0 %oz, where z!=x or z==x
1381
1382     This is wrong since %oy used by 2 is overwritten by 1
1383   
1384     Solution:
1385     We re-order the instructions so that the uses are before the defs
1386
1387     Algorithm:
1388     
1389     do
1390       for each instruction 'DefInst' in the UnOrdVec
1391          for each instruction 'UseInst' that follows the DefInst
1392            if the reg defined by DefInst is used by UseInst
1393              mark DefInst as not movable in this iteration
1394          If DefInst is not marked as not-movable, move DefInst to OrdVec
1395     while all instructions in DefInst are moved to OrdVec
1396     
1397     For moving, we call the move2OrdVec(). It checks whether there is a def
1398     in it for the uses in the instruction to be added to OrdVec. If there
1399     are no preceding defs, it just appends the instruction. If there is a
1400     preceding def, it puts two instructions to save the reg on stack before
1401     the load and puts a restore at use.
1402
1403   */
1404
1405
1406   bool CouldMoveAll;
1407   bool DebugPrint = false;
1408
1409   do {
1410
1411     CouldMoveAll = true;
1412
1413     vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
1414
1415     for( ; DefIt !=  UnordVec.end(); ++DefIt ) {
1416
1417       // for each instruction in the UnordVec do ...
1418
1419       MachineInstr *DefInst = *DefIt;
1420
1421       if( DefInst == NULL) continue;
1422
1423       //cerr << "\nInst in UnordVec = " <<  *DefInst;
1424       
1425       // last operand is the def (unless for a store which has no def reg)
1426       MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1427       
1428       if( DefOp.opIsDef() &&  
1429           DefOp.getOperandType() ==  MachineOperand::MO_MachineRegister) {
1430         
1431         // If the operand in DefInst is a def ...
1432         
1433         bool DefEqUse = false;
1434         
1435         vector<MachineInstr *>::iterator UseIt = DefIt;
1436         UseIt++;
1437         
1438         for( ; UseIt !=  UnordVec.end(); ++UseIt ) {
1439
1440           MachineInstr *UseInst = *UseIt;
1441           if( UseInst == NULL) continue;
1442           
1443           // for each inst (UseInst) that is below the DefInst do ...
1444           
1445
1446           MachineOperand& UseOp = UseInst->getOperand(0);
1447           
1448           if( ! UseOp.opIsDef() &&  
1449               UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1450             
1451             // if use is a register ...
1452             
1453             if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1454               
1455               // if Def and this use are the same, it means that this use
1456               // is destroyed by a def before it is used
1457               
1458               // cerr << "\nCouldn't move " << *DefInst;
1459
1460               DefEqUse = true;
1461               CouldMoveAll = false;     
1462               DebugPrint = true;
1463               break;
1464             } // if two registers are equal
1465             
1466           } // if use is a register
1467           
1468         }// for all use instructions
1469         
1470         if( ! DefEqUse ) {
1471           
1472           // after examining all the instructions that follow the DefInst
1473           // if there are no dependencies, we can move it to the OrdVec
1474
1475           // cerr << "Moved to Ord: " << *DefInst;
1476
1477           moveInst2OrdVec(OrdVec, DefInst, PRA);
1478
1479           //OrdVec.push_back(DefInst);
1480
1481           // mark the pos of DefInst with NULL to indicate that it is
1482           // empty
1483           *DefIt = NULL;
1484         }
1485     
1486       } // if Def is a machine register
1487       
1488     } // for all instructions in the UnordVec
1489     
1490
1491   } while( !CouldMoveAll);
1492
1493
1494   if(DebugPrint) {
1495     cerr << "\nAdded instructions were reordered to:\n";
1496     for(unsigned int i=0; i < OrdVec.size(); i++)
1497       cerr << *(OrdVec[i]);
1498   }
1499
1500 }
1501
1502
1503
1504
1505
1506
1507
1508
1509 void UltraSparcRegInfo::moveInst2OrdVec(vector<MachineInstr *> &OrdVec,
1510                                         MachineInstr *UnordInst,
1511                                         PhyRegAlloc &PRA ) const {
1512
1513   MachineOperand& UseOp = UnordInst->getOperand(0);
1514
1515   if( ! UseOp.opIsDef() &&  
1516       UseOp.getOperandType() ==  MachineOperand::MO_MachineRegister) {
1517
1518     // for the use of UnordInst, see whether there is a defining instr
1519     // before in the OrdVec
1520     bool DefEqUse = false;
1521
1522     vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1523   
1524     for( ; OrdIt !=  OrdVec.end(); ++OrdIt ) {
1525
1526       MachineInstr *OrdInst = *OrdIt ;
1527
1528       MachineOperand& DefOp = 
1529         OrdInst->getOperand(OrdInst->getNumOperands()-1);
1530
1531       if( DefOp.opIsDef() &&  
1532           DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1533
1534         //cerr << "\nDefining Ord Inst: " <<  *OrdInst;
1535           
1536         if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1537
1538           // we are here because there is a preceding def in the OrdVec 
1539           // for the use in this intr we are going to insert. This
1540           // happened because the original code was like:
1541           // 1. add %ox %g0 %oy
1542           // 2. add %oy %g0 %ox
1543           // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1544           // Now we are processing %ox of 1.
1545           // We have to 
1546               
1547           const int UReg = DefOp.getMachineRegNum();
1548           const int RegType = getRegType(UReg);
1549           MachineInstr *AdIBef, *AdIAft;
1550               
1551           // TODO: Change 8 below
1552     /**** NOTE: THIS SHOULD USE THE RIGHT SIZE FOR THE REG BEING PUSHED ****/
1553           const int StackOff =  PRA.mcInfo.pushTempValue(target, 8);
1554           
1555           // Save the UReg (%ox) on stack before it's destroyed
1556           AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
1557           OrdIt = OrdVec.insert( OrdIt, AdIBef);
1558           OrdIt++;  // points to current instr we processed
1559           
1560           // Load directly into DReg (%oy)
1561           MachineOperand&  DOp=
1562             (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1563           assert(DOp.opIsDef() && "Last operand is not the def");
1564           const int DReg = DOp.getMachineRegNum();
1565           
1566           AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
1567           OrdVec.push_back(AdIAft);
1568             
1569           cerr << "\nFixed CIRCULAR references by reordering";
1570
1571           if( DEBUG_RA ) {
1572             cerr << "\nBefore CIRCULAR Reordering:\n";
1573             cerr << *UnordInst;
1574             cerr << *OrdInst;
1575           
1576             cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1577             for(unsigned i=0; i < OrdVec.size(); i++)
1578               cerr << *(OrdVec[i]);
1579           }
1580           
1581           // Do not copy the UseInst to OrdVec
1582           DefEqUse = true;
1583           break;  
1584           
1585         }// if two registers are equal
1586
1587       } // if Def is a register
1588
1589     } // for each instr in OrdVec
1590
1591     if( !DefEqUse ) {  
1592
1593       // We didn't find a def in the OrdVec, so just append this inst
1594       OrdVec.push_back( UnordInst );  
1595       //cerr << "Reordered Inst (Moved Dn): " <<  *UnordInst;
1596     }
1597     
1598   }// if the operand in UnordInst is a use
1599  
1600 }
1601
1602
1603
1604
1605
1606