blob: 6a0460de7415a3a3447f5537a2a57b76e3617d7a [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"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
9#include "llvm/CodeGen/PhyRegAlloc.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000010#include "llvm/DerivedTypes.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +000011
Ruchira Sasankad00982a2002-01-07 19:20:28 +000012//---------------------------------------------------------------------------
13// Purpose:
14// This file contains implementation of Sparc specific helper methods
15// used for register allocation.
16//---------------------------------------------------------------------------
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000017
18
19//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +000020// Finds the return value of a sparc specific call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000021//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000022const Value *
Ruchira Sasankad00982a2002-01-07 19:20:28 +000023UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000024
25 unsigned OpCode = CallMI->getOpCode();
26 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
27
28 if( OpCode == CALL ) {
29
30 // The one before the last implicit operand is the return value of
31 // a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +000032 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000033 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
Ruchira Sasankad00982a2002-01-07 19:20:28 +000040 // The last implicit operand is the return value of a JMPL
41 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000042 if( NumOfImpRefs > 0 )
43 if( CallMI->implicitRefIsDefined(NumOfImpRefs-1) )
44 return CallMI->getImplicitRef(NumOfImpRefs-1);
45 }
46 else
47 assert(0 && "OpCode must be CALL/JMPL for a call instr");
48
49 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000050}
51
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000052
Ruchira Sasankad00982a2002-01-07 19:20:28 +000053
54//---------------------------------------------------------------------------
55// Finds the return address of a call sparc specific call instruction
56//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000057const Value *
58UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI)const {
59
60 unsigned OpCode = CallMI->getOpCode();
61
62 if( OpCode == CALL) {
63
64 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
65
66 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasankad00982a2002-01-07 19:20:28 +000067
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000068 // The last implicit operand is the return address of a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +000069 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000070 return CallMI->getImplicitRef(NumOfImpRefs-1);
71
72 }
Vikram S. Adve53fec862001-10-22 13:41:12 +000073 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000074
75 MachineOperand & MO = ( MachineOperand &) CallMI->getOperand(2);
76 return MO.getVRegValue();
77
78 }
79 else
80 assert(0 && "OpCode must be CALL/JMPL for a call instr");
81
82 assert(0 && "There must be a return addr for a call instr");
83
84 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000085}
86
87
Ruchira Sasankad00982a2002-01-07 19:20:28 +000088
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000089//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +000090// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000091//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000092const unsigned
93UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
94
95 unsigned OpCode = CallMI->getOpCode();
96 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
97 int NumArgs = -1;
98
99 if( OpCode == CALL ) {
100
101 switch( NumOfImpRefs ) {
102
103 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
104
105 case 1: NumArgs = 0;
106 break;
107
108 default: // two or more implicit refs
109 if( CallMI->implicitRefIsDefined(NumOfImpRefs-2) )
110 NumArgs = NumOfImpRefs - 2; // i.e., NumOfImpRef-2 is the ret val
111 else
112 NumArgs = NumOfImpRefs - 1;
113 }
114
115 }
Vikram S. Adve53fec862001-10-22 13:41:12 +0000116 else if( OpCode == JMPLCALL ) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000117
118 // The last implicit operand is the return value of a JMPL instr
119 if( NumOfImpRefs > 0 ) {
120 if( CallMI->implicitRefIsDefined(NumOfImpRefs-1) )
121 NumArgs = NumOfImpRefs - 1; // i.e., NumOfImpRef-1 is the ret val
122 else
123 NumArgs = NumOfImpRefs;
124 }
125 else
126 NumArgs = NumOfImpRefs;
127 }
128 else
129 assert(0 && "OpCode must be CALL/JMPL for a call instr");
130
131 assert( (NumArgs != -1) && "Internal error in getCallInstNumArgs" );
132 return (unsigned) NumArgs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000133}
134
135
Vikram S. Adve53fec862001-10-22 13:41:12 +0000136
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000137//---------------------------------------------------------------------------
138// Finds whether a call is an indirect call
139//---------------------------------------------------------------------------
140bool UltraSparcRegInfo::isVarArgCall(const MachineInstr *CallMI) const {
141
142 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
143
144 const MachineOperand & calleeOp = CallMI->getOperand(0);
145 Value *calleeVal = calleeOp.getVRegValue();
146
147 PointerType *PT = cast<PointerType> (calleeVal->getType());
148 MethodType *MT = cast<MethodType>(PT->getElementType());
149
150 return MT->isVarArg();
151}
152
153
154
155
156//---------------------------------------------------------------------------
157// Suggests a register for the ret address in the RET machine instruction.
158// We always suggest %i7 by convention.
159//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000160void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
161 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000162
Vikram S. Adve53fec862001-10-22 13:41:12 +0000163 assert( (RetMI->getNumOperands() >= 2)
164 && "JMPL/RETURN must have 3 and 2 operands respectively");
165
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000166 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
167
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000168 // return address is always mapped to i7
169 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000170 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000171
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000172 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000173 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000174 // we have to test later whether it received the suggested color.
175 // In that case, a LR has to be created at the start of method.
176 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000177
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000178 // const Value *RetAddrVal = MO.getVRegValue();
179 // assert( RetAddrVal && "LR for ret address must be created at start");
180 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
181 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
182 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000183}
184
185
186//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000187// Suggests a register for the ret address in the JMPL/CALL machine instr.
188// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000189//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000190void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
191 LiveRangeInfo& LRI,
192 vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000193
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000194
195 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
196
197 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
198 // create a new LR for the return address and color it
199
200 LiveRange * RetAddrLR = new LiveRange();
201 RetAddrLR->add( RetAddrVal );
202 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
203 RetAddrLR->setRegClass( RCList[RegClassID] );
204 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
205 LRI.addLRToMap( RetAddrVal, RetAddrLR);
206
Ruchira Sasanka91442282001-09-30 23:16:47 +0000207}
208
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000209
210
Ruchira Sasanka91442282001-09-30 23:16:47 +0000211
212//---------------------------------------------------------------------------
213// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000214// According to the Sparc ABI, the first 6 incoming args are in
215// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000216// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000217// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000218//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000219void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *const Meth,
220 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000221{
222
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000223 // get the argument list
224 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
225 // get an iterator to arg list
226 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattner20b1ea02001-09-14 03:47:57 +0000227
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000228 // for each argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000229 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000230
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000231 // get the LR of arg
232 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000233 assert( LR && "No live range found for method arg");
234
235 unsigned RegType = getRegType( LR );
236
Chris Lattner20b1ea02001-09-14 03:47:57 +0000237
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000238 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000239 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000240 if( RegType == IntRegType ) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000241
Ruchira Sasanka91442282001-09-30 23:16:47 +0000242 if( argNo < NumOfIntArgRegs) {
243 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000244 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000245 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000246 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000247 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000248 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000249
Chris Lattner20b1ea02001-09-14 03:47:57 +0000250 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000251 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
252 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
253
254
255 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
256 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
257
Chris Lattner20b1ea02001-09-14 03:47:57 +0000258 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000259}
260
Ruchira Sasanka91442282001-09-30 23:16:47 +0000261
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000262
263//---------------------------------------------------------------------------
264// This method is called after graph coloring to move incoming args to
265// the correct hardware registers if they did not receive the correct
266// (suggested) color through graph coloring.
267//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000268void UltraSparcRegInfo::colorMethodArgs(const Method *const Meth,
269 LiveRangeInfo& LRI,
270 AddedInstrns *const FirstAI) const {
271
272 // get the argument list
273 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
274 // get an iterator to arg list
275 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
276
277 MachineInstr *AdMI;
278
279
280 // for each argument
281 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
282
283 // get the LR of arg
284 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
285 assert( LR && "No live range found for method arg");
286
287
Ruchira Sasanka91442282001-09-30 23:16:47 +0000288 unsigned RegType = getRegType( LR );
289 unsigned RegClassID = (LR->getRegClass())->getID();
290
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000291 // Find whether this argument is coming in a register (if not, on stack)
292 // Also find the correct register that the argument must go (UniArgReg)
293 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000294 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000295 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000296
297 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
298 isArgInReg = true;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000299 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000300 }
301 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
302 isArgInReg = true;
303 UniArgReg = getUnifiedRegNum( RegClassID,
304 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
305 }
306 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
307 isArgInReg = true;
308 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
309 }
310
311
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000312 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000313
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000314 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
315
316 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000317 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000318 if( UniLRReg == UniArgReg )
319 continue;
320
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000321 // We are here because the LR did not receive the suggested
322 // but LR received another register.
323 // Now we have to copy the %i reg (or stack pos of arg)
324 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000325
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000326 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000327 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000328 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000329 if( isArgInReg )
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000330 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000331
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000332 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000333
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000334 // Now the arg is coming on stack. Since the LR recieved a register,
335 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000336 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000337 const MachineFrameInfo& frameInfo = target.getFrameInfo();
338 assert(frameInfo.argsOnStackHaveFixedSize());
339
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000340 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000341 int firstArg =
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000342 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
343 growUp);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000344 int offsetFromFP =
345 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
346 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
347
348 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000349 UniLRReg, RegType );
350 }
351
352 FirstAI->InstrnsBefore.push_back( AdMI );
353
354 } // if LR received a color
355
356 else {
357
358 // Now, the LR did not receive a color. But it has a stack offset for
359 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000360 // So, if the arg is coming in UniArgReg register, we can just move
361 // that on to the stack pos of LR
362
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000363 if( isArgInReg ) {
364
365 MachineInstr *AdIBef =
366 cpReg2MemMI(UniArgReg, getFramePointer(),
367 LR->getSpillOffFromFP(), RegType );
368
369 FirstAI->InstrnsBefore.push_back( AdMI );
370 }
371
372 else {
373
374 // Now the arg is coming on stack. Since the LR did NOT
375 // recieved a register as well, it is allocated a stack position. We
376 // can simply change the stack poistion of the LR. We can do this,
377 // since this method is called before any other method that makes
378 // uses of the stack pos of the LR (e.g., updateMachineInstr)
379
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000380 const MachineFrameInfo& frameInfo = target.getFrameInfo();
381 assert(frameInfo.argsOnStackHaveFixedSize());
382
383 bool growUp;
384 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
385 int offsetFromFP =
386 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
387 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
388
389 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000390 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000391
392 }
393
Ruchira Sasanka91442282001-09-30 23:16:47 +0000394 } // for each incoming argument
395
396}
397
Chris Lattner20b1ea02001-09-14 03:47:57 +0000398
399
400
Ruchira Sasanka91442282001-09-30 23:16:47 +0000401//---------------------------------------------------------------------------
402// This method is called before graph coloring to suggest colors to the
403// outgoing call args and the return value of the call.
404//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000405void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000406 LiveRangeInfo& LRI,
407 vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000408
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000409 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000410
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000411 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000412
Chris Lattner20b1ea02001-09-14 03:47:57 +0000413
Ruchira Sasanka91442282001-09-30 23:16:47 +0000414 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000415 // will be in %o0 if the value is an integer type, or in %f0 if the
416 // value is a float type.
417
Ruchira Sasanka91442282001-09-30 23:16:47 +0000418 // the return value cannot have a LR in machine instruction since it is
419 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000420
Ruchira Sasanka91442282001-09-30 23:16:47 +0000421 // if type is not void, create a new live range and set its
422 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000423
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000424
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000425 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000426
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000427
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000428 if( RetVal ) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000429
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000430 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
431 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000432
433
434 // create a new LR for the return value
435
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000436 LiveRange * RetValLR = new LiveRange();
437 RetValLR->add( RetVal );
438 unsigned RegClassID = getRegClassIDOfValue( RetVal );
439 RetValLR->setRegClass( RCList[RegClassID] );
440 LRI.addLRToMap( RetVal, RetValLR);
441
442 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000443
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000444 if( RegClassID == IntRegClassID )
445 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
446 else if (RegClassID == FloatRegClassID )
447 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
448 else assert( 0 && "Unknown reg class for return value of call\n");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000449
Chris Lattner20b1ea02001-09-14 03:47:57 +0000450 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000451
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000452
Ruchira Sasanka91442282001-09-30 23:16:47 +0000453 // Now suggest colors for arguments (operands) of the call instruction.
454 // Colors are suggested only if the arg number is smaller than the
455 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000456 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000457
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000458 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000459
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000460 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
461
462 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000463
464 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000465 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000466
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000467 // not possible to have a null LR since all args (even consts)
468 // must be defined before
469 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000470 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000471 cerr << " ERROR: In call instr, no LR for arg: " ;
472 printValue(CallArg); cerr << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000473 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000474 assert(0 && "NO LR for call arg");
475 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000476 }
477
478 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000479
Ruchira Sasanka91442282001-09-30 23:16:47 +0000480 // if the arg is in int class - allocate a reg for an int arg
481 if( RegType == IntRegType ) {
482
483 if( argNo < NumOfIntArgRegs)
484 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
485
486 else if (DEBUG_RA)
487 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000488 cerr << " Regr not suggested for int call arg" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000489
Ruchira Sasanka91442282001-09-30 23:16:47 +0000490 }
491 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
492 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
493
494
495 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
496 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
497
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000498
Ruchira Sasanka91442282001-09-30 23:16:47 +0000499 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000500
Chris Lattner20b1ea02001-09-14 03:47:57 +0000501}
502
503
Ruchira Sasanka91442282001-09-30 23:16:47 +0000504//---------------------------------------------------------------------------
505// After graph coloring, we have call this method to see whehter the return
506// value and the call args received the correct colors. If not, we have
507// to instert copy instructions.
508//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000509
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000510void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000511 LiveRangeInfo& LRI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000512 AddedInstrns *const CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000513 PhyRegAlloc &PRA,
514 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000515
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000516 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
517
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000518 // Reset the optional args area in the stack frame
519 // since that is reused for each call
520 //
521 PRA.mcInfo.resetOptionalArgs(target);
522
Ruchira Sasanka91442282001-09-30 23:16:47 +0000523 // First color the return value of the call.
524 // If there is a LR for the return value, it means this
525 // method returns a value
526
527 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000528
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000529 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000530
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000531 if( RetVal ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000532
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000533 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000534
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000535 if( !RetValLR ) {
536 cerr << "\nNo LR for:";
537 printValue( RetVal );
538 cerr << endl;
539 assert( RetValLR && "ERR:No LR for non-void return value");
540 //return;
541 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000542
543 unsigned RegClassID = (RetValLR->getRegClass())->getID();
544 bool recvCorrectColor = false;
545
546 unsigned CorrectCol; // correct color for ret value
547 if(RegClassID == IntRegClassID)
548 CorrectCol = SparcIntRegOrder::o0;
549 else if(RegClassID == FloatRegClassID)
550 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000551 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000552 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000553 return;
554 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000555
556 // if the LR received the correct color, NOTHING to do
557
558 if( RetValLR->hasColor() )
559 if( RetValLR->getColor() == CorrectCol )
560 recvCorrectColor = true;
561
562
563 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000564 // put copy instruction
565
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000566 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000567
568 unsigned RegType = getRegType( RetValLR );
569
570 // the reg that LR must be colored with
571 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000572
573 if( RetValLR->hasColor() ) {
574
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000575 unsigned
576 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000577
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000578 // the return value is coming in UniRetReg but has to go into
579 // the UniRetLRReg
580
581 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000582
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000583 } // if LR has color
584 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000585
586 // if the LR did NOT receive a color, we have to move the return
587 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000588
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000589 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
590 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000591 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000592
593 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000594
595 } // the LR didn't receive the suggested color
596
597 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000598
599
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000600 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000601 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000602 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000603
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000604 vector <MachineInstr *> AddedInstrnsBefore;
605
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000606 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000607
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000608 bool VarArgCall = isVarArgCall( CallMI );
609
610 if(VarArgCall) cerr << "\nVar arg call found!!\n";
611
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000612 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
613
614 const Value *CallArg = CallMI->getImplicitRef(i);
615
Ruchira Sasanka91442282001-09-30 23:16:47 +0000616 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000617 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000618
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000619 unsigned RegType = getRegType( CallArg );
620 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000621
622 // find whether this argument is coming in a register (if not, on stack)
623
624 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000625 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000626
627 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
628 isArgInReg = true;
629 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
630 }
631 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
632 isArgInReg = true;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000633
634 if( !VarArgCall )
635 UniArgReg = getUnifiedRegNum(RegClassID,
636 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
637 else {
638 // a variable argument call - must pass float arg in %o's
639 if( argNo < NumOfIntArgRegs)
640 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
641 else
642 isArgInReg = false;
643 }
644
Ruchira Sasanka91442282001-09-30 23:16:47 +0000645 }
646 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
647 isArgInReg = true;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000648
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000649 if( !VarArgCall )
650 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
651 else {
652 // a variable argument call - must pass float arg in %o's
653 if( argNo < NumOfIntArgRegs)
654 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
655 else
656 isArgInReg = false;
657 }
658 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000659
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000660 // not possible to have a null LR since all args (even consts)
661 // must be defined before
662 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000663 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000664 cerr << " ERROR: In call instr, no LR for arg: " ;
665 printValue(CallArg); cerr << endl;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000666 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000667 assert(0 && "NO LR for call arg");
668 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000669 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000670
Ruchira Sasanka91442282001-09-30 23:16:47 +0000671
Ruchira Sasanka91442282001-09-30 23:16:47 +0000672 if( LR->hasColor() ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000673
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000674
675 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
676
677 // if LR received the correct color, nothing to do
678 if( UniLRReg == UniArgReg )
679 continue;
680
Ruchira Sasanka91442282001-09-30 23:16:47 +0000681 // We are here because though the LR is allocated a register, it
682 // was not allocated the suggested register. So, we have to copy %ix reg
683 // (or stack pos of arg) to the register it was colored with
684
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000685 // the LR is colored with UniLRReg but has to go into UniArgReg
686 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000687
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000688 if( isArgInReg ) {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000689
690 if( VarArgCall && RegClassID == FloatRegClassID ) {
691
692
693 // for a variable argument call, the float reg must go in a %o reg.
694 // We have to move a float reg to an int reg via memory.
695 // The store instruction will be directly added to
696 // CallAI->InstrnsBefore since it does not need reordering
697 //
698 int TmpOff = PRA.mcInfo.pushTempValue(target,
699 getSpilledRegSize(RegType));
700
701 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
702 CallAI->InstrnsBefore.push_back( AdMI );
703
704 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
705 AddedInstrnsBefore.push_back( AdMI );
706 }
707
708 else {
709 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
710 AddedInstrnsBefore.push_back( AdMI );
711 }
712
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000713 }
714
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000715 else {
716 // Now, we have to pass the arg on stack. Since LR received a register
717 // we just have to move that register to the stack position where
718 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000719
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000720 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000721
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000722 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000723
724 // Now add the instruction. We can directly add to
725 // CallAI->InstrnsBefore since we are just saving a reg on stack
726 //
727 CallAI->InstrnsBefore.push_back( AdMI );
728
729 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000730 }
731
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000732
Ruchira Sasanka91442282001-09-30 23:16:47 +0000733 }
734
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000735 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000736
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000737 if( isArgInReg ) {
738
739 // Now the LR did NOT recieve a register but has a stack poistion.
740 // Since, the outgoing arg goes in a register we just have to insert
741 // a load instruction to load the LR to outgoing register
742
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000743 if( VarArgCall && RegClassID == FloatRegClassID )
744 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
745 UniArgReg, IntRegType );
746 else
747 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
748 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000749
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000750 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000751 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000752 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000753
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000754 else {
755 // Now, we have to pass the arg on stack. Since LR also did NOT
756 // receive a register we have to move an argument in memory to
757 // outgoing parameter on stack.
758
759 // Optoimize: Optimize when reverse pointers in MahineInstr are
760 // introduced.
761 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
762 // fails, then use the following code. Currently, we cannot call the
763 // above method since we cannot find LVSetBefore without the BB
764
Ruchira Sasanka295264d2001-11-15 20:25:07 +0000765 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000766
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000767 int TmpOff = PRA.mcInfo.pushTempValue(target,
768 getSpilledRegSize(getRegType(LR)) );
769
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000770
771 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
772
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000773 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000774
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000775 // Sequence:
776 // (1) Save TReg on stack
777 // (2) Load LR value into TReg from stack pos of LR
778 // (3) Store Treg on outgoing Arg pos on stack
779 // (4) Load the old value of TReg from stack to TReg (restore it)
780
781 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
782 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
783 TReg, RegType );
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000784 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000785 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000786
787 // We directly add to CallAI->InstrnsBefore instead of adding to
788 // AddedInstrnsBefore since these instructions must not be
789 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000790
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000791 CallAI->InstrnsBefore.push_back( Ad1 );
792 CallAI->InstrnsBefore.push_back( Ad2 );
793 CallAI->InstrnsBefore.push_back( Ad3 );
794 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000795
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000796 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000797 }
798
Ruchira Sasanka91442282001-09-30 23:16:47 +0000799 }
800
801 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000802
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000803
804 // if we added any instruction before the call instruction, verify
805 // that they are in the proper order and if not, reorder them
806
807 if( ! AddedInstrnsBefore.empty() ) {
808
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000809 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000810 cerr << "\nCalling reorder with instrns: \n";
811 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
812 cerr << *(AddedInstrnsBefore[i]);
813 }
814
815 vector <MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000816 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000817
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000818 if( DEBUG_RA ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000819 cerr << "\nAfter reordering instrns: \n";
820 for(unsigned i=0; i < TmpVec.size(); i++)
821 cerr << *(TmpVec[i]);
822 }
823
824 // copy the results back from TmpVec to InstrnsBefore
825 for(unsigned i=0; i < TmpVec.size(); i++)
826 CallAI->InstrnsBefore.push_back( TmpVec[i] );
827 }
828
829
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000830 // now insert caller saving code for this call instruction
831 //
832 insertCallerSavingCode(CallMI, BB, PRA);
833
834
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000835 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000836 PRA.mcInfo.resetOptionalArgs(target);
837
838
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000839}
840
Ruchira Sasanka91442282001-09-30 23:16:47 +0000841//---------------------------------------------------------------------------
842// This method is called for an LLVM return instruction to identify which
843// values will be returned from this method and to suggest colors.
844//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000845void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000846 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000847
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000848 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000849
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000850 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000851
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000852 // if there is an implicit ref, that has to be the ret value
853 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000854
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000855 // The first implicit operand is the return value of a return instr
856 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000857
858 MachineInstr *AdMI;
859 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000860
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000861 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000862 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000863 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000864 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000865 assert( LR && "No LR for return value of non-void method");
866 //return;
867 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000868
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000869 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000870
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000871 if( RegClassID == IntRegClassID )
872 LR->setSuggestedColor(SparcIntRegOrder::i0);
873
874 else if ( RegClassID == FloatRegClassID )
875 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000876
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000877 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000878
Ruchira Sasanka91442282001-09-30 23:16:47 +0000879}
880
Ruchira Sasanka91442282001-09-30 23:16:47 +0000881
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000882
883//---------------------------------------------------------------------------
884// Colors the return value of a method to %i0 or %f0, if possible. If it is
885// not possilbe to directly color the LR, insert a copy instruction to move
886// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
887// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000888//---------------------------------------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000889void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000890 LiveRangeInfo& LRI,
891 AddedInstrns *const RetAI) const {
892
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000893 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000894
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000895 // if there is an implicit ref, that has to be the ret value
896 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000897
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000898 // The first implicit operand is the return value of a return instr
899 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000900
901 MachineInstr *AdMI;
902 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
903
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000904 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000905 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000906 printValue( RetVal );
Chris Lattner1e23ed72001-10-15 18:15:27 +0000907 cerr << endl;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000908 // assert( LR && "No LR for return value of non-void method");
909 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000910 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000911
Ruchira Sasanka91442282001-09-30 23:16:47 +0000912 unsigned RegClassID = getRegClassIDOfValue(RetVal);
913 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000914
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000915 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000916 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000917 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000918 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000919 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000920 else {
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000921 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000922 return;
923 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000924
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000925 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000926
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000927 if( LR->hasColor() )
928 if( LR->getColor() == CorrectCol )
929 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000930
931 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000932
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000933 if( LR->hasColor() ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000934
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000935 // We are here because the LR was allocted a regiter
936 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000937
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000938 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000939
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000940 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000941
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000942 // the LR received UniLRReg but must be colored with UniRetReg
943 // to pass as the return value
944
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000945 AdMI = cpReg2RegMI( UniLRReg, UniRetReg, RegType);
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000946 RetAI->InstrnsBefore.push_back( AdMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000947 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000948 else { // if the LR is spilled
Ruchira Sasanka91442282001-09-30 23:16:47 +0000949
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000950 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
951 UniRetReg, RegType);
952 RetAI->InstrnsBefore.push_back( AdMI );
953 cout << "\nCopied the return value from stack";
954 }
955
Ruchira Sasanka91442282001-09-30 23:16:47 +0000956 } // if there is a return value
957
958}
959
960
961//---------------------------------------------------------------------------
962// Copy from a register to register. Register number must be the unified
963// register number
964//---------------------------------------------------------------------------
965
Ruchira Sasanka91442282001-09-30 23:16:47 +0000966MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
967 const unsigned DestReg,
968 const int RegType) const {
969
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000970 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000971 "Invalid Register");
972
973 MachineInstr * MI = NULL;
974
975 switch( RegType ) {
976
977 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000978 case IntCCRegType:
979 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000980 MI = new MachineInstr(ADD, 3);
981 MI->SetMachineOperand(0, SrcReg, false);
982 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
983 MI->SetMachineOperand(2, DestReg, true);
984 break;
985
986 case FPSingleRegType:
987 MI = new MachineInstr(FMOVS, 2);
988 MI->SetMachineOperand(0, SrcReg, false);
989 MI->SetMachineOperand(1, DestReg, true);
990 break;
991
992 case FPDoubleRegType:
993 MI = new MachineInstr(FMOVD, 2);
994 MI->SetMachineOperand(0, SrcReg, false);
995 MI->SetMachineOperand(1, DestReg, true);
996 break;
997
998 default:
999 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001000 }
1001
1002 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001003}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001004
1005
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001006//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001007// Copy from a register to memory (i.e., Store). Register number must
1008// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001009//---------------------------------------------------------------------------
1010
1011
1012MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
1013 const unsigned DestPtrReg,
1014 const int Offset,
1015 const int RegType) const {
1016
1017
1018 MachineInstr * MI = NULL;
1019
1020 switch( RegType ) {
1021
1022 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001023 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001024 MI = new MachineInstr(STX, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001025 MI->SetMachineOperand(0, SrcReg, false);
1026 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001027 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1028 (int64_t) Offset, false);
1029 break;
1030
1031 case FPSingleRegType:
1032 MI = new MachineInstr(ST, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001033 MI->SetMachineOperand(0, SrcReg, false);
1034 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001035 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1036 (int64_t) Offset, false);
1037 break;
1038
1039 case FPDoubleRegType:
1040 MI = new MachineInstr(STD, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001041 MI->SetMachineOperand(0, SrcReg, false);
1042 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001043 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1044 (int64_t) Offset, false);
1045 break;
1046
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001047 case IntCCRegType:
1048 assert( 0 && "Cannot directly store %ccr to memory");
1049
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001050 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001051 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001052 }
1053
1054 return MI;
1055}
1056
1057
1058//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001059// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001060// register number
1061//---------------------------------------------------------------------------
1062
1063
1064MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
1065 const int Offset,
1066 const unsigned DestReg,
1067 const int RegType) const {
1068
1069 MachineInstr * MI = NULL;
1070
1071 switch( RegType ) {
1072
1073 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001074 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001075 MI = new MachineInstr(LDX, 3);
1076 MI->SetMachineOperand(0, SrcPtrReg, false);
1077 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1078 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001079 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001080 break;
1081
1082 case FPSingleRegType:
1083 MI = new MachineInstr(LD, 3);
1084 MI->SetMachineOperand(0, SrcPtrReg, false);
1085 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1086 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001087 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001088
1089 break;
1090
1091 case FPDoubleRegType:
1092 MI = new MachineInstr(LDD, 3);
1093 MI->SetMachineOperand(0, SrcPtrReg, false);
1094 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1095 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001096 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001097 break;
1098
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001099 case IntCCRegType:
1100 assert( 0 && "Cannot directly load into %ccr from memory");
1101
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001102 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001103 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001104 }
1105
1106 return MI;
1107}
1108
1109
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001110
1111
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001112
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001113//---------------------------------------------------------------------------
1114// Generate a copy instruction to copy a value to another. Temporarily
1115// used by PhiElimination code.
1116//---------------------------------------------------------------------------
1117
1118
1119MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1120
1121 int RegType = getRegType( Src );
1122
1123 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001124
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001125 MachineInstr * MI = NULL;
1126
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001127 switch( RegType ) {
1128
1129 case IntRegType:
1130
1131 MI = new MachineInstr(ADD, 3);
1132 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1133 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1134 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1135 break;
1136
1137 case FPSingleRegType:
1138 MI = new MachineInstr(FMOVS, 2);
1139 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1140 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1141 break;
1142
1143
1144 case FPDoubleRegType:
1145 MI = new MachineInstr(FMOVD, 2);
1146 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1147 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1148 break;
1149
1150 default:
1151 assert(0 && "Unknow RegType in CpValu2Value");
1152 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001153
1154 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001155}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001156
1157
1158
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001159
1160
1161
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001162//----------------------------------------------------------------------------
1163// This method inserts caller saving/restoring instructons before/after
1164// a call machine instruction.
1165//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001166
Ruchira Sasanka91442282001-09-30 23:16:47 +00001167
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001168void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1169 const BasicBlock *BB,
1170 PhyRegAlloc &PRA) const {
1171 // assert( (getInstrInfo()).isCall( MInst->getOpCode() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001172
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001173 // Clear the temp area of the stack
Ruchira Sasanka31133752001-11-15 22:03:04 +00001174 //PRA.mcInfo.popAllTempValues(target);
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001175 // TODO*** Don't do this since we can have a situation like
Ruchira Sasanka31133752001-11-15 22:03:04 +00001176 /*
1177
1178 stx %o1 %i6 1999 <--- inserted by this code
1179 stx %o5 %i6 2007
1180
1181 *****
1182 stx %o1 %i6 2007 ???? <-- inserted by statck2stack call arg
1183
1184 */
1185
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001186
1187 hash_set<unsigned> PushedRegSet;
1188
1189 // Now find the LR of the return value of the call
1190 // The last *implicit operand* is the return value of a call
1191 // Insert it to to he PushedRegSet since we must not save that register
1192 // and restore it after the call.
1193 // We do this because, we look at the LV set *after* the instruction
1194 // to determine, which LRs must be saved across calls. The return value
1195 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001196
1197
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001198 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001199
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001200 if( RetVal ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001201
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001202 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1203 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001204
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001205 if( RetValLR->hasColor())
1206 PushedRegSet.insert(
1207 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001208 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001209 }
1210
1211
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001212 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001213
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001214 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001215
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001216 // for each live var in live variable set after machine inst
1217 for( ; LIt != LVSetAft->end(); ++LIt) {
1218
1219 // get the live range corresponding to live var
1220 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1221
1222 // LR can be null if it is a const since a const
1223 // doesn't have a dominating def - see Assumptions above
1224 if( LR ) {
1225
1226 if( LR->hasColor() ) {
1227
1228 unsigned RCID = (LR->getRegClass())->getID();
1229 unsigned Color = LR->getColor();
1230
1231 if ( isRegVolatile(RCID, Color) ) {
1232
1233 // if the value is in both LV sets (i.e., live before and after
1234 // the call machine instruction)
1235
1236 unsigned Reg = getUnifiedRegNum(RCID, Color);
1237
1238 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1239
1240 // if we haven't already pushed that register
1241
1242 unsigned RegType = getRegType( LR );
1243
1244 // Now get two instructions - to push on stack and pop from stack
1245 // and add them to InstrnsBefore and InstrnsAfter of the
1246 // call instruction
1247
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001248
1249 int StackOff = PRA.mcInfo.pushTempValue(target,
1250 getSpilledRegSize(RegType));
1251
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001252
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001253 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001254 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001255
1256
1257 //---- Insert code for pushing the reg on stack ----------
1258
1259 if( RegType == IntCCRegType ) {
1260
1261 // Handle IntCCRegType specially since we cannot directly
1262 // push %ccr on to the stack
1263
1264 const LiveVarSet *LVSetBef =
1265 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1266
1267 // get a free INTEGER register
1268 int FreeIntReg =
Ruchira Sasanka295264d2001-11-15 20:25:07 +00001269 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001270 LVSetBef, AdIBefCC, AdIAftCC);
1271
1272 // insert the instructions in reverse order since we are
1273 // adding them to the front of InstrnsBefore
1274
1275 if(AdIAftCC)
1276 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1277
1278 AdICpCC = cpCCR2IntMI(FreeIntReg);
1279 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1280
1281 if(AdIBefCC)
1282 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1283
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001284 if(DEBUG_RA) {
1285 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1286 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1287 cerr << "\t" << *AdICpCC;
1288 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1289 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001290
1291 } else {
1292 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001293 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001294 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1295 }
1296
1297
1298 //---- Insert code for popping the reg from the stack ----------
1299
1300 if( RegType == IntCCRegType ) {
1301
1302 // Handle IntCCRegType specially since we cannot directly
1303 // pop %ccr on from the stack
1304
1305 // get a free INT register
1306 int FreeIntReg =
Ruchira Sasanka295264d2001-11-15 20:25:07 +00001307 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001308 LVSetAft, AdIBefCC, AdIAftCC);
1309
1310 if(AdIBefCC)
1311 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1312
1313 AdICpCC = cpInt2CCRMI(FreeIntReg);
1314 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1315
1316 if(AdIAftCC)
1317 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1318
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001319 if(DEBUG_RA) {
1320
1321 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1322 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1323 cerr << "\t" << *AdICpCC;
1324 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1325 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001326
1327 } else {
1328 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001329 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001330 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001331 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001332
1333 PushedRegSet.insert( Reg );
1334
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001335 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001336 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001337 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Adve9576b152001-11-06 05:01:54 +00001338 if( RegType == IntCCRegType )
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001339 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001340 else
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001341 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001342 }
1343 } // if not already pushed
1344
1345 } // if LR has a volatile color
1346
1347 } // if LR has color
1348
1349 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001350
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001351 } // for each value in the LV set after instruction
1352
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001353 // Clear the temp area of the stack
Ruchira Sasanka31133752001-11-15 22:03:04 +00001354 // PRA.mcInfo.popAllTempValues(target);
1355 // TODO *** see above call - optimize later
1356
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001357
Ruchira Sasanka91442282001-09-30 23:16:47 +00001358}
1359
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001360//---------------------------------------------------------------------------
1361// Copies %ccr into an integer register. IntReg is the UNIFIED register
1362// number.
1363//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001364
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001365MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1366 MachineInstr * MI = NULL;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001367
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001368 MI = new MachineInstr(RDCCR, 2);
1369 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1370 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001371
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001372 return MI;
1373}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001374
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001375//---------------------------------------------------------------------------
1376// Copies an integer register into %ccr. IntReg is the UNIFIED register
1377// number.
1378//---------------------------------------------------------------------------
1379
1380MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1381 MachineInstr * MI = NULL;
1382
1383 MI = new MachineInstr(WRCCR, 3);
1384 MI->SetMachineOperand(0, IntReg, false);
1385 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1386 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1387
1388 return MI;
1389}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001390
1391
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001392
1393
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001394//---------------------------------------------------------------------------
1395// Print the register assigned to a LR
1396//---------------------------------------------------------------------------
1397
1398void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1399
1400 unsigned RegClassID = (LR->getRegClass())->getID();
1401
Chris Lattner1e23ed72001-10-15 18:15:27 +00001402 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001403
1404 if( ! LR->hasColor() ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001405 cerr << " - could not find a color" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001406 return;
1407 }
1408
1409 // if a color is found
1410
Chris Lattner1e23ed72001-10-15 18:15:27 +00001411 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001412
1413 if( RegClassID == IntRegClassID ) {
1414
Chris Lattner1e23ed72001-10-15 18:15:27 +00001415 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) ;
1416 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001417 }
1418 else if ( RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001419 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001420 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +00001421 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
1422 cerr << "]" << endl;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001423 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001424}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001425
1426//---------------------------------------------------------------------------
1427// This method examines instructions inserted by RegAlloc code before a
1428// machine instruction to detect invalid orders that destroy values before
1429// they are used. If it detects such conditions, it reorders the instructions.
1430//
1431// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001432// instructions inserted by RegAlloc. All such instruction MUST have
1433// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001434
1435// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1436// this method is called.
1437
1438// This method uses two vectors for efficiency in accessing
1439
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001440// Since instructions are inserted in RegAlloc, this assumes that the
1441// first operand is the source reg and the last operand is the dest reg.
1442
1443// All the uses are before THE def to a register
1444
1445
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001446//---------------------------------------------------------------------------
1447void UltraSparcRegInfo::OrderAddedInstrns( vector<MachineInstr *> &UnordVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001448 vector<MachineInstr *> &OrdVec,
1449 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001450
1451 /*
1452 Problem: We can have instructions inserted by RegAlloc like
1453 1. add %ox %g0 %oy
1454 2. add %oy %g0 %oz, where z!=x or z==x
1455
1456 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001457
1458 Solution:
1459 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001460
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001461 Algorithm:
1462
1463 do
1464 for each instruction 'DefInst' in the UnOrdVec
1465 for each instruction 'UseInst' that follows the DefInst
1466 if the reg defined by DefInst is used by UseInst
1467 mark DefInst as not movable in this iteration
1468 If DefInst is not marked as not-movable, move DefInst to OrdVec
1469 while all instructions in DefInst are moved to OrdVec
1470
1471 For moving, we call the move2OrdVec(). It checks whether there is a def
1472 in it for the uses in the instruction to be added to OrdVec. If there
1473 are no preceding defs, it just appends the instruction. If there is a
1474 preceding def, it puts two instructions to save the reg on stack before
1475 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001476
1477 */
1478
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001479
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001480 bool CouldMoveAll;
1481 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001482
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001483 do {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001484
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001485 CouldMoveAll = true;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001486
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001487 vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001488
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001489 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001490
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001491 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001492
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001493 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001494
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001495 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001496
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001497 //cerr << "\nInst in UnordVec = " << *DefInst;
1498
1499 // last operand is the def (unless for a store which has no def reg)
1500 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1501
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001502 if( DefOp.opIsDef() &&
1503 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001504
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001505 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001506
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001507 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001508
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001509 vector<MachineInstr *>::iterator UseIt = DefIt;
1510 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001511
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001512 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1513
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001514 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001515 if( UseInst == NULL) continue;
1516
1517 // for each inst (UseInst) that is below the DefInst do ...
1518
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001519
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001520 MachineOperand& UseOp = UseInst->getOperand(0);
1521
1522 if( ! UseOp.opIsDef() &&
1523 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1524
1525 // if use is a register ...
1526
1527 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1528
1529 // if Def and this use are the same, it means that this use
1530 // is destroyed by a def before it is used
1531
1532 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001533
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001534 DefEqUse = true;
1535 CouldMoveAll = false;
1536 DebugPrint = true;
1537 break;
1538 } // if two registers are equal
1539
1540 } // if use is a register
1541
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001542 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001543
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001544 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001545
1546 // after examining all the instructions that follow the DefInst
1547 // if there are no dependencies, we can move it to the OrdVec
1548
1549 // cerr << "Moved to Ord: " << *DefInst;
1550
1551 moveInst2OrdVec(OrdVec, DefInst, PRA);
1552
1553 //OrdVec.push_back(DefInst);
1554
1555 // mark the pos of DefInst with NULL to indicate that it is
1556 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001557 *DefIt = NULL;
1558 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001559
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001560 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001561
1562 } // for all instructions in the UnordVec
1563
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001564
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001565 } while( !CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001566
1567
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001568 if(DebugPrint) {
1569 cerr << "\nAdded instructions were reordered to:\n";
1570 for(unsigned int i=0; i < OrdVec.size(); i++)
1571 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001572 }
1573
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001574}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001575
1576
1577
1578
1579
1580
1581
1582
1583void UltraSparcRegInfo::moveInst2OrdVec(vector<MachineInstr *> &OrdVec,
1584 MachineInstr *UnordInst,
1585 PhyRegAlloc &PRA ) const {
1586
1587 MachineOperand& UseOp = UnordInst->getOperand(0);
1588
1589 if( ! UseOp.opIsDef() &&
1590 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1591
1592 // for the use of UnordInst, see whether there is a defining instr
1593 // before in the OrdVec
1594 bool DefEqUse = false;
1595
1596 vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
1597
1598 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1599
1600 MachineInstr *OrdInst = *OrdIt ;
1601
1602 MachineOperand& DefOp =
1603 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1604
1605 if( DefOp.opIsDef() &&
1606 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1607
1608 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1609
1610 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1611
1612 // we are here because there is a preceding def in the OrdVec
1613 // for the use in this intr we are going to insert. This
1614 // happened because the original code was like:
1615 // 1. add %ox %g0 %oy
1616 // 2. add %oy %g0 %ox
1617 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1618 // Now we are processing %ox of 1.
1619 // We have to
1620
1621 const int UReg = DefOp.getMachineRegNum();
1622 const int RegType = getRegType(UReg);
1623 MachineInstr *AdIBef, *AdIAft;
1624
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001625 const int StackOff = PRA.mcInfo.pushTempValue(target,
1626 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001627
1628 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001629 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001630 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1631 OrdIt++; // points to current instr we processed
1632
1633 // Load directly into DReg (%oy)
1634 MachineOperand& DOp=
1635 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1636 assert(DOp.opIsDef() && "Last operand is not the def");
1637 const int DReg = DOp.getMachineRegNum();
1638
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001639 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001640 OrdVec.push_back(AdIAft);
1641
1642 cerr << "\nFixed CIRCULAR references by reordering";
1643
1644 if( DEBUG_RA ) {
1645 cerr << "\nBefore CIRCULAR Reordering:\n";
1646 cerr << *UnordInst;
1647 cerr << *OrdInst;
1648
1649 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1650 for(unsigned i=0; i < OrdVec.size(); i++)
1651 cerr << *(OrdVec[i]);
1652 }
1653
1654 // Do not copy the UseInst to OrdVec
1655 DefEqUse = true;
1656 break;
1657
1658 }// if two registers are equal
1659
1660 } // if Def is a register
1661
1662 } // for each instr in OrdVec
1663
1664 if( !DefEqUse ) {
1665
1666 // We didn't find a def in the OrdVec, so just append this inst
1667 OrdVec.push_back( UnordInst );
1668 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1669 }
1670
1671 }// if the operand in UnordInst is a use
1672
1673}
1674
1675
1676
1677
1678
1679