16e3b9f038093883840973d48f567951194e05c0
[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         int TmpOff = PRA.mcInfo.pushTempValue(target,
713                               target.findOptimalStorageSize(LR->getType()));
714                   // getStackOffsets().getNewTmpPosOffFromFP();
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             int StackOff =  PRA.mcInfo.pushTempValue(target,
1178                               target.findOptimalStorageSize(LR->getType()));
1179             
1180             MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
1181             MachineInstr *AdIBef, *AdIAft;
1182
1183
1184             //---- Insert code for pushing the reg on stack ----------
1185                   
1186             if( RegType == IntCCRegType ) {
1187
1188               // Handle IntCCRegType specially since we cannot directly 
1189               // push %ccr on to the stack
1190
1191               const LiveVarSet *LVSetBef = 
1192                 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1193
1194               // get a free INTEGER register
1195               int FreeIntReg = 
1196                 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst, 
1197                                      LVSetBef, AdIBefCC, AdIAftCC);
1198
1199               // insert the instructions in reverse order since we are
1200               // adding them to the front of InstrnsBefore
1201
1202               if(AdIAftCC)
1203                 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1204
1205               AdICpCC = cpCCR2IntMI(FreeIntReg);
1206               (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1207
1208               if(AdIBefCC)
1209                 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1210
1211               if(DEBUG_RA) {
1212                 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1213                 if(AdIBefCC) cerr << "\t" <<  *(AdIBefCC);
1214                 cerr  << "\t" << *AdICpCC;
1215                 if(AdIAftCC) cerr  << "\t" << *(AdIAftCC);
1216               }
1217
1218             } else  {  
1219               // for any other register type, just add the push inst
1220               AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
1221               ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1222             }
1223
1224
1225             //---- Insert code for popping the reg from the stack ----------
1226
1227             if( RegType == IntCCRegType ) {
1228
1229               // Handle IntCCRegType specially since we cannot directly 
1230               // pop %ccr on from the stack
1231               
1232               // get a free INT register
1233               int FreeIntReg = 
1234                 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst, 
1235                                      LVSetAft, AdIBefCC, AdIAftCC);
1236               
1237               if(AdIBefCC)
1238                 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1239
1240               AdICpCC = cpInt2CCRMI(FreeIntReg);
1241               (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1242             
1243               if(AdIAftCC)
1244                 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1245
1246               if(DEBUG_RA) {
1247
1248                 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1249                 if(AdIBefCC) cerr << "\t" <<  *(AdIBefCC);
1250                 cerr  << "\t" << *AdICpCC;
1251                 if(AdIAftCC) cerr  << "\t" << *(AdIAftCC);
1252               }
1253
1254             } else {
1255               // for any other register type, just add the pop inst
1256               AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
1257               ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
1258             }
1259             
1260             PushedRegSet.insert( Reg );
1261
1262             if(DEBUG_RA) {
1263               cerr << "\nFor call inst:" << *MInst;
1264               cerr << " -inserted caller saving instrs:\n\t ";
1265               if( RegType == IntCCRegType )
1266                 cerr << *AdIBefCC << "\t" << *AdIAftCC  ;
1267               else
1268                 cerr << *AdIBef   << "\t" << *AdIAft    ;
1269             }       
1270           } // if not already pushed
1271
1272         } // if LR has a volatile color
1273         
1274       } // if LR has color
1275
1276     } // if there is a LR for Var
1277     
1278   } // for each value in the LV set after instruction
1279   
1280   // Clear the temp area of the stack
1281   PRA.mcInfo.popAllTempValues(target);
1282
1283 }
1284
1285 //---------------------------------------------------------------------------
1286 // Copies %ccr into an integer register. IntReg is the UNIFIED register
1287 // number.
1288 //---------------------------------------------------------------------------
1289
1290 MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1291   MachineInstr * MI = NULL;
1292
1293   MI = new MachineInstr(RDCCR, 2);
1294   MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1295   MI->SetMachineOperand(1, IntReg, true);
1296
1297   return MI;
1298 }
1299
1300 //---------------------------------------------------------------------------
1301 // Copies an integer register into  %ccr. IntReg is the UNIFIED register
1302 // number.
1303 //---------------------------------------------------------------------------
1304
1305 MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1306   MachineInstr * MI = NULL;
1307
1308   MI = new MachineInstr(WRCCR, 3);
1309   MI->SetMachineOperand(0, IntReg, false);
1310   MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1311   MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1312
1313   return MI;
1314 }
1315
1316
1317
1318
1319 //---------------------------------------------------------------------------
1320 // Print the register assigned to a LR
1321 //---------------------------------------------------------------------------
1322
1323 void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1324
1325   unsigned RegClassID = (LR->getRegClass())->getID();
1326
1327   cerr << " *Node " << (LR->getUserIGNode())->getIndex();
1328
1329   if( ! LR->hasColor() ) {
1330     cerr << " - could not find a color" << endl;
1331     return;
1332   }
1333   
1334   // if a color is found
1335
1336   cerr << " colored with color "<< LR->getColor();
1337
1338   if( RegClassID == IntRegClassID ) {
1339
1340     cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1341     cerr << "]" << endl;
1342   }
1343   else if ( RegClassID == FloatRegClassID) {
1344     cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
1345     if( LR->getTypeID() == Type::DoubleTyID )
1346       cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1347     cerr << "]" << endl;
1348   }
1349 }
1350
1351 //---------------------------------------------------------------------------
1352 // This method examines instructions inserted by RegAlloc code before a
1353 // machine instruction to detect invalid orders that destroy values before
1354 // they are used. If it detects such conditions, it reorders the instructions.
1355 //
1356 // The unordered instructions come in the UnordVec. These instructions are
1357 // instructions inserted by RegAlloc. All such instruction MUST have 
1358 // their USES BEFORE THE DEFS after reordering.
1359
1360 // The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1361 // this method is called.
1362
1363 // This method uses two vectors for efficiency in accessing
1364
1365 // Since instructions are inserted in RegAlloc, this assumes that the 
1366 // first operand is the source reg and the last operand is the dest reg.
1367
1368 // All the uses are before THE def to a register
1369
1370
1371 //---------------------------------------------------------------------------
1372 void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec, 
1373                                            vector<MachineInstr *> &OrdVec,
1374                                            PhyRegAlloc &PRA) const{
1375
1376   /*
1377     Problem: We can have instructions inserted by RegAlloc like
1378     1. add %ox %g0 %oy
1379     2. add %oy %g0 %oz, where z!=x or z==x
1380
1381     This is wrong since %oy used by 2 is overwritten by 1
1382   
1383     Solution:
1384     We re-order the instructions so that the uses are before the defs
1385
1386     Algorithm:
1387     
1388     do
1389       for each instruction 'DefInst' in the UnOrdVec
1390          for each instruction 'UseInst' that follows the DefInst
1391            if the reg defined by DefInst is used by UseInst
1392              mark DefInst as not movable in this iteration
1393          If DefInst is not marked as not-movable, move DefInst to OrdVec
1394     while all instructions in DefInst are moved to OrdVec
1395     
1396     For moving, we call the move2OrdVec(). It checks whether there is a def
1397     in it for the uses in the instruction to be added to OrdVec. If there
1398     are no preceding defs, it just appends the instruction. If there is a
1399     preceding def, it puts two instructions to save the reg on stack before
1400     the load and puts a restore at use.
1401
1402   */
1403
1404
1405   bool CouldMoveAll;
1406   bool DebugPrint = false;
1407
1408   do {
1409
1410     CouldMoveAll = true;
1411
1412     vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
1413
1414     for( ; DefIt !=  UnordVec.end(); ++DefIt ) {
1415
1416       // for each instruction in the UnordVec do ...
1417
1418       MachineInstr *DefInst = *DefIt;
1419
1420       if( DefInst == NULL) continue;
1421
1422       //cerr << "\nInst in UnordVec = " <<  *DefInst;
1423       
1424       // last operand is the def (unless for a store which has no def reg)
1425       MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1426       
1427       if( DefOp.opIsDef() &&  
1428           DefOp.getOperandType() ==  MachineOperand::MO_MachineRegister) {
1429         
1430         // If the operand in DefInst is a def ...
1431         
1432         bool DefEqUse = false;
1433         
1434         vector<MachineInstr *>::iterator UseIt = DefIt;
1435         UseIt++;
1436         
1437         for( ; UseIt !=  UnordVec.end(); ++UseIt ) {
1438
1439           MachineInstr *UseInst = *UseIt;
1440           if( UseInst == NULL) continue;
1441           
1442           // for each inst (UseInst) that is below the DefInst do ...
1443           
1444
1445           MachineOperand& UseOp = UseInst->getOperand(0);
1446           
1447           if( ! UseOp.opIsDef() &&  
1448               UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1449             
1450             // if use is a register ...
1451             
1452             if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1453               
1454               // if Def and this use are the same, it means that this use
1455               // is destroyed by a def before it is used
1456               
1457               // cerr << "\nCouldn't move " << *DefInst;
1458
1459               DefEqUse = true;
1460               CouldMoveAll = false;     
1461               DebugPrint = true;
1462               break;
1463             } // if two registers are equal
1464             
1465           } // if use is a register
1466           
1467         }// for all use instructions
1468         
1469         if( ! DefEqUse ) {
1470           
1471           // after examining all the instructions that follow the DefInst
1472           // if there are no dependencies, we can move it to the OrdVec
1473
1474           // cerr << "Moved to Ord: " << *DefInst;
1475
1476           moveInst2OrdVec(OrdVec, DefInst, PRA);
1477
1478           //OrdVec.push_back(DefInst);
1479
1480           // mark the pos of DefInst with NULL to indicate that it is
1481           // empty
1482           *DefIt = NULL;
1483         }
1484     
1485       } // if Def is a machine register
1486       
1487     } // for all instructions in the UnordVec
1488     
1489
1490   } while( !CouldMoveAll);
1491
1492
1493   if(DebugPrint) {
1494     cerr << "\nAdded instructions were reordered to:\n";
1495     for(unsigned int i=0; i < OrdVec.size(); i++)
1496       cerr << *(OrdVec[i]);
1497   }
1498
1499 }
1500
1501
1502
1503
1504
1505
1506
1507
1508 void UltraSparcRegInfo::moveInst2OrdVec(vector<MachineInstr *> &OrdVec,
1509                                         MachineInstr *UnordInst,
1510                                         PhyRegAlloc &PRA ) const {
1511
1512   MachineOperand& UseOp = UnordInst->getOperand(0);
1513
1514   if( ! UseOp.opIsDef() &&  
1515       UseOp.getOperandType() ==  MachineOperand::MO_MachineRegister) {
1516
1517     // for the use of UnordInst, see whether there is a defining instr
1518     // before in the OrdVec
1519     bool DefEqUse = false;
1520
1521     vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1522   
1523     for( ; OrdIt !=  OrdVec.end(); ++OrdIt ) {
1524
1525       MachineInstr *OrdInst = *OrdIt ;
1526
1527       MachineOperand& DefOp = 
1528         OrdInst->getOperand(OrdInst->getNumOperands()-1);
1529
1530       if( DefOp.opIsDef() &&  
1531           DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1532
1533         //cerr << "\nDefining Ord Inst: " <<  *OrdInst;
1534           
1535         if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1536
1537           // we are here because there is a preceding def in the OrdVec 
1538           // for the use in this intr we are going to insert. This
1539           // happened because the original code was like:
1540           // 1. add %ox %g0 %oy
1541           // 2. add %oy %g0 %ox
1542           // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1543           // Now we are processing %ox of 1.
1544           // We have to 
1545               
1546           const int UReg = DefOp.getMachineRegNum();
1547           const int RegType = getRegType(UReg);
1548           MachineInstr *AdIBef, *AdIAft;
1549               
1550           // TODO: Change 8 below
1551           const int StackOff =  PRA.mcInfo.pushTempValue(target, 8);
1552           
1553           // Save the UReg (%ox) on stack before it's destroyed
1554           AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
1555           OrdIt = OrdVec.insert( OrdIt, AdIBef);
1556           OrdIt++;  // points to current instr we processed
1557           
1558           // Load directly into DReg (%oy)
1559           MachineOperand&  DOp=
1560             (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1561           assert(DOp.opIsDef() && "Last operand is not the def");
1562           const int DReg = DOp.getMachineRegNum();
1563           
1564           AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
1565           OrdVec.push_back(AdIAft);
1566             
1567           cerr << "\nFixed CIRCULAR references by reordering";
1568
1569           if( DEBUG_RA ) {
1570             cerr << "\nBefore CIRCULAR Reordering:\n";
1571             cerr << *UnordInst;
1572             cerr << *OrdInst;
1573           
1574             cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1575             for(unsigned i=0; i < OrdVec.size(); i++)
1576               cerr << *(OrdVec[i]);
1577           }
1578           
1579           // Do not copy the UseInst to OrdVec
1580           DefEqUse = true;
1581           break;  
1582           
1583         }// if two registers are equal
1584
1585       } // if Def is a register
1586
1587     } // for each instr in OrdVec
1588
1589     if( !DefEqUse ) {  
1590
1591       // We didn't find a def in the OrdVec, so just append this inst
1592       OrdVec.push_back( UnordInst );  
1593       //cerr << "Reordered Inst (Moved Dn): " <<  *UnordInst;
1594     }
1595     
1596   }// if the operand in UnordInst is a use
1597  
1598 }
1599
1600
1601
1602
1603
1604