blob: 4040b02579d99839fc916093117296eff26bd661 [file] [log] [blame]
Ruchira Sasankadfdab462001-09-14 20:31:39 +00001#include "llvm/Target/Sparc.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00002#include "SparcInternals.h"
3#include "llvm/Method.h"
4#include "llvm/iTerminators.h"
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00005#include "llvm/iOther.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00006#include "llvm/CodeGen/InstrScheduling.h"
7#include "llvm/CodeGen/InstrSelection.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00008
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00009#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
10#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000011
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012
13
14
15//---------------------------------------------------------------------------
16// UltraSparcRegInfo
17//---------------------------------------------------------------------------
18
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000019//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000038 else if( OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000070 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +000087// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-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. Adve84982772001-10-22 13:41:12 +0000114 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000132
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000133}
134
135
136//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000137// Suggests a register for the ret address in the RET machine instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000138//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000139
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000140void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
141 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000142
Vikram S. Adve84982772001-10-22 13:41:12 +0000143 assert( (RetMI->getNumOperands() >= 2)
144 && "JMPL/RETURN must have 3 and 2 operands respectively");
145
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000146 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
147
148 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000149
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000150 // TODO (Optimize):
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000151 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000155
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000156 /*
157 const Value *RetAddrVal = MO.getVRegValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000158
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000159 assert( RetAddrVal && "LR for ret address must be created at start");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000160
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000161 LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
162 RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
163 SparcIntRegOrdr::i7) );
164 */
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000165
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000166
167}
168
169
170//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000171// Suggests a register for the ret address in the JMPL/CALL machine instr
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000172//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000173void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
174 LiveRangeInfo& LRI,
175 vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000176
Ruchira Sasanka24729a32001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000192 assert( (CallMI->getNumOperands() == 3) && "JMPL must have 3 operands");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000193
Ruchira Sasanka086bf0f2001-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 Sasanka24729a32001-10-21 16:43:41 +0000199
200 */
201
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000202}
203
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000204
205
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000215{
216
Ruchira Sasankadfc6c882001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000221
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000222 // for each argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000223 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000224
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000225 // get the LR of arg
226 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000227 assert( LR && "No live range found for method arg");
228
229 unsigned RegType = getRegType( LR );
230
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000231
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000232 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000233 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000234
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000235 if( argNo < NumOfIntArgRegs) {
236 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000237
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000238 }
239
240 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000241 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000242 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000243 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000244
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000245 }
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000253
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000254 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000255
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000256}
257
Ruchira Sasanka5867c7a2001-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 Sasanka5867c7a2001-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 Sasanka36bcd792001-10-24 15:56:58 +0000289 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000290
291 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
292 isArgInReg = true;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000293 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka5867c7a2001-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 Sasanka36bcd792001-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 Sasanka5867c7a2001-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 Sasanka36bcd792001-10-24 15:56:58 +0000318
319 // if the arg is coming in UniArgReg register MUST go into
320 // the UniLRReg register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000321 if( isArgInReg )
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000322 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000323
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000324 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000325
Ruchira Sasanka9c38dbc2001-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. Adve7a1524f2001-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 Sasanka9c38dbc2001-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. Adve7a1524f2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000382 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000383
384 }
385
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000386 } // for each incoming argument
387
388}
389
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000390
391
392
Ruchira Sasanka5867c7a2001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000397void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000398 LiveRangeInfo& LRI,
399 vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000400
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000401 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000402
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000403 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000404
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000405
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000406 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-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 Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000412
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000415
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000416
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000417 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000418
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000419
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000420 if( RetVal ) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000421
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000422 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
423 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000424
425
426 // create a new LR for the return value
427
Ruchira Sasanka24729a32001-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 Sasanka086bf0f2001-10-15 16:25:28 +0000435
Ruchira Sasanka24729a32001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000441
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000442 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000443
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000444
Ruchira Sasanka5867c7a2001-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 Sasanka24729a32001-10-21 16:43:41 +0000448 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000449
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000450 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000455
456 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000457 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000458
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000462 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000463 cerr << " ERROR: In call instr, no LR for arg: " ;
464 printValue(CallArg); cerr << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000465 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000466 assert(0 && "NO LR for call arg");
467 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000468 }
469
470 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000471
Ruchira Sasanka5867c7a2001-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 Lattnerf3f1e452001-10-15 18:15:27 +0000480 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000481
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000490
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000491 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000492
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000493}
494
495
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000501
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000502void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000503 LiveRangeInfo& LRI,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000504 AddedInstrns *const CallAI,
505 PhyRegAlloc &PRA) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000506
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000507 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
508
Vikram S. Adve7a1524f2001-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 Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000519
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000520 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000521
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000522 if( RetVal ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000523
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000524 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000525
Ruchira Sasanka24729a32001-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 Sasanka36bcd792001-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 Lattnere147d062001-11-07 14:01:59 +0000542 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000543 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000544 return;
545 }
Ruchira Sasanka36bcd792001-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 Sasanka24729a32001-10-21 16:43:41 +0000555 // put copy instruction
556
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000557 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-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 Sasanka24729a32001-10-21 16:43:41 +0000563
564 if( RetValLR->hasColor() ) {
565
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000566 unsigned
567 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000568
Ruchira Sasanka36bcd792001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000573
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000574 } // if LR has color
575 else {
Ruchira Sasanka9c38dbc2001-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 Sasanka24729a32001-10-21 16:43:41 +0000579
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000580 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
581 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000582 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000583
584 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585
586 } // the LR didn't receive the suggested color
587
588 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000589
590
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000591 // Now color all args of the call instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000592
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000593 vector <MachineInstr *> AddedInstrnsBefore;
594
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000595 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000596
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000601 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000602 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000603
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000604 unsigned RegType = getRegType( CallArg );
605 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-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 Sasanka36bcd792001-10-24 15:56:58 +0000610 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000624 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000625
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000626
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000630 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000631 cerr << " ERROR: In call instr, no LR for arg: " ;
632 printValue(CallArg); cerr << endl;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000633 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000634 assert(0 && "NO LR for call arg");
635 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000636 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000637
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000638
639 // if the LR received the suggested color, NOTHING to do
640
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000641
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000642 if( LR->hasColor() ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000643
Ruchira Sasanka36bcd792001-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 Sasanka5867c7a2001-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 Sasanka36bcd792001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000657
658 if( isArgInReg )
659 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
660
Ruchira Sasanka9c38dbc2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000665
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000666 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000667
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000668 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000669 }
670
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000671 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000672 }
673
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000674 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000675
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000676 if( isArgInReg ) {
677
678 // Now the LR did NOT recieve a register but has a stack poistion.
679 // Since, the outgoing arg goes in a register we just have to insert
680 // a load instruction to load the LR to outgoing register
681
682
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000683 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000684 UniArgReg, RegType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000685
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000686 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000687 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000688
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000689 else {
690 // Now, we have to pass the arg on stack. Since LR also did NOT
691 // receive a register we have to move an argument in memory to
692 // outgoing parameter on stack.
693
694 // Optoimize: Optimize when reverse pointers in MahineInstr are
695 // introduced.
696 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
697 // fails, then use the following code. Currently, we cannot call the
698 // above method since we cannot find LVSetBefore without the BB
699
700 int TReg = PRA.getRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000701
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000702 int TmpOff = PRA.mcInfo.pushTempValue(target,
703 target.findOptimalStorageSize(LR->getType()));
704 // getStackOffsets().getNewTmpPosOffFromFP();
705
706 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
707
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000708 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000709
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000710 // Sequence:
711 // (1) Save TReg on stack
712 // (2) Load LR value into TReg from stack pos of LR
713 // (3) Store Treg on outgoing Arg pos on stack
714 // (4) Load the old value of TReg from stack to TReg (restore it)
715
716 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
717 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
718 TReg, RegType );
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000719 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000720 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000721
722 // We directly add to CallAI->InstrnsBefore instead of adding to
723 // AddedInstrnsBefore since these instructions must not be
724 // reordered.
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000725
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000726 CallAI->InstrnsBefore.push_back( Ad1 );
727 CallAI->InstrnsBefore.push_back( Ad2 );
728 CallAI->InstrnsBefore.push_back( Ad3 );
729 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000730
731 cerr << "\n Caution: Call arg moved from stack to stack";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000732 }
733
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000734 }
735
736 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000737
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000738
739 // if we added any instruction before the call instruction, verify
740 // that they are in the proper order and if not, reorder them
741
742 if( ! AddedInstrnsBefore.empty() ) {
743
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000744 if( DEBUG_RA ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000745 cerr << "\nCalling reorder with instrns: \n";
746 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
747 cerr << *(AddedInstrnsBefore[i]);
748 }
749
750 vector <MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000751 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000752
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000753 if( DEBUG_RA ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000754 cerr << "\nAfter reordering instrns: \n";
755 for(unsigned i=0; i < TmpVec.size(); i++)
756 cerr << *(TmpVec[i]);
757 }
758
759 // copy the results back from TmpVec to InstrnsBefore
760 for(unsigned i=0; i < TmpVec.size(); i++)
761 CallAI->InstrnsBefore.push_back( TmpVec[i] );
762 }
763
764
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000765 // Reset optional args area again to be safe
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000766 PRA.mcInfo.resetOptionalArgs(target);
767
768
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000769}
770
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000771//---------------------------------------------------------------------------
772// This method is called for an LLVM return instruction to identify which
773// values will be returned from this method and to suggest colors.
774//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000775void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000776 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000777
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000778 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000779
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000780 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000781
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000782 // if there is an implicit ref, that has to be the ret value
783 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000784
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000785 // The first implicit operand is the return value of a return instr
786 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000787
788 MachineInstr *AdMI;
789 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000790
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000791 if( !LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000792 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000793 printValue( RetVal );
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000794 cerr << endl;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000795 assert( LR && "No LR for return value of non-void method");
796 //return;
797 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000798
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000799 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000800
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000801 if( RegClassID == IntRegClassID )
802 LR->setSuggestedColor(SparcIntRegOrder::i0);
803
804 else if ( RegClassID == FloatRegClassID )
805 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000806
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000807 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000808
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000809}
810
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000811
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000812
813//---------------------------------------------------------------------------
814// Colors the return value of a method to %i0 or %f0, if possible. If it is
815// not possilbe to directly color the LR, insert a copy instruction to move
816// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
817// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000818//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000819void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000820 LiveRangeInfo& LRI,
821 AddedInstrns *const RetAI) const {
822
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000823 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000824
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000825 // if there is an implicit ref, that has to be the ret value
826 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000827
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000828 // The first implicit operand is the return value of a return instr
829 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000830
831 MachineInstr *AdMI;
832 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
833
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000834 if( ! LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000835 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000836 printValue( RetVal );
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000837 cerr << endl;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000838 // assert( LR && "No LR for return value of non-void method");
839 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000840 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000841
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000842 unsigned RegClassID = getRegClassIDOfValue(RetVal);
843 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000844
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000845 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000846 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000847 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000848 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000849 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000850 else {
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000851 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000852 return;
853 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000854
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000855 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000856
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000857 if( LR->hasColor() )
858 if( LR->getColor() == CorrectCol )
859 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000860
861 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000862
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000863 if( LR->hasColor() ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000864
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000865 // We are here because the LR was allocted a regiter
866 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000867
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000868 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000869
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000870 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000871
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000872 // the LR received UniLRReg but must be colored with UniRetReg
873 // to pass as the return value
874
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000875 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000876 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000878 else { // if the LR is spilled
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000879
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000880 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
881 UniRetReg, RegType);
882 RetAI->InstrnsBefore.push_back( AdMI );
883 cout << "\nCopied the return value from stack";
884 }
885
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000886 } // if there is a return value
887
888}
889
890
891//---------------------------------------------------------------------------
892// Copy from a register to register. Register number must be the unified
893// register number
894//---------------------------------------------------------------------------
895
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000896MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
897 const unsigned DestReg,
898 const int RegType) const {
899
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000900 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000901 "Invalid Register");
902
903 MachineInstr * MI = NULL;
904
905 switch( RegType ) {
906
907 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000908 case IntCCRegType:
909 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000910 MI = new MachineInstr(ADD, 3);
911 MI->SetMachineOperand(0, SrcReg, false);
912 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
913 MI->SetMachineOperand(2, DestReg, true);
914 break;
915
916 case FPSingleRegType:
917 MI = new MachineInstr(FMOVS, 2);
918 MI->SetMachineOperand(0, SrcReg, false);
919 MI->SetMachineOperand(1, DestReg, true);
920 break;
921
922 case FPDoubleRegType:
923 MI = new MachineInstr(FMOVD, 2);
924 MI->SetMachineOperand(0, SrcReg, false);
925 MI->SetMachineOperand(1, DestReg, true);
926 break;
927
928 default:
929 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000930 }
931
932 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000933}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000934
935
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000936//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +0000937// Copy from a register to memory (i.e., Store). Register number must
938// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000939//---------------------------------------------------------------------------
940
941
942MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
943 const unsigned DestPtrReg,
944 const int Offset,
945 const int RegType) const {
946
947
948 MachineInstr * MI = NULL;
949
950 switch( RegType ) {
951
952 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000953 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000954 MI = new MachineInstr(STX, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +0000955 MI->SetMachineOperand(0, SrcReg, false);
956 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000957 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
958 (int64_t) Offset, false);
959 break;
960
961 case FPSingleRegType:
962 MI = new MachineInstr(ST, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +0000963 MI->SetMachineOperand(0, SrcReg, false);
964 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000965 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
966 (int64_t) Offset, false);
967 break;
968
969 case FPDoubleRegType:
970 MI = new MachineInstr(STD, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +0000971 MI->SetMachineOperand(0, SrcReg, false);
972 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000973 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
974 (int64_t) Offset, false);
975 break;
976
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000977 case IntCCRegType:
978 assert( 0 && "Cannot directly store %ccr to memory");
979
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000980 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000981 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000982 }
983
984 return MI;
985}
986
987
988//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +0000989// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000990// register number
991//---------------------------------------------------------------------------
992
993
994MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
995 const int Offset,
996 const unsigned DestReg,
997 const int RegType) const {
998
999 MachineInstr * MI = NULL;
1000
1001 switch( RegType ) {
1002
1003 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001004 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001005 MI = new MachineInstr(LDX, 3);
1006 MI->SetMachineOperand(0, SrcPtrReg, false);
1007 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1008 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001009 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001010 break;
1011
1012 case FPSingleRegType:
1013 MI = new MachineInstr(LD, 3);
1014 MI->SetMachineOperand(0, SrcPtrReg, false);
1015 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1016 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001017 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001018
1019 break;
1020
1021 case FPDoubleRegType:
1022 MI = new MachineInstr(LDD, 3);
1023 MI->SetMachineOperand(0, SrcPtrReg, false);
1024 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1025 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001026 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001027 break;
1028
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001029 case IntCCRegType:
1030 assert( 0 && "Cannot directly load into %ccr from memory");
1031
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001032 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001033 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001034 }
1035
1036 return MI;
1037}
1038
1039
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001040
1041
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001042
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001043//---------------------------------------------------------------------------
1044// Generate a copy instruction to copy a value to another. Temporarily
1045// used by PhiElimination code.
1046//---------------------------------------------------------------------------
1047
1048
1049MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1050
1051 int RegType = getRegType( Src );
1052
1053 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001054
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001055 MachineInstr * MI = NULL;
1056
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001057 switch( RegType ) {
1058
1059 case IntRegType:
1060
1061 MI = new MachineInstr(ADD, 3);
1062 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1063 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1064 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1065 break;
1066
1067 case FPSingleRegType:
1068 MI = new MachineInstr(FMOVS, 2);
1069 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1070 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1071 break;
1072
1073
1074 case FPDoubleRegType:
1075 MI = new MachineInstr(FMOVD, 2);
1076 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1077 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1078 break;
1079
1080 default:
1081 assert(0 && "Unknow RegType in CpValu2Value");
1082 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001083
1084 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001085}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001086
1087
1088
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001089
1090
1091
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001092//----------------------------------------------------------------------------
1093// This method inserts caller saving/restoring instructons before/after
1094// a call machine instruction.
1095//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001096
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001097
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001098void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1099 const BasicBlock *BB,
1100 PhyRegAlloc &PRA) const {
1101 // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001102
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001103 // Clear the temp area of the stack
1104 PRA.mcInfo.popAllTempValues(target);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001105
1106 hash_set<unsigned> PushedRegSet;
1107
1108 // Now find the LR of the return value of the call
1109 // The last *implicit operand* is the return value of a call
1110 // Insert it to to he PushedRegSet since we must not save that register
1111 // and restore it after the call.
1112 // We do this because, we look at the LV set *after* the instruction
1113 // to determine, which LRs must be saved across calls. The return value
1114 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001115
1116
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001117 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001118
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001119 if( RetVal ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001120
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001121 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1122 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001123
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001124 if( RetValLR->hasColor())
1125 PushedRegSet.insert(
1126 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001127 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001128 }
1129
1130
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001131 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001132
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001133 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001134
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001135 // for each live var in live variable set after machine inst
1136 for( ; LIt != LVSetAft->end(); ++LIt) {
1137
1138 // get the live range corresponding to live var
1139 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1140
1141 // LR can be null if it is a const since a const
1142 // doesn't have a dominating def - see Assumptions above
1143 if( LR ) {
1144
1145 if( LR->hasColor() ) {
1146
1147 unsigned RCID = (LR->getRegClass())->getID();
1148 unsigned Color = LR->getColor();
1149
1150 if ( isRegVolatile(RCID, Color) ) {
1151
1152 // if the value is in both LV sets (i.e., live before and after
1153 // the call machine instruction)
1154
1155 unsigned Reg = getUnifiedRegNum(RCID, Color);
1156
1157 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1158
1159 // if we haven't already pushed that register
1160
1161 unsigned RegType = getRegType( LR );
1162
1163 // Now get two instructions - to push on stack and pop from stack
1164 // and add them to InstrnsBefore and InstrnsAfter of the
1165 // call instruction
1166
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001167 int StackOff = PRA.mcInfo.pushTempValue(target,
1168 target.findOptimalStorageSize(LR->getType()));
1169
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001170 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001171 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001172
1173
1174 //---- Insert code for pushing the reg on stack ----------
1175
1176 if( RegType == IntCCRegType ) {
1177
1178 // Handle IntCCRegType specially since we cannot directly
1179 // push %ccr on to the stack
1180
1181 const LiveVarSet *LVSetBef =
1182 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1183
1184 // get a free INTEGER register
1185 int FreeIntReg =
1186 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1187 LVSetBef, AdIBefCC, AdIAftCC);
1188
1189 // insert the instructions in reverse order since we are
1190 // adding them to the front of InstrnsBefore
1191
1192 if(AdIAftCC)
1193 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1194
1195 AdICpCC = cpCCR2IntMI(FreeIntReg);
1196 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1197
1198 if(AdIBefCC)
1199 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1200
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001201 if(DEBUG_RA) {
1202 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1203 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1204 cerr << "\t" << *AdICpCC;
1205 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1206 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001207
1208 } else {
1209 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001210 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001211 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1212 }
1213
1214
1215 //---- Insert code for popping the reg from the stack ----------
1216
1217 if( RegType == IntCCRegType ) {
1218
1219 // Handle IntCCRegType specially since we cannot directly
1220 // pop %ccr on from the stack
1221
1222 // get a free INT register
1223 int FreeIntReg =
1224 PRA.getUsableRegAtMI(LR->getRegClass(), IntRegType, MInst,
1225 LVSetAft, AdIBefCC, AdIAftCC);
1226
1227 if(AdIBefCC)
1228 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1229
1230 AdICpCC = cpInt2CCRMI(FreeIntReg);
1231 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1232
1233 if(AdIAftCC)
1234 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1235
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001236 if(DEBUG_RA) {
1237
1238 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1239 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1240 cerr << "\t" << *AdICpCC;
1241 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1242 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001243
1244 } else {
1245 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001246 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001247 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001248 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001249
1250 PushedRegSet.insert( Reg );
1251
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001252 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001253 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001254 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001255 if( RegType == IntCCRegType )
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001256 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001257 else
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001258 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001259 }
1260 } // if not already pushed
1261
1262 } // if LR has a volatile color
1263
1264 } // if LR has color
1265
1266 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001267
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001268 } // for each value in the LV set after instruction
1269
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001270 // Clear the temp area of the stack
1271 PRA.mcInfo.popAllTempValues(target);
1272
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001273}
1274
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001275//---------------------------------------------------------------------------
1276// Copies %ccr into an integer register. IntReg is the UNIFIED register
1277// number.
1278//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001279
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001280MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1281 MachineInstr * MI = NULL;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001282
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001283 MI = new MachineInstr(RDCCR, 2);
1284 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1285 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001286
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001287 return MI;
1288}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001289
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001290//---------------------------------------------------------------------------
1291// Copies an integer register into %ccr. IntReg is the UNIFIED register
1292// number.
1293//---------------------------------------------------------------------------
1294
1295MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1296 MachineInstr * MI = NULL;
1297
1298 MI = new MachineInstr(WRCCR, 3);
1299 MI->SetMachineOperand(0, IntReg, false);
1300 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1301 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1302
1303 return MI;
1304}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001305
1306
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001307
1308
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001309//---------------------------------------------------------------------------
1310// Print the register assigned to a LR
1311//---------------------------------------------------------------------------
1312
1313void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1314
1315 unsigned RegClassID = (LR->getRegClass())->getID();
1316
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001317 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001318
1319 if( ! LR->hasColor() ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001320 cerr << " - could not find a color" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001321 return;
1322 }
1323
1324 // if a color is found
1325
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001326 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001327
1328 if( RegClassID == IntRegClassID ) {
1329
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001330 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1331 cerr << "]" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001332 }
1333 else if ( RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001334 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001335 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001336 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1337 cerr << "]" << endl;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001338 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001339}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001340
1341//---------------------------------------------------------------------------
1342// This method examines instructions inserted by RegAlloc code before a
1343// machine instruction to detect invalid orders that destroy values before
1344// they are used. If it detects such conditions, it reorders the instructions.
1345//
1346// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001347// instructions inserted by RegAlloc. All such instruction MUST have
1348// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001349
1350// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1351// this method is called.
1352
1353// This method uses two vectors for efficiency in accessing
1354
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001355// Since instructions are inserted in RegAlloc, this assumes that the
1356// first operand is the source reg and the last operand is the dest reg.
1357
1358// All the uses are before THE def to a register
1359
1360
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001361//---------------------------------------------------------------------------
1362void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001363 vector<MachineInstr *> &OrdVec,
1364 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001365
1366 /*
1367 Problem: We can have instructions inserted by RegAlloc like
1368 1. add %ox %g0 %oy
1369 2. add %oy %g0 %oz, where z!=x or z==x
1370
1371 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001372
1373 Solution:
1374 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001375
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001376 Algorithm:
1377
1378 do
1379 for each instruction 'DefInst' in the UnOrdVec
1380 for each instruction 'UseInst' that follows the DefInst
1381 if the reg defined by DefInst is used by UseInst
1382 mark DefInst as not movable in this iteration
1383 If DefInst is not marked as not-movable, move DefInst to OrdVec
1384 while all instructions in DefInst are moved to OrdVec
1385
1386 For moving, we call the move2OrdVec(). It checks whether there is a def
1387 in it for the uses in the instruction to be added to OrdVec. If there
1388 are no preceding defs, it just appends the instruction. If there is a
1389 preceding def, it puts two instructions to save the reg on stack before
1390 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001391
1392 */
1393
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001394
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001395 bool CouldMoveAll;
1396 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001397
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001398 do {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001399
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001400 CouldMoveAll = true;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001401
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001402 vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001403
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001404 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001405
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001406 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001407
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001408 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001409
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001410 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001411
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001412 //cerr << "\nInst in UnordVec = " << *DefInst;
1413
1414 // last operand is the def (unless for a store which has no def reg)
1415 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1416
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001417 if( DefOp.opIsDef() &&
1418 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001419
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001420 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001421
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001422 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001423
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001424 vector<MachineInstr *>::iterator UseIt = DefIt;
1425 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001426
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001427 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1428
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001429 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001430 if( UseInst == NULL) continue;
1431
1432 // for each inst (UseInst) that is below the DefInst do ...
1433
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001434
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001435 MachineOperand& UseOp = UseInst->getOperand(0);
1436
1437 if( ! UseOp.opIsDef() &&
1438 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1439
1440 // if use is a register ...
1441
1442 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1443
1444 // if Def and this use are the same, it means that this use
1445 // is destroyed by a def before it is used
1446
1447 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001448
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001449 DefEqUse = true;
1450 CouldMoveAll = false;
1451 DebugPrint = true;
1452 break;
1453 } // if two registers are equal
1454
1455 } // if use is a register
1456
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001457 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001458
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001459 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001460
1461 // after examining all the instructions that follow the DefInst
1462 // if there are no dependencies, we can move it to the OrdVec
1463
1464 // cerr << "Moved to Ord: " << *DefInst;
1465
1466 moveInst2OrdVec(OrdVec, DefInst, PRA);
1467
1468 //OrdVec.push_back(DefInst);
1469
1470 // mark the pos of DefInst with NULL to indicate that it is
1471 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001472 *DefIt = NULL;
1473 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001474
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001475 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001476
1477 } // for all instructions in the UnordVec
1478
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001479
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001480 } while( !CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001481
1482
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001483 if(DebugPrint) {
1484 cerr << "\nAdded instructions were reordered to:\n";
1485 for(unsigned int i=0; i < OrdVec.size(); i++)
1486 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001487 }
1488
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001489}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001490
1491
1492
1493
1494
1495
1496
1497
1498void UltraSparcRegInfo::moveInst2OrdVec(vector<MachineInstr *> &OrdVec,
1499 MachineInstr *UnordInst,
1500 PhyRegAlloc &PRA ) const {
1501
1502 MachineOperand& UseOp = UnordInst->getOperand(0);
1503
1504 if( ! UseOp.opIsDef() &&
1505 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1506
1507 // for the use of UnordInst, see whether there is a defining instr
1508 // before in the OrdVec
1509 bool DefEqUse = false;
1510
1511 vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1512
1513 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1514
1515 MachineInstr *OrdInst = *OrdIt ;
1516
1517 MachineOperand& DefOp =
1518 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1519
1520 if( DefOp.opIsDef() &&
1521 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1522
1523 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1524
1525 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1526
1527 // we are here because there is a preceding def in the OrdVec
1528 // for the use in this intr we are going to insert. This
1529 // happened because the original code was like:
1530 // 1. add %ox %g0 %oy
1531 // 2. add %oy %g0 %ox
1532 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1533 // Now we are processing %ox of 1.
1534 // We have to
1535
1536 const int UReg = DefOp.getMachineRegNum();
1537 const int RegType = getRegType(UReg);
1538 MachineInstr *AdIBef, *AdIAft;
1539
1540 // TODO: Change 8 below
1541 const int StackOff = PRA.mcInfo.pushTempValue(target, 8);
1542
1543 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001544 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001545 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1546 OrdIt++; // points to current instr we processed
1547
1548 // Load directly into DReg (%oy)
1549 MachineOperand& DOp=
1550 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1551 assert(DOp.opIsDef() && "Last operand is not the def");
1552 const int DReg = DOp.getMachineRegNum();
1553
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001554 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001555 OrdVec.push_back(AdIAft);
1556
1557 cerr << "\nFixed CIRCULAR references by reordering";
1558
1559 if( DEBUG_RA ) {
1560 cerr << "\nBefore CIRCULAR Reordering:\n";
1561 cerr << *UnordInst;
1562 cerr << *OrdInst;
1563
1564 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1565 for(unsigned i=0; i < OrdVec.size(); i++)
1566 cerr << *(OrdVec[i]);
1567 }
1568
1569 // Do not copy the UseInst to OrdVec
1570 DefEqUse = true;
1571 break;
1572
1573 }// if two registers are equal
1574
1575 } // if Def is a register
1576
1577 } // for each instr in OrdVec
1578
1579 if( !DefEqUse ) {
1580
1581 // We didn't find a def in the OrdVec, so just append this inst
1582 OrdVec.push_back( UnordInst );
1583 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1584 }
1585
1586 }// if the operand in UnordInst is a use
1587
1588}
1589
1590
1591
1592
1593
1594