blob: e59a3ab2b41025a7e97233e64ad52ea34198eccc [file] [log] [blame]
Ruchira Sasanka94d86e92001-09-14 20:31:39 +00001#include "llvm/Target/Sparc.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00002#include "SparcInternals.h"
3#include "llvm/Method.h"
4#include "llvm/iTerminators.h"
Ruchira Sasanka91442282001-09-30 23:16:47 +00005#include "llvm/iOther.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00006#include "llvm/CodeGen/InstrScheduling.h"
7#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +00008
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00009#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
10#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +000011
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012
13
14
15//---------------------------------------------------------------------------
16// UltraSparcRegInfo
17//---------------------------------------------------------------------------
18
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000019//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000020// Finds the return value of a call instruction
21//---------------------------------------------------------------------------
22
23const Value *
24UltraSparcRegInfo::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 }
Vikram S. Adve53fec862001-10-22 13:41:12 +000038 else if( OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000039
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
56const Value *
57UltraSparcRegInfo::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 }
Vikram S. Adve53fec862001-10-22 13:41:12 +000070 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000071
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//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +000087// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000088//---------------------------------------------------------------------------
89
90const unsigned
91UltraSparcRegInfo::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 }
Vikram S. Adve53fec862001-10-22 13:41:12 +0000114 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000115
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
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000132
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000133}
134
135
136//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000137// Suggests a register for the ret address in the RET machine instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000138//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000139
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000140void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
141 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000142
Vikram S. Adve53fec862001-10-22 13:41:12 +0000143 assert( (RetMI->getNumOperands() >= 2)
144 && "JMPL/RETURN must have 3 and 2 operands respectively");
145
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000146 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
147
148 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000149
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000150 // TODO (Optimize):
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000151 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000152 // 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):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000155
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000156 /*
157 const Value *RetAddrVal = MO.getVRegValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000158
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000159 assert( RetAddrVal && "LR for ret address must be created at start");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000160
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000161 LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
162 RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
163 SparcIntRegOrdr::i7) );
164 */
Ruchira Sasanka91442282001-09-30 23:16:47 +0000165
Ruchira Sasanka91442282001-09-30 23:16:47 +0000166
167}
168
169
170//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000171// Suggests a register for the ret address in the JMPL/CALL machine instr
Ruchira Sasanka91442282001-09-30 23:16:47 +0000172//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000173void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
174 LiveRangeInfo& LRI,
175 vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000176
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000177
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 /*
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000192 assert( (CallMI->getNumOperands() == 3) && "JMPL must have 3 operands");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000193
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000194 // 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) );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000199
200 */
201
Ruchira Sasanka91442282001-09-30 23:16:47 +0000202}
203
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000204
205
Ruchira Sasanka91442282001-09-30 23:16:47 +0000206
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
213void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *const Meth,
214 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000215{
216
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000217 // 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();
Chris Lattner20b1ea02001-09-14 03:47:57 +0000221
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000222 // for each argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000223 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000224
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000225 // get the LR of arg
226 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000227 assert( LR && "No live range found for method arg");
228
229 unsigned RegType = getRegType( LR );
230
Chris Lattner20b1ea02001-09-14 03:47:57 +0000231
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000232 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka91442282001-09-30 23:16:47 +0000233 if( RegType == IntRegType ) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000234
Ruchira Sasanka91442282001-09-30 23:16:47 +0000235 if( argNo < NumOfIntArgRegs) {
236 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000237
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000238 }
239
240 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000241 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000242 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000243 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000244
Chris Lattner20b1ea02001-09-14 03:47:57 +0000245 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000246 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
Chris Lattner20b1ea02001-09-14 03:47:57 +0000253
Chris Lattner20b1ea02001-09-14 03:47:57 +0000254 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000255
Chris Lattner20b1ea02001-09-14 03:47:57 +0000256}
257
Ruchira Sasanka91442282001-09-30 23:16:47 +0000258//---------------------------------------------------------------------------
259//
260//---------------------------------------------------------------------------
261
262void 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
Ruchira Sasanka91442282001-09-30 23:16:47 +0000282 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;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000289 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000290
291 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
292 isArgInReg = true;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000293 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000294 }
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
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000308 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
309
310 // if LR received the correct color, nothing to do
311 if( UniLRReg == UniArgReg )
312 continue;
313
Ruchira Sasanka91442282001-09-30 23:16:47 +0000314 // 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.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000318
319 // if the arg is coming in UniArgReg register MUST go into
320 // the UniLRReg register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000321 if( isArgInReg )
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000322 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000323
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000324 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000325
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000326 // 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
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000328 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,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000339 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
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000372 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 );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000382 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000383
384 }
385
Ruchira Sasanka91442282001-09-30 23:16:47 +0000386 } // for each incoming argument
387
388}
389
Chris Lattner20b1ea02001-09-14 03:47:57 +0000390
391
392
Ruchira Sasanka91442282001-09-30 23:16:47 +0000393//---------------------------------------------------------------------------
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//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000397void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000398 LiveRangeInfo& LRI,
399 vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000400
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000401 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000402
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000403 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000404
Chris Lattner20b1ea02001-09-14 03:47:57 +0000405
Ruchira Sasanka91442282001-09-30 23:16:47 +0000406 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000407 // will be in %o0 if the value is an integer type, or in %f0 if the
408 // value is a float type.
409
Ruchira Sasanka91442282001-09-30 23:16:47 +0000410 // the return value cannot have a LR in machine instruction since it is
411 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000412
Ruchira Sasanka91442282001-09-30 23:16:47 +0000413 // if type is not void, create a new live range and set its
414 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000415
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000416
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000417 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000418
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000419
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000420 if( RetVal ) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000421
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000422 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
423 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000424
425
426 // create a new LR for the return value
427
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000428 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
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000435
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000436 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");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000441
Chris Lattner20b1ea02001-09-14 03:47:57 +0000442 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000443
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000444
Ruchira Sasanka91442282001-09-30 23:16:47 +0000445 // 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.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000448 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000449
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000450 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000452 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
453
454 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000455
456 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000457 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000458
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000459 // not possible to have a null LR since all args (even consts)
460 // must be defined before
461 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000462 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000463 cerr << " ERROR: In call instr, no LR for arg: " ;
464 printValue(CallArg); cerr << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000465 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000466 assert(0 && "NO LR for call arg");
467 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000468 }
469
470 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000471
Ruchira Sasanka91442282001-09-30 23:16:47 +0000472 // 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.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000480 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000481
Ruchira Sasanka91442282001-09-30 23:16:47 +0000482 }
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
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000490
Ruchira Sasanka91442282001-09-30 23:16:47 +0000491 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000492
Chris Lattner20b1ea02001-09-14 03:47:57 +0000493}
494
495
Ruchira Sasanka91442282001-09-30 23:16:47 +0000496//---------------------------------------------------------------------------
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//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000501
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000502void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000503 LiveRangeInfo& LRI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000504 AddedInstrns *const CallAI,
505 PhyRegAlloc &PRA) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000506
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000507 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
508
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000509 // Reset the optional args area in the stack frame
510 // since that is reused for each call
511 //
512 PRA.mcInfo.resetOptionalArgs(target);
513
Ruchira Sasanka91442282001-09-30 23:16:47 +0000514 // 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;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000519
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000520 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000521
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000522 if( RetVal ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000523
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000524 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000525
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000526 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 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000533
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;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000542 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000543 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000544 return;
545 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000546
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,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000555 // put copy instruction
556
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000557 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000558
559 unsigned RegType = getRegType( RetValLR );
560
561 // the reg that LR must be colored with
562 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000563
564 if( RetValLR->hasColor() ) {
565
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000566 unsigned
567 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000568
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000569 // the return value is coming in UniRetReg but has to go into
570 // the UniRetLRReg
571
572 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000573
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000574 } // if LR has color
575 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000576
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
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000579
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000580 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
581 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000582 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000583
584 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000585
586 } // the LR didn't receive the suggested color
587
588 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000589
590
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000591 // Now color all args of the call instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +0000592
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000593 vector <MachineInstr *> AddedInstrnsBefore;
594
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000595 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000597 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
598
599 const Value *CallArg = CallMI->getImplicitRef(i);
600
Ruchira Sasanka91442282001-09-30 23:16:47 +0000601 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000602 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000603
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000604 unsigned RegType = getRegType( CallArg );
605 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000606
607 // find whether this argument is coming in a register (if not, on stack)
608
609 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000610 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000611
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);
Chris Lattner20b1ea02001-09-14 03:47:57 +0000624 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000625
Chris Lattner20b1ea02001-09-14 03:47:57 +0000626
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000627 // not possible to have a null LR since all args (even consts)
628 // must be defined before
629 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000630 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000631 cerr << " ERROR: In call instr, no LR for arg: " ;
632 printValue(CallArg); cerr << endl;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000633 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000634 assert(0 && "NO LR for call arg");
635 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000636 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000637
Ruchira Sasanka91442282001-09-30 23:16:47 +0000638
639 // if the LR received the suggested color, NOTHING to do
640
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000641
Ruchira Sasanka91442282001-09-30 23:16:47 +0000642 if( LR->hasColor() ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000643
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000644
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
Ruchira Sasanka91442282001-09-30 23:16:47 +0000651 // 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
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000655 // the LR is colored with UniLRReg but has to go into UniArgReg
656 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000657
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000658 if( isArgInReg ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000659 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000660 AddedInstrnsBefore.push_back( AdMI );
661 }
662
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000663 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
Ruchira Sasanka91442282001-09-30 23:16:47 +0000667
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000668 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000669
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000670 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000671
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";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000678 }
679
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000680
Ruchira Sasanka91442282001-09-30 23:16:47 +0000681 }
682
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000683 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000684
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000685 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
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000692 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000693 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000694
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000695 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000696 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000697 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000698
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000699 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 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000711
Vikram S. Adve00521d72001-11-12 23:26:35 +0000712 /**** 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()));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000715
716 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
717
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000718 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000719
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000720 // 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 );
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000729 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000730 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000731
732 // We directly add to CallAI->InstrnsBefore instead of adding to
733 // AddedInstrnsBefore since these instructions must not be
734 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000735
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000736 CallAI->InstrnsBefore.push_back( Ad1 );
737 CallAI->InstrnsBefore.push_back( Ad2 );
738 CallAI->InstrnsBefore.push_back( Ad3 );
739 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000740
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000741 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000742 }
743
Ruchira Sasanka91442282001-09-30 23:16:47 +0000744 }
745
746 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000747
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000748
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
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000754 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000755 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;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000761 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000762
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000763 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000764 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
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000775 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000776 PRA.mcInfo.resetOptionalArgs(target);
777
778
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000779}
780
Ruchira Sasanka91442282001-09-30 23:16:47 +0000781//---------------------------------------------------------------------------
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//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000785void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000786 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000787
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000788 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000789
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000790 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000791
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000792 // if there is an implicit ref, that has to be the ret value
793 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000794
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000795 // The first implicit operand is the return value of a return instr
796 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000797
798 MachineInstr *AdMI;
799 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000800
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000801 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000802 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000803 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000804 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000805 assert( LR && "No LR for return value of non-void method");
806 //return;
807 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000808
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000809 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000810
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000811 if( RegClassID == IntRegClassID )
812 LR->setSuggestedColor(SparcIntRegOrder::i0);
813
814 else if ( RegClassID == FloatRegClassID )
815 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000816
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000817 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000818
Ruchira Sasanka91442282001-09-30 23:16:47 +0000819}
820
Ruchira Sasanka91442282001-09-30 23:16:47 +0000821
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000822
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.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000828//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000829void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000830 LiveRangeInfo& LRI,
831 AddedInstrns *const RetAI) const {
832
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000833 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000834
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000835 // if there is an implicit ref, that has to be the ret value
836 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000837
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000838 // The first implicit operand is the return value of a return instr
839 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000840
841 MachineInstr *AdMI;
842 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
843
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000844 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000845 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000846 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000847 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000848 // assert( LR && "No LR for return value of non-void method");
849 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000850 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000851
Ruchira Sasanka91442282001-09-30 23:16:47 +0000852 unsigned RegClassID = getRegClassIDOfValue(RetVal);
853 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000854
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000855 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000856 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000857 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000858 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000859 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000860 else {
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000861 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000862 return;
863 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000864
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000865 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000866
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000867 if( LR->hasColor() )
868 if( LR->getColor() == CorrectCol )
869 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000870
871 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000872
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000873 if( LR->hasColor() ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000874
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000875 // We are here because the LR was allocted a regiter
876 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000877
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000878 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000879
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000880 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000881
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000882 // the LR received UniLRReg but must be colored with UniRetReg
883 // to pass as the return value
884
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000885 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000886 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000887 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000888 else { // if the LR is spilled
Ruchira Sasanka91442282001-09-30 23:16:47 +0000889
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000890 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
891 UniRetReg, RegType);
892 RetAI->InstrnsBefore.push_back( AdMI );
893 cout << "\nCopied the return value from stack";
894 }
895
Ruchira Sasanka91442282001-09-30 23:16:47 +0000896 } // 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
Ruchira Sasanka91442282001-09-30 23:16:47 +0000906MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
907 const unsigned DestReg,
908 const int RegType) const {
909
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000910 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000911 "Invalid Register");
912
913 MachineInstr * MI = NULL;
914
915 switch( RegType ) {
916
917 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000918 case IntCCRegType:
919 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000920 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");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000940 }
941
942 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000943}
Chris Lattner20b1ea02001-09-14 03:47:57 +0000944
945
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000946//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000947// Copy from a register to memory (i.e., Store). Register number must
948// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000949//---------------------------------------------------------------------------
950
951
952MachineInstr * 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:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000963 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000964 MI = new MachineInstr(STX, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000965 MI->SetMachineOperand(0, SrcReg, false);
966 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000967 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
968 (int64_t) Offset, false);
969 break;
970
971 case FPSingleRegType:
972 MI = new MachineInstr(ST, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000973 MI->SetMachineOperand(0, SrcReg, false);
974 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000975 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
976 (int64_t) Offset, false);
977 break;
978
979 case FPDoubleRegType:
980 MI = new MachineInstr(STD, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000981 MI->SetMachineOperand(0, SrcReg, false);
982 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000983 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
984 (int64_t) Offset, false);
985 break;
986
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000987 case IntCCRegType:
988 assert( 0 && "Cannot directly store %ccr to memory");
989
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000990 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000991 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000992 }
993
994 return MI;
995}
996
997
998//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000999// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001000// register number
1001//---------------------------------------------------------------------------
1002
1003
1004MachineInstr * 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:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001014 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001015 MI = new MachineInstr(LDX, 3);
1016 MI->SetMachineOperand(0, SrcPtrReg, false);
1017 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1018 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001019 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001020 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);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001027 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001028
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);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001036 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001037 break;
1038
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001039 case IntCCRegType:
1040 assert( 0 && "Cannot directly load into %ccr from memory");
1041
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001042 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001043 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001044 }
1045
1046 return MI;
1047}
1048
1049
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001050
1051
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001052
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001053//---------------------------------------------------------------------------
1054// Generate a copy instruction to copy a value to another. Temporarily
1055// used by PhiElimination code.
1056//---------------------------------------------------------------------------
1057
1058
1059MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1060
1061 int RegType = getRegType( Src );
1062
1063 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001064
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001065 MachineInstr * MI = NULL;
1066
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001067 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 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001093
1094 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001095}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001096
1097
1098
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001099
1100
1101
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001102//----------------------------------------------------------------------------
1103// This method inserts caller saving/restoring instructons before/after
1104// a call machine instruction.
1105//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001106
Ruchira Sasanka91442282001-09-30 23:16:47 +00001107
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001108void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1109 const BasicBlock *BB,
1110 PhyRegAlloc &PRA) const {
1111 // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001112
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001113 // Clear the temp area of the stack
1114 PRA.mcInfo.popAllTempValues(target);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001115
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.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001125
1126
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001127 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001128
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001129 if( RetVal ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001130
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001131 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1132 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001133
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001134 if( RetValLR->hasColor())
1135 PushedRegSet.insert(
1136 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001137 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001138 }
1139
1140
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001141 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001142
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001143 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001144
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001145 // 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
Vikram S. Adve00521d72001-11-12 23:26:35 +00001177 /**** 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()));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001180
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001181 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001182 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001183
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
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001212 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 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001218
1219 } else {
1220 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001221 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001222 ((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
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001247 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 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001254
1255 } else {
1256 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001257 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001258 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001259 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001260
1261 PushedRegSet.insert( Reg );
1262
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001263 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001264 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001265 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Adve9576b152001-11-06 05:01:54 +00001266 if( RegType == IntCCRegType )
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001267 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001268 else
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001269 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001270 }
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
Ruchira Sasanka91442282001-09-30 23:16:47 +00001278
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001279 } // for each value in the LV set after instruction
1280
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001281 // Clear the temp area of the stack
1282 PRA.mcInfo.popAllTempValues(target);
1283
Ruchira Sasanka91442282001-09-30 23:16:47 +00001284}
1285
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001286//---------------------------------------------------------------------------
1287// Copies %ccr into an integer register. IntReg is the UNIFIED register
1288// number.
1289//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001290
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001291MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1292 MachineInstr * MI = NULL;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001293
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001294 MI = new MachineInstr(RDCCR, 2);
1295 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1296 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001297
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001298 return MI;
1299}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001300
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001301//---------------------------------------------------------------------------
1302// Copies an integer register into %ccr. IntReg is the UNIFIED register
1303// number.
1304//---------------------------------------------------------------------------
1305
1306MachineInstr * 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}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001316
1317
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001318
1319
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001320//---------------------------------------------------------------------------
1321// Print the register assigned to a LR
1322//---------------------------------------------------------------------------
1323
1324void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1325
1326 unsigned RegClassID = (LR->getRegClass())->getID();
1327
Chris Lattner1e23ed72001-10-15 18:15:27 +00001328 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001329
1330 if( ! LR->hasColor() ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001331 cerr << " - could not find a color" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001332 return;
1333 }
1334
1335 // if a color is found
1336
Chris Lattner1e23ed72001-10-15 18:15:27 +00001337 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001338
1339 if( RegClassID == IntRegClassID ) {
1340
Chris Lattner1e23ed72001-10-15 18:15:27 +00001341 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1342 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001343 }
1344 else if ( RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001345 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001346 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +00001347 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1348 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001349 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001350}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001351
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
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001358// instructions inserted by RegAlloc. All such instruction MUST have
1359// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001360
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
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001366// 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
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001372//---------------------------------------------------------------------------
1373void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001374 vector<MachineInstr *> &OrdVec,
1375 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001376
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
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001383
1384 Solution:
1385 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001386
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001387 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.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001402
1403 */
1404
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001405
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001406 bool CouldMoveAll;
1407 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001408
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001409 do {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001410
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001411 CouldMoveAll = true;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001412
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001413 vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001414
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001415 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001416
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001417 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001418
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001419 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001420
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001421 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001422
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001423 //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
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001428 if( DefOp.opIsDef() &&
1429 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001430
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001431 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001432
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001433 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001434
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001435 vector<MachineInstr *>::iterator UseIt = DefIt;
1436 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001437
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001438 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1439
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001440 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001441 if( UseInst == NULL) continue;
1442
1443 // for each inst (UseInst) that is below the DefInst do ...
1444
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001445
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001446 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;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001459
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001460 DefEqUse = true;
1461 CouldMoveAll = false;
1462 DebugPrint = true;
1463 break;
1464 } // if two registers are equal
1465
1466 } // if use is a register
1467
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001468 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001469
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001470 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001471
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
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001483 *DefIt = NULL;
1484 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001485
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001486 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001487
1488 } // for all instructions in the UnordVec
1489
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001490
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001491 } while( !CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001492
1493
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001494 if(DebugPrint) {
1495 cerr << "\nAdded instructions were reordered to:\n";
1496 for(unsigned int i=0; i < OrdVec.size(); i++)
1497 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001498 }
1499
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001500}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001501
1502
1503
1504
1505
1506
1507
1508
1509void 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
Vikram S. Adve00521d72001-11-12 23:26:35 +00001552 /**** NOTE: THIS SHOULD USE THE RIGHT SIZE FOR THE REG BEING PUSHED ****/
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001553 const int StackOff = PRA.mcInfo.pushTempValue(target, 8);
1554
1555 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001556 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001557 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
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001566 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001567 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