blob: b576d05e6fa239f03b9be096901c428689a5bb6c [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
658 if( isArgInReg )
659 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
660
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000661 else {
662 // Now, we have to pass the arg on stack. Since LR received a register
663 // we just have to move that register to the stack position where
664 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000665
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000666 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000667
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000668 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000669 }
670
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000671 // Now add the instruction. We can directly add to
672 // CallAI->InstrnsBefore since we are just saving a reg on stack
673 //
674 CallAI->InstrnsBefore.push_back( AdMI );
675 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka91442282001-09-30 23:16:47 +0000676 }
677
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000678 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000679
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000680 if( isArgInReg ) {
681
682 // Now the LR did NOT recieve a register but has a stack poistion.
683 // Since, the outgoing arg goes in a register we just have to insert
684 // a load instruction to load the LR to outgoing register
685
686
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000687 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000688 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000689
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000690 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000691 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000692 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000693
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000694 else {
695 // Now, we have to pass the arg on stack. Since LR also did NOT
696 // receive a register we have to move an argument in memory to
697 // outgoing parameter on stack.
698
699 // Optoimize: Optimize when reverse pointers in MahineInstr are
700 // introduced.
701 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
702 // fails, then use the following code. Currently, we cannot call the
703 // above method since we cannot find LVSetBefore without the BB
704
705 int TReg = PRA.getRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000706
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000707 int TmpOff = PRA.mcInfo.pushTempValue(target,
708 target.findOptimalStorageSize(LR->getType()));
709 // getStackOffsets().getNewTmpPosOffFromFP();
710
711 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
712
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000713 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000714
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000715 // Sequence:
716 // (1) Save TReg on stack
717 // (2) Load LR value into TReg from stack pos of LR
718 // (3) Store Treg on outgoing Arg pos on stack
719 // (4) Load the old value of TReg from stack to TReg (restore it)
720
721 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
722 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
723 TReg, RegType );
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000724 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000725 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000726
727 // We directly add to CallAI->InstrnsBefore instead of adding to
728 // AddedInstrnsBefore since these instructions must not be
729 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000730
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000731 CallAI->InstrnsBefore.push_back( Ad1 );
732 CallAI->InstrnsBefore.push_back( Ad2 );
733 CallAI->InstrnsBefore.push_back( Ad3 );
734 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000735
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000736 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000737 }
738
Ruchira Sasanka91442282001-09-30 23:16:47 +0000739 }
740
741 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000742
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000743
744 // if we added any instruction before the call instruction, verify
745 // that they are in the proper order and if not, reorder them
746
747 if( ! AddedInstrnsBefore.empty() ) {
748
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000749 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000750 cerr << "\nCalling reorder with instrns: \n";
751 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
752 cerr << *(AddedInstrnsBefore[i]);
753 }
754
755 vector <MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000756 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000757
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000758 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000759 cerr << "\nAfter reordering instrns: \n";
760 for(unsigned i=0; i < TmpVec.size(); i++)
761 cerr << *(TmpVec[i]);
762 }
763
764 // copy the results back from TmpVec to InstrnsBefore
765 for(unsigned i=0; i < TmpVec.size(); i++)
766 CallAI->InstrnsBefore.push_back( TmpVec[i] );
767 }
768
769
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000770 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000771 PRA.mcInfo.resetOptionalArgs(target);
772
773
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000774}
775
Ruchira Sasanka91442282001-09-30 23:16:47 +0000776//---------------------------------------------------------------------------
777// This method is called for an LLVM return instruction to identify which
778// values will be returned from this method and to suggest colors.
779//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000780void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000781 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000782
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000783 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000784
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000785 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000786
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000787 // if there is an implicit ref, that has to be the ret value
788 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000789
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000790 // The first implicit operand is the return value of a return instr
791 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000792
793 MachineInstr *AdMI;
794 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000795
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000796 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000797 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000798 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000799 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000800 assert( LR && "No LR for return value of non-void method");
801 //return;
802 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000803
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000804 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000805
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000806 if( RegClassID == IntRegClassID )
807 LR->setSuggestedColor(SparcIntRegOrder::i0);
808
809 else if ( RegClassID == FloatRegClassID )
810 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000811
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000812 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000813
Ruchira Sasanka91442282001-09-30 23:16:47 +0000814}
815
Ruchira Sasanka91442282001-09-30 23:16:47 +0000816
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000817
818//---------------------------------------------------------------------------
819// Colors the return value of a method to %i0 or %f0, if possible. If it is
820// not possilbe to directly color the LR, insert a copy instruction to move
821// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
822// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000823//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000824void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000825 LiveRangeInfo& LRI,
826 AddedInstrns *const RetAI) const {
827
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000828 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000829
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000830 // if there is an implicit ref, that has to be the ret value
831 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000832
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000833 // The first implicit operand is the return value of a return instr
834 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000835
836 MachineInstr *AdMI;
837 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
838
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000839 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000840 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000841 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000842 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000843 // assert( LR && "No LR for return value of non-void method");
844 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000845 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000846
Ruchira Sasanka91442282001-09-30 23:16:47 +0000847 unsigned RegClassID = getRegClassIDOfValue(RetVal);
848 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000849
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000850 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000851 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000852 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000853 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000854 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000855 else {
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000856 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000857 return;
858 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000859
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000860 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000861
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000862 if( LR->hasColor() )
863 if( LR->getColor() == CorrectCol )
864 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000865
866 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000867
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000868 if( LR->hasColor() ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000869
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000870 // We are here because the LR was allocted a regiter
871 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000872
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000873 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000874
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000875 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000876
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000877 // the LR received UniLRReg but must be colored with UniRetReg
878 // to pass as the return value
879
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000880 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000881 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000882 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000883 else { // if the LR is spilled
Ruchira Sasanka91442282001-09-30 23:16:47 +0000884
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000885 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
886 UniRetReg, RegType);
887 RetAI->InstrnsBefore.push_back( AdMI );
888 cout << "\nCopied the return value from stack";
889 }
890
Ruchira Sasanka91442282001-09-30 23:16:47 +0000891 } // if there is a return value
892
893}
894
895
896//---------------------------------------------------------------------------
897// Copy from a register to register. Register number must be the unified
898// register number
899//---------------------------------------------------------------------------
900
Ruchira Sasanka91442282001-09-30 23:16:47 +0000901MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
902 const unsigned DestReg,
903 const int RegType) const {
904
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000905 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000906 "Invalid Register");
907
908 MachineInstr * MI = NULL;
909
910 switch( RegType ) {
911
912 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000913 case IntCCRegType:
914 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000915 MI = new MachineInstr(ADD, 3);
916 MI->SetMachineOperand(0, SrcReg, false);
917 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
918 MI->SetMachineOperand(2, DestReg, true);
919 break;
920
921 case FPSingleRegType:
922 MI = new MachineInstr(FMOVS, 2);
923 MI->SetMachineOperand(0, SrcReg, false);
924 MI->SetMachineOperand(1, DestReg, true);
925 break;
926
927 case FPDoubleRegType:
928 MI = new MachineInstr(FMOVD, 2);
929 MI->SetMachineOperand(0, SrcReg, false);
930 MI->SetMachineOperand(1, DestReg, true);
931 break;
932
933 default:
934 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000935 }
936
937 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000938}
Chris Lattner20b1ea02001-09-14 03:47:57 +0000939
940
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000941//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000942// Copy from a register to memory (i.e., Store). Register number must
943// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000944//---------------------------------------------------------------------------
945
946
947MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
948 const unsigned DestPtrReg,
949 const int Offset,
950 const int RegType) const {
951
952
953 MachineInstr * MI = NULL;
954
955 switch( RegType ) {
956
957 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000958 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000959 MI = new MachineInstr(STX, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000960 MI->SetMachineOperand(0, SrcReg, false);
961 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000962 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
963 (int64_t) Offset, false);
964 break;
965
966 case FPSingleRegType:
967 MI = new MachineInstr(ST, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000968 MI->SetMachineOperand(0, SrcReg, false);
969 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000970 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
971 (int64_t) Offset, false);
972 break;
973
974 case FPDoubleRegType:
975 MI = new MachineInstr(STD, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000976 MI->SetMachineOperand(0, SrcReg, false);
977 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000978 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
979 (int64_t) Offset, false);
980 break;
981
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000982 case IntCCRegType:
983 assert( 0 && "Cannot directly store %ccr to memory");
984
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000985 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000986 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000987 }
988
989 return MI;
990}
991
992
993//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +0000994// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000995// register number
996//---------------------------------------------------------------------------
997
998
999MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
1000 const int Offset,
1001 const unsigned DestReg,
1002 const int RegType) const {
1003
1004 MachineInstr * MI = NULL;
1005
1006 switch( RegType ) {
1007
1008 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001009 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001010 MI = new MachineInstr(LDX, 3);
1011 MI->SetMachineOperand(0, SrcPtrReg, false);
1012 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1013 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001014 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001015 break;
1016
1017 case FPSingleRegType:
1018 MI = new MachineInstr(LD, 3);
1019 MI->SetMachineOperand(0, SrcPtrReg, false);
1020 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1021 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001022 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001023
1024 break;
1025
1026 case FPDoubleRegType:
1027 MI = new MachineInstr(LDD, 3);
1028 MI->SetMachineOperand(0, SrcPtrReg, false);
1029 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1030 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001031 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001032 break;
1033
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001034 case IntCCRegType:
1035 assert( 0 && "Cannot directly load into %ccr from memory");
1036
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001037 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001038 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001039 }
1040
1041 return MI;
1042}
1043
1044
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001045
1046
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001047
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001048//---------------------------------------------------------------------------
1049// Generate a copy instruction to copy a value to another. Temporarily
1050// used by PhiElimination code.
1051//---------------------------------------------------------------------------
1052
1053
1054MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1055
1056 int RegType = getRegType( Src );
1057
1058 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001059
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001060 MachineInstr * MI = NULL;
1061
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001062 switch( RegType ) {
1063
1064 case IntRegType:
1065
1066 MI = new MachineInstr(ADD, 3);
1067 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1068 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1069 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1070 break;
1071
1072 case FPSingleRegType:
1073 MI = new MachineInstr(FMOVS, 2);
1074 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1075 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1076 break;
1077
1078
1079 case FPDoubleRegType:
1080 MI = new MachineInstr(FMOVD, 2);
1081 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1082 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1083 break;
1084
1085 default:
1086 assert(0 && "Unknow RegType in CpValu2Value");
1087 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001088
1089 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001090}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001091
1092
1093
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001094
1095
1096
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001097//----------------------------------------------------------------------------
1098// This method inserts caller saving/restoring instructons before/after
1099// a call machine instruction.
1100//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001101
Ruchira Sasanka91442282001-09-30 23:16:47 +00001102
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001103void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1104 const BasicBlock *BB,
1105 PhyRegAlloc &PRA) const {
1106 // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001107
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001108 // Clear the temp area of the stack
1109 PRA.mcInfo.popAllTempValues(target);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001110
1111 hash_set<unsigned> PushedRegSet;
1112
1113 // Now find the LR of the return value of the call
1114 // The last *implicit operand* is the return value of a call
1115 // Insert it to to he PushedRegSet since we must not save that register
1116 // and restore it after the call.
1117 // We do this because, we look at the LV set *after* the instruction
1118 // to determine, which LRs must be saved across calls. The return value
1119 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001120
1121
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001122 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001123
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001124 if( RetVal ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001125
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001126 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1127 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001128
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001129 if( RetValLR->hasColor())
1130 PushedRegSet.insert(
1131 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001132 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001133 }
1134
1135
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001136 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001137
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001138 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001139
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001140 // for each live var in live variable set after machine inst
1141 for( ; LIt != LVSetAft->end(); ++LIt) {
1142
1143 // get the live range corresponding to live var
1144 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1145
1146 // LR can be null if it is a const since a const
1147 // doesn't have a dominating def - see Assumptions above
1148 if( LR ) {
1149
1150 if( LR->hasColor() ) {
1151
1152 unsigned RCID = (LR->getRegClass())->getID();
1153 unsigned Color = LR->getColor();
1154
1155 if ( isRegVolatile(RCID, Color) ) {
1156
1157 // if the value is in both LV sets (i.e., live before and after
1158 // the call machine instruction)
1159
1160 unsigned Reg = getUnifiedRegNum(RCID, Color);
1161
1162 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1163
1164 // if we haven't already pushed that register
1165
1166 unsigned RegType = getRegType( LR );
1167
1168 // Now get two instructions - to push on stack and pop from stack
1169 // and add them to InstrnsBefore and InstrnsAfter of the
1170 // call instruction
1171
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001172 int StackOff = PRA.mcInfo.pushTempValue(target,
1173 target.findOptimalStorageSize(LR->getType()));
1174
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001175 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001176 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001177
1178
1179 //---- Insert code for pushing the reg on stack ----------
1180
1181 if( RegType == IntCCRegType ) {
1182
1183 // Handle IntCCRegType specially since we cannot directly
1184 // push %ccr on to the stack
1185
1186 const LiveVarSet *LVSetBef =
1187 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1188
1189 // get a free INTEGER register
1190 int FreeIntReg =
1191 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1192 LVSetBef, AdIBefCC, AdIAftCC);
1193
1194 // insert the instructions in reverse order since we are
1195 // adding them to the front of InstrnsBefore
1196
1197 if(AdIAftCC)
1198 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1199
1200 AdICpCC = cpCCR2IntMI(FreeIntReg);
1201 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1202
1203 if(AdIBefCC)
1204 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1205
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001206 if(DEBUG_RA) {
1207 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1208 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1209 cerr << "\t" << *AdICpCC;
1210 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1211 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001212
1213 } else {
1214 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001215 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001216 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1217 }
1218
1219
1220 //---- Insert code for popping the reg from the stack ----------
1221
1222 if( RegType == IntCCRegType ) {
1223
1224 // Handle IntCCRegType specially since we cannot directly
1225 // pop %ccr on from the stack
1226
1227 // get a free INT register
1228 int FreeIntReg =
1229 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1230 LVSetAft, AdIBefCC, AdIAftCC);
1231
1232 if(AdIBefCC)
1233 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1234
1235 AdICpCC = cpInt2CCRMI(FreeIntReg);
1236 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1237
1238 if(AdIAftCC)
1239 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1240
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001241 if(DEBUG_RA) {
1242
1243 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1244 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1245 cerr << "\t" << *AdICpCC;
1246 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1247 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001248
1249 } else {
1250 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001251 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001252 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001253 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001254
1255 PushedRegSet.insert( Reg );
1256
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001257 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001258 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001259 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Adve9576b152001-11-06 05:01:54 +00001260 if( RegType == IntCCRegType )
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001261 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001262 else
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001263 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001264 }
1265 } // if not already pushed
1266
1267 } // if LR has a volatile color
1268
1269 } // if LR has color
1270
1271 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001272
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001273 } // for each value in the LV set after instruction
1274
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001275 // Clear the temp area of the stack
1276 PRA.mcInfo.popAllTempValues(target);
1277
Ruchira Sasanka91442282001-09-30 23:16:47 +00001278}
1279
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001280//---------------------------------------------------------------------------
1281// Copies %ccr into an integer register. IntReg is the UNIFIED register
1282// number.
1283//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001284
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001285MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1286 MachineInstr * MI = NULL;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001287
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001288 MI = new MachineInstr(RDCCR, 2);
1289 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1290 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001291
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001292 return MI;
1293}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001294
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001295//---------------------------------------------------------------------------
1296// Copies an integer register into %ccr. IntReg is the UNIFIED register
1297// number.
1298//---------------------------------------------------------------------------
1299
1300MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1301 MachineInstr * MI = NULL;
1302
1303 MI = new MachineInstr(WRCCR, 3);
1304 MI->SetMachineOperand(0, IntReg, false);
1305 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1306 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1307
1308 return MI;
1309}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001310
1311
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001312
1313
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001314//---------------------------------------------------------------------------
1315// Print the register assigned to a LR
1316//---------------------------------------------------------------------------
1317
1318void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1319
1320 unsigned RegClassID = (LR->getRegClass())->getID();
1321
Chris Lattner1e23ed72001-10-15 18:15:27 +00001322 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001323
1324 if( ! LR->hasColor() ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001325 cerr << " - could not find a color" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001326 return;
1327 }
1328
1329 // if a color is found
1330
Chris Lattner1e23ed72001-10-15 18:15:27 +00001331 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001332
1333 if( RegClassID == IntRegClassID ) {
1334
Chris Lattner1e23ed72001-10-15 18:15:27 +00001335 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1336 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001337 }
1338 else if ( RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001339 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001340 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +00001341 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1342 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001343 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001344}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001345
1346//---------------------------------------------------------------------------
1347// This method examines instructions inserted by RegAlloc code before a
1348// machine instruction to detect invalid orders that destroy values before
1349// they are used. If it detects such conditions, it reorders the instructions.
1350//
1351// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001352// instructions inserted by RegAlloc. All such instruction MUST have
1353// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001354
1355// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1356// this method is called.
1357
1358// This method uses two vectors for efficiency in accessing
1359
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001360// Since instructions are inserted in RegAlloc, this assumes that the
1361// first operand is the source reg and the last operand is the dest reg.
1362
1363// All the uses are before THE def to a register
1364
1365
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001366//---------------------------------------------------------------------------
1367void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001368 vector<MachineInstr *> &OrdVec,
1369 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001370
1371 /*
1372 Problem: We can have instructions inserted by RegAlloc like
1373 1. add %ox %g0 %oy
1374 2. add %oy %g0 %oz, where z!=x or z==x
1375
1376 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001377
1378 Solution:
1379 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001380
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001381 Algorithm:
1382
1383 do
1384 for each instruction 'DefInst' in the UnOrdVec
1385 for each instruction 'UseInst' that follows the DefInst
1386 if the reg defined by DefInst is used by UseInst
1387 mark DefInst as not movable in this iteration
1388 If DefInst is not marked as not-movable, move DefInst to OrdVec
1389 while all instructions in DefInst are moved to OrdVec
1390
1391 For moving, we call the move2OrdVec(). It checks whether there is a def
1392 in it for the uses in the instruction to be added to OrdVec. If there
1393 are no preceding defs, it just appends the instruction. If there is a
1394 preceding def, it puts two instructions to save the reg on stack before
1395 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001396
1397 */
1398
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001399
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001400 bool CouldMoveAll;
1401 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001402
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001403 do {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001404
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001405 CouldMoveAll = true;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001406
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001407 vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001408
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001409 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001410
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001411 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001412
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001413 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001414
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001415 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001416
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001417 //cerr << "\nInst in UnordVec = " << *DefInst;
1418
1419 // last operand is the def (unless for a store which has no def reg)
1420 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1421
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001422 if( DefOp.opIsDef() &&
1423 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001424
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001425 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001426
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001427 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001428
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001429 vector<MachineInstr *>::iterator UseIt = DefIt;
1430 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001431
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001432 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1433
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001434 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001435 if( UseInst == NULL) continue;
1436
1437 // for each inst (UseInst) that is below the DefInst do ...
1438
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001439
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001440 MachineOperand& UseOp = UseInst->getOperand(0);
1441
1442 if( ! UseOp.opIsDef() &&
1443 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1444
1445 // if use is a register ...
1446
1447 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1448
1449 // if Def and this use are the same, it means that this use
1450 // is destroyed by a def before it is used
1451
1452 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001453
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001454 DefEqUse = true;
1455 CouldMoveAll = false;
1456 DebugPrint = true;
1457 break;
1458 } // if two registers are equal
1459
1460 } // if use is a register
1461
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001462 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001463
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001464 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001465
1466 // after examining all the instructions that follow the DefInst
1467 // if there are no dependencies, we can move it to the OrdVec
1468
1469 // cerr << "Moved to Ord: " << *DefInst;
1470
1471 moveInst2OrdVec(OrdVec, DefInst, PRA);
1472
1473 //OrdVec.push_back(DefInst);
1474
1475 // mark the pos of DefInst with NULL to indicate that it is
1476 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001477 *DefIt = NULL;
1478 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001479
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001480 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001481
1482 } // for all instructions in the UnordVec
1483
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001484
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001485 } while( !CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001486
1487
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001488 if(DebugPrint) {
1489 cerr << "\nAdded instructions were reordered to:\n";
1490 for(unsigned int i=0; i < OrdVec.size(); i++)
1491 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001492 }
1493
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001494}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001495
1496
1497
1498
1499
1500
1501
1502
1503void UltraSparcRegInfo::moveInst2OrdVec(vector<MachineInstr *> &OrdVec,
1504 MachineInstr *UnordInst,
1505 PhyRegAlloc &PRA ) const {
1506
1507 MachineOperand& UseOp = UnordInst->getOperand(0);
1508
1509 if( ! UseOp.opIsDef() &&
1510 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1511
1512 // for the use of UnordInst, see whether there is a defining instr
1513 // before in the OrdVec
1514 bool DefEqUse = false;
1515
1516 vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1517
1518 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1519
1520 MachineInstr *OrdInst = *OrdIt ;
1521
1522 MachineOperand& DefOp =
1523 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1524
1525 if( DefOp.opIsDef() &&
1526 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1527
1528 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1529
1530 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1531
1532 // we are here because there is a preceding def in the OrdVec
1533 // for the use in this intr we are going to insert. This
1534 // happened because the original code was like:
1535 // 1. add %ox %g0 %oy
1536 // 2. add %oy %g0 %ox
1537 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1538 // Now we are processing %ox of 1.
1539 // We have to
1540
1541 const int UReg = DefOp.getMachineRegNum();
1542 const int RegType = getRegType(UReg);
1543 MachineInstr *AdIBef, *AdIAft;
1544
1545 // TODO: Change 8 below
1546 const int StackOff = PRA.mcInfo.pushTempValue(target, 8);
1547
1548 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001549 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001550 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1551 OrdIt++; // points to current instr we processed
1552
1553 // Load directly into DReg (%oy)
1554 MachineOperand& DOp=
1555 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1556 assert(DOp.opIsDef() && "Last operand is not the def");
1557 const int DReg = DOp.getMachineRegNum();
1558
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001559 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001560 OrdVec.push_back(AdIAft);
1561
1562 cerr << "\nFixed CIRCULAR references by reordering";
1563
1564 if( DEBUG_RA ) {
1565 cerr << "\nBefore CIRCULAR Reordering:\n";
1566 cerr << *UnordInst;
1567 cerr << *OrdInst;
1568
1569 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1570 for(unsigned i=0; i < OrdVec.size(); i++)
1571 cerr << *(OrdVec[i]);
1572 }
1573
1574 // Do not copy the UseInst to OrdVec
1575 DefEqUse = true;
1576 break;
1577
1578 }// if two registers are equal
1579
1580 } // if Def is a register
1581
1582 } // for each instr in OrdVec
1583
1584 if( !DefEqUse ) {
1585
1586 // We didn't find a def in the OrdVec, so just append this inst
1587 OrdVec.push_back( UnordInst );
1588 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1589 }
1590
1591 }// if the operand in UnordInst is a use
1592
1593}
1594
1595
1596
1597
1598
1599