blob: 72160c68394721a26ce8d88396f89ed405cdea4b [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfdab462001-09-14 20:31:39 +00008#include "llvm/Target/Sparc.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00009#include "SparcInternals.h"
10#include "llvm/Method.h"
11#include "llvm/iTerminators.h"
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +000012#include "llvm/iOther.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000013#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000014#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000015#include "llvm/CodeGen/PhyRegAlloc.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000016#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000017#include <iostream>
18using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000019
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000020//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000021// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000022//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +000023const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000024UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000025 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +000026 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +000027
Chris Lattner7f74a562002-01-20 22:54:45 +000028 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000029
30 // The one before the last implicit operand is the return value of
31 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000032 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +000033 if( NumOfImpRefs > 1 )
34 if( CallMI->implicitRefIsDefined(NumOfImpRefs-2) )
35 return CallMI->getImplicitRef(NumOfImpRefs-2);
36
Chris Lattner7f74a562002-01-20 22:54:45 +000037 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000038
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000039 // The last implicit operand is the return value of a JMPL
40 //
Chris Lattner7f74a562002-01-20 22:54:45 +000041 if(NumOfImpRefs > 0)
42 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
43 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +000044 }
45 else
46 assert(0 && "OpCode must be CALL/JMPL for a call instr");
47
48 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +000049}
50
Ruchira Sasanka24729a32001-10-21 16:43:41 +000051
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000052
53//---------------------------------------------------------------------------
54// Finds the return address of a call sparc specific call instruction
55//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +000056const 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");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000066
Ruchira Sasanka24729a32001-10-21 16:43:41 +000067 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000068 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +000069 return CallMI->getImplicitRef(NumOfImpRefs-1);
70
71 }
Vikram S. Adve84982772001-10-22 13:41:12 +000072 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000073
74 MachineOperand & MO = ( MachineOperand &) CallMI->getOperand(2);
75 return MO.getVRegValue();
76
77 }
78 else
79 assert(0 && "OpCode must be CALL/JMPL for a call instr");
80
81 assert(0 && "There must be a return addr for a call instr");
82
83 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +000084}
85
86
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000087
Ruchira Sasanka24729a32001-10-21 16:43:41 +000088//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +000089// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +000090//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +000091const unsigned
92UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
93
94 unsigned OpCode = CallMI->getOpCode();
95 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
96 int NumArgs = -1;
97
98 if( OpCode == CALL ) {
99
100 switch( NumOfImpRefs ) {
101
102 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
103
104 case 1: NumArgs = 0;
105 break;
106
107 default: // two or more implicit refs
108 if( CallMI->implicitRefIsDefined(NumOfImpRefs-2) )
109 NumArgs = NumOfImpRefs - 2; // i.e., NumOfImpRef-2 is the ret val
110 else
111 NumArgs = NumOfImpRefs - 1;
112 }
113
114 }
Vikram S. Adve84982772001-10-22 13:41:12 +0000115 else if( OpCode == JMPLCALL ) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000116
117 // The last implicit operand is the return value of a JMPL instr
118 if( NumOfImpRefs > 0 ) {
119 if( CallMI->implicitRefIsDefined(NumOfImpRefs-1) )
120 NumArgs = NumOfImpRefs - 1; // i.e., NumOfImpRef-1 is the ret val
121 else
122 NumArgs = NumOfImpRefs;
123 }
124 else
125 NumArgs = NumOfImpRefs;
126 }
127 else
128 assert(0 && "OpCode must be CALL/JMPL for a call instr");
129
130 assert( (NumArgs != -1) && "Internal error in getCallInstNumArgs" );
131 return (unsigned) NumArgs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000132}
133
134
Vikram S. Adve84982772001-10-22 13:41:12 +0000135
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000136//---------------------------------------------------------------------------
137// Finds whether a call is an indirect call
138//---------------------------------------------------------------------------
139bool UltraSparcRegInfo::isVarArgCall(const MachineInstr *CallMI) const {
140
141 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
142
143 const MachineOperand & calleeOp = CallMI->getOperand(0);
144 Value *calleeVal = calleeOp.getVRegValue();
145
146 PointerType *PT = cast<PointerType> (calleeVal->getType());
147 MethodType *MT = cast<MethodType>(PT->getElementType());
148
149 return MT->isVarArg();
150}
151
152
153
154
155//---------------------------------------------------------------------------
156// Suggests a register for the ret address in the RET machine instruction.
157// We always suggest %i7 by convention.
158//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000159void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr * RetMI,
160 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000161
Vikram S. Adve84982772001-10-22 13:41:12 +0000162 assert( (RetMI->getNumOperands() >= 2)
163 && "JMPL/RETURN must have 3 and 2 operands respectively");
164
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000165 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
166
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000167 // return address is always mapped to i7
168 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000169 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000170
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000171 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000172 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000173 // we have to test later whether it received the suggested color.
174 // In that case, a LR has to be created at the start of method.
175 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000176
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000177 // const Value *RetAddrVal = MO.getVRegValue();
178 // assert( RetAddrVal && "LR for ret address must be created at start");
179 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
180 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
181 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000182}
183
184
185//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000186// Suggests a register for the ret address in the JMPL/CALL machine instr.
187// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000188//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000189void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
190 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000191 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000192
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000193
194 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
195
196 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
197 // create a new LR for the return address and color it
198
199 LiveRange * RetAddrLR = new LiveRange();
200 RetAddrLR->add( RetAddrVal );
201 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
202 RetAddrLR->setRegClass( RCList[RegClassID] );
203 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
204 LRI.addLRToMap( RetAddrVal, RetAddrLR);
205
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000206}
207
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000208
209
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000210
211//---------------------------------------------------------------------------
212// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000213// According to the Sparc ABI, the first 6 incoming args are in
214// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000215// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000216// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000217//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000218void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *const Meth,
219 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000220{
221
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000222 // get the argument list
223 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
224 // get an iterator to arg list
225 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000226
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000227 // for each argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000228 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000229
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000230 // get the LR of arg
231 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000232 assert( LR && "No live range found for method arg");
233
234 unsigned RegType = getRegType( LR );
235
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000236
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000237 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000238 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000239 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000240
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000241 if( argNo < NumOfIntArgRegs) {
242 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000243 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000244 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000245 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000246 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000247 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000248
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000249 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000250 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
251 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
252
253
254 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
255 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
256
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000257 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000258}
259
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000260
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000261
262//---------------------------------------------------------------------------
263// This method is called after graph coloring to move incoming args to
264// the correct hardware registers if they did not receive the correct
265// (suggested) color through graph coloring.
266//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000267void UltraSparcRegInfo::colorMethodArgs(const Method *const Meth,
268 LiveRangeInfo& LRI,
269 AddedInstrns *const FirstAI) const {
270
271 // get the argument list
272 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
273 // get an iterator to arg list
274 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
275
276 MachineInstr *AdMI;
277
278
279 // for each argument
280 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
281
282 // get the LR of arg
283 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
284 assert( LR && "No live range found for method arg");
285
286
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000287 unsigned RegType = getRegType( LR );
288 unsigned RegClassID = (LR->getRegClass())->getID();
289
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000290 // Find whether this argument is coming in a register (if not, on stack)
291 // Also find the correct register that the argument must go (UniArgReg)
292 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000293 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000294 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000295
296 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
297 isArgInReg = true;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000298 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000299 }
300 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
301 isArgInReg = true;
302 UniArgReg = getUnifiedRegNum( RegClassID,
303 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
304 }
305 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
306 isArgInReg = true;
307 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
308 }
309
310
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000311 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000312
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000313 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
314
315 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000316 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000317 if( UniLRReg == UniArgReg )
318 continue;
319
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000320 // We are here because the LR did not receive the suggested
321 // but LR received another register.
322 // Now we have to copy the %i reg (or stack pos of arg)
323 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000324
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000325 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000326 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000327 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000328 if( isArgInReg )
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000329 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000330
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000331 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000332
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000333 // Now the arg is coming on stack. Since the LR recieved a register,
334 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000336 const MachineFrameInfo& frameInfo = target.getFrameInfo();
337 assert(frameInfo.argsOnStackHaveFixedSize());
338
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000339 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000340 int firstArg =
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000341 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
342 growUp);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000343 int offsetFromFP =
344 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
345 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
346
347 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000348 UniLRReg, RegType );
349 }
350
351 FirstAI->InstrnsBefore.push_back( AdMI );
352
353 } // if LR received a color
354
355 else {
356
357 // Now, the LR did not receive a color. But it has a stack offset for
358 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000359 // So, if the arg is coming in UniArgReg register, we can just move
360 // that on to the stack pos of LR
361
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000362 if( isArgInReg ) {
Chris Lattner7f74a562002-01-20 22:54:45 +0000363 cpReg2MemMI(UniArgReg, getFramePointer(),
364 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000365
366 FirstAI->InstrnsBefore.push_back( AdMI );
367 }
368
369 else {
370
371 // Now the arg is coming on stack. Since the LR did NOT
372 // recieved a register as well, it is allocated a stack position. We
373 // can simply change the stack poistion of the LR. We can do this,
374 // since this method is called before any other method that makes
375 // uses of the stack pos of the LR (e.g., updateMachineInstr)
376
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000377 const MachineFrameInfo& frameInfo = target.getFrameInfo();
378 assert(frameInfo.argsOnStackHaveFixedSize());
379
380 bool growUp;
381 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
382 int offsetFromFP =
383 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
384 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
385
386 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000387 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000388
389 }
390
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000391 } // for each incoming argument
392
393}
394
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000395
396
397
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000398//---------------------------------------------------------------------------
399// This method is called before graph coloring to suggest colors to the
400// outgoing call args and the return value of the call.
401//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000402void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000403 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000404 std::vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000405
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000406 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000407
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000408 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000409
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000410
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000411 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000412 // will be in %o0 if the value is an integer type, or in %f0 if the
413 // value is a float type.
414
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000415 // the return value cannot have a LR in machine instruction since it is
416 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000417
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000418 // if type is not void, create a new live range and set its
419 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000420
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000421
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000422 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000423
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000424
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000425 if( RetVal ) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000426
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000427 assert( (! LRI.getLiveRangeForValue( RetVal ) ) &&
428 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000429
430
431 // create a new LR for the return value
432
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000433 LiveRange * RetValLR = new LiveRange();
434 RetValLR->add( RetVal );
435 unsigned RegClassID = getRegClassIDOfValue( RetVal );
436 RetValLR->setRegClass( RCList[RegClassID] );
437 LRI.addLRToMap( RetVal, RetValLR);
438
439 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000440
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000441 if( RegClassID == IntRegClassID )
442 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
443 else if (RegClassID == FloatRegClassID )
444 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
445 else assert( 0 && "Unknown reg class for return value of call\n");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000446
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000447 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000448
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000449
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000450 // Now suggest colors for arguments (operands) of the call instruction.
451 // Colors are suggested only if the arg number is smaller than the
452 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000453 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000454
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000455 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000456
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000457 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
458
459 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000460
461 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000462 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000463
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000464 // not possible to have a null LR since all args (even consts)
465 // must be defined before
466 if( !LR ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000467 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000468 cerr << " ERROR: In call instr, no LR for arg: " ;
Chris Lattner7f74a562002-01-20 22:54:45 +0000469 printValue(CallArg); cerr << "\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000470 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000471 assert(0 && "NO LR for call arg");
472 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000473 }
474
475 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000476
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000477 // if the arg is in int class - allocate a reg for an int arg
478 if( RegType == IntRegType ) {
479
480 if( argNo < NumOfIntArgRegs)
481 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
482
483 else if (DEBUG_RA)
484 // Do NOTHING as this will be colored as a normal value.
Chris Lattner7f74a562002-01-20 22:54:45 +0000485 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000486
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000487 }
488 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
489 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
490
491
492 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
493 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
494
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000495
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000496 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000497
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000498}
499
500
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000501//---------------------------------------------------------------------------
502// After graph coloring, we have call this method to see whehter the return
503// value and the call args received the correct colors. If not, we have
504// to instert copy instructions.
505//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000506
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000507void UltraSparcRegInfo::colorCallArgs(const MachineInstr *const CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000508 LiveRangeInfo& LRI,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000509 AddedInstrns *const CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000510 PhyRegAlloc &PRA,
511 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000512
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000513 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
514
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000515 // Reset the optional args area in the stack frame
516 // since that is reused for each call
517 //
518 PRA.mcInfo.resetOptionalArgs(target);
519
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000520 // First color the return value of the call.
521 // If there is a LR for the return value, it means this
522 // method returns a value
523
524 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000525
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000526 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000527
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000528 if( RetVal ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000529
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000530 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000531
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000532 if( !RetValLR ) {
533 cerr << "\nNo LR for:";
534 printValue( RetVal );
Chris Lattner7f74a562002-01-20 22:54:45 +0000535 cerr << "\n";
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000536 assert( RetValLR && "ERR:No LR for non-void return value");
537 //return;
538 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000539
540 unsigned RegClassID = (RetValLR->getRegClass())->getID();
541 bool recvCorrectColor = false;
542
543 unsigned CorrectCol; // correct color for ret value
544 if(RegClassID == IntRegClassID)
545 CorrectCol = SparcIntRegOrder::o0;
546 else if(RegClassID == FloatRegClassID)
547 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000548 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000549 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000550 return;
551 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000552
553 // if the LR received the correct color, NOTHING to do
554
555 if( RetValLR->hasColor() )
556 if( RetValLR->getColor() == CorrectCol )
557 recvCorrectColor = true;
558
559
560 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000561 // put copy instruction
562
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000563 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000564
565 unsigned RegType = getRegType( RetValLR );
566
567 // the reg that LR must be colored with
568 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000569
570 if( RetValLR->hasColor() ) {
571
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000572 unsigned
573 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000574
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000575 // the return value is coming in UniRetReg but has to go into
576 // the UniRetLRReg
577
578 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000579
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000580 } // if LR has color
581 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000582
583 // if the LR did NOT receive a color, we have to move the return
584 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000586 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
587 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000588 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000589
590 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000591
592 } // the LR didn't receive the suggested color
593
594 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000595
596
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000597 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000598 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000599 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000600
Chris Lattner7f74a562002-01-20 22:54:45 +0000601 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000602
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000603 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000605 bool VarArgCall = isVarArgCall( CallMI );
606
607 if(VarArgCall) cerr << "\nVar arg call found!!\n";
608
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000609 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
610
611 const Value *CallArg = CallMI->getImplicitRef(i);
612
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000613 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000614 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000615
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000616 unsigned RegType = getRegType( CallArg );
617 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000618
619 // find whether this argument is coming in a register (if not, on stack)
620
621 bool isArgInReg = false;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000622 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000623
624 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
625 isArgInReg = true;
626 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
627 }
628 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
629 isArgInReg = true;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000630
631 if( !VarArgCall )
632 UniArgReg = getUnifiedRegNum(RegClassID,
633 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
634 else {
635 // a variable argument call - must pass float arg in %o's
636 if( argNo < NumOfIntArgRegs)
637 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
638 else
639 isArgInReg = false;
640 }
641
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000642 }
643 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
644 isArgInReg = true;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000645
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000646 if( !VarArgCall )
647 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
648 else {
649 // a variable argument call - must pass float arg in %o's
650 if( argNo < NumOfIntArgRegs)
651 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
652 else
653 isArgInReg = false;
654 }
655 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000656
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000657 // not possible to have a null LR since all args (even consts)
658 // must be defined before
659 if( !LR ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000660 if( DEBUG_RA) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000661 cerr << " ERROR: In call instr, no LR for arg: " ;
Chris Lattner7f74a562002-01-20 22:54:45 +0000662 printValue(CallArg); cerr << "\n";
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000663 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000664 assert(0 && "NO LR for call arg");
665 // continue;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000666 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000667
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000668
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000669 if( LR->hasColor() ) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000670
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000671
672 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
673
674 // if LR received the correct color, nothing to do
675 if( UniLRReg == UniArgReg )
676 continue;
677
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000678 // We are here because though the LR is allocated a register, it
679 // was not allocated the suggested register. So, we have to copy %ix reg
680 // (or stack pos of arg) to the register it was colored with
681
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000682 // the LR is colored with UniLRReg but has to go into UniArgReg
683 // to pass it as an argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000684
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000685 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000686
687 if( VarArgCall && RegClassID == FloatRegClassID ) {
688
689
690 // for a variable argument call, the float reg must go in a %o reg.
691 // We have to move a float reg to an int reg via memory.
692 // The store instruction will be directly added to
693 // CallAI->InstrnsBefore since it does not need reordering
694 //
695 int TmpOff = PRA.mcInfo.pushTempValue(target,
696 getSpilledRegSize(RegType));
697
698 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
699 CallAI->InstrnsBefore.push_back( AdMI );
700
701 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
702 AddedInstrnsBefore.push_back( AdMI );
703 }
704
705 else {
706 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
707 AddedInstrnsBefore.push_back( AdMI );
708 }
709
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000710 }
711
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000712 else {
713 // Now, we have to pass the arg on stack. Since LR received a register
714 // we just have to move that register to the stack position where
715 // the argument must be passed
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000716
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000717 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000718
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000719 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000720
721 // Now add the instruction. We can directly add to
722 // CallAI->InstrnsBefore since we are just saving a reg on stack
723 //
724 CallAI->InstrnsBefore.push_back( AdMI );
725
726 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000727 }
728
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000729
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000730 }
731
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000732 else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000733
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000734 if( isArgInReg ) {
735
736 // Now the LR did NOT recieve a register but has a stack poistion.
737 // Since, the outgoing arg goes in a register we just have to insert
738 // a load instruction to load the LR to outgoing register
739
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000740 if( VarArgCall && RegClassID == FloatRegClassID )
741 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
742 UniArgReg, IntRegType );
743 else
744 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
745 UniArgReg, RegType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000746
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000747 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000748 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000749 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000750
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000751 else {
752 // Now, we have to pass the arg on stack. Since LR also did NOT
753 // receive a register we have to move an argument in memory to
754 // outgoing parameter on stack.
755
756 // Optoimize: Optimize when reverse pointers in MahineInstr are
757 // introduced.
758 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
759 // fails, then use the following code. Currently, we cannot call the
760 // above method since we cannot find LVSetBefore without the BB
761
Ruchira Sasankac97ccc52001-11-15 20:25:07 +0000762 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000763
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000764 int TmpOff = PRA.mcInfo.pushTempValue(target,
765 getSpilledRegSize(getRegType(LR)) );
766
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000767
768 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
769
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000770 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000771
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000772 // Sequence:
773 // (1) Save TReg on stack
774 // (2) Load LR value into TReg from stack pos of LR
775 // (3) Store Treg on outgoing Arg pos on stack
776 // (4) Load the old value of TReg from stack to TReg (restore it)
777
778 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
779 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
780 TReg, RegType );
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000781 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000782 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000783
784 // We directly add to CallAI->InstrnsBefore instead of adding to
785 // AddedInstrnsBefore since these instructions must not be
786 // reordered.
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000787
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000788 CallAI->InstrnsBefore.push_back( Ad1 );
789 CallAI->InstrnsBefore.push_back( Ad2 );
790 CallAI->InstrnsBefore.push_back( Ad3 );
791 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000792
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000793 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000794 }
795
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000796 }
797
798 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000799
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000800
801 // if we added any instruction before the call instruction, verify
802 // that they are in the proper order and if not, reorder them
803
804 if( ! AddedInstrnsBefore.empty() ) {
805
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000806 if( DEBUG_RA ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000807 cerr << "\nCalling reorder with instrns: \n";
808 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
809 cerr << *(AddedInstrnsBefore[i]);
810 }
811
Chris Lattner7f74a562002-01-20 22:54:45 +0000812 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000813 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000814
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000815 if( DEBUG_RA ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000816 cerr << "\nAfter reordering instrns: \n";
817 for(unsigned i=0; i < TmpVec.size(); i++)
818 cerr << *(TmpVec[i]);
819 }
820
821 // copy the results back from TmpVec to InstrnsBefore
822 for(unsigned i=0; i < TmpVec.size(); i++)
823 CallAI->InstrnsBefore.push_back( TmpVec[i] );
824 }
825
826
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000827 // now insert caller saving code for this call instruction
828 //
829 insertCallerSavingCode(CallMI, BB, PRA);
830
831
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000832 // Reset optional args area again to be safe
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000833 PRA.mcInfo.resetOptionalArgs(target);
834
835
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000836}
837
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000838//---------------------------------------------------------------------------
839// This method is called for an LLVM return instruction to identify which
840// values will be returned from this method and to suggest colors.
841//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000842void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000843 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000844
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000845 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000846
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000847 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000848
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000849 // if there is an implicit ref, that has to be the ret value
850 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000851
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000852 // The first implicit operand is the return value of a return instr
853 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000854
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000855 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000856
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000857 if( !LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000858 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000859 printValue( RetVal );
Chris Lattner7f74a562002-01-20 22:54:45 +0000860 cerr << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000861 assert( LR && "No LR for return value of non-void method");
862 //return;
863 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000864
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000865 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000866
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000867 if( RegClassID == IntRegClassID )
868 LR->setSuggestedColor(SparcIntRegOrder::i0);
869
870 else if ( RegClassID == FloatRegClassID )
871 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000872
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000873 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000874
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000875}
876
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000878
879//---------------------------------------------------------------------------
880// Colors the return value of a method to %i0 or %f0, if possible. If it is
881// not possilbe to directly color the LR, insert a copy instruction to move
882// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
883// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000884//---------------------------------------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000885void UltraSparcRegInfo::colorRetValue(const MachineInstr *const RetMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000886 LiveRangeInfo& LRI,
887 AddedInstrns *const RetAI) const {
888
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000889 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000890
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000891 // if there is an implicit ref, that has to be the ret value
892 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000893
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000894 // The first implicit operand is the return value of a return instr
895 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000896
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000897 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
898
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000899 if( ! LR ) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000900 cerr << "\nNo LR for:";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000901 printValue( RetVal );
Chris Lattner7f74a562002-01-20 22:54:45 +0000902 cerr << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000903 // assert( LR && "No LR for return value of non-void method");
904 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000905 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000906
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000907 unsigned RegClassID = getRegClassIDOfValue(RetVal);
908 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000909
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000910 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000911 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000912 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000913 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000914 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000915 else {
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000916 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000917 return;
918 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000919
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000920 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000921
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000922 if( LR->hasColor() )
923 if( LR->getColor() == CorrectCol )
924 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000925
926 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000927
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000928 if( LR->hasColor() ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000929
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000930 // We are here because the LR was allocted a regiter
931 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000932
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000933 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000934
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000935 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000936
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000937 // the LR received UniLRReg but must be colored with UniRetReg
938 // to pass as the return value
Chris Lattner7f74a562002-01-20 22:54:45 +0000939 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000940 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000941 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +0000942 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
943 LR->getSpillOffFromFP(),
944 UniRetReg, RegType);
945 RetAI->InstrnsBefore.push_back(AdMI);
946 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000947 }
948
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000949 } // if there is a return value
950
951}
952
953
954//---------------------------------------------------------------------------
955// Copy from a register to register. Register number must be the unified
956// register number
957//---------------------------------------------------------------------------
958
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000959MachineInstr * UltraSparcRegInfo::cpReg2RegMI(const unsigned SrcReg,
960 const unsigned DestReg,
961 const int RegType) const {
962
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000963 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964 "Invalid Register");
965
966 MachineInstr * MI = NULL;
967
968 switch( RegType ) {
969
970 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +0000971 case IntCCRegType:
972 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000973 MI = new MachineInstr(ADD, 3);
974 MI->SetMachineOperand(0, SrcReg, false);
975 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
976 MI->SetMachineOperand(2, DestReg, true);
977 break;
978
979 case FPSingleRegType:
980 MI = new MachineInstr(FMOVS, 2);
981 MI->SetMachineOperand(0, SrcReg, false);
982 MI->SetMachineOperand(1, DestReg, true);
983 break;
984
985 case FPDoubleRegType:
986 MI = new MachineInstr(FMOVD, 2);
987 MI->SetMachineOperand(0, SrcReg, false);
988 MI->SetMachineOperand(1, DestReg, true);
989 break;
990
991 default:
992 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000993 }
994
995 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000996}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000997
998
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000999//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001000// Copy from a register to memory (i.e., Store). Register number must
1001// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001002//---------------------------------------------------------------------------
1003
1004
1005MachineInstr * UltraSparcRegInfo::cpReg2MemMI(const unsigned SrcReg,
1006 const unsigned DestPtrReg,
1007 const int Offset,
1008 const int RegType) const {
1009
1010
1011 MachineInstr * MI = NULL;
1012
1013 switch( RegType ) {
1014
1015 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001016 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001017 MI = new MachineInstr(STX, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001018 MI->SetMachineOperand(0, SrcReg, false);
1019 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001020 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1021 (int64_t) Offset, false);
1022 break;
1023
1024 case FPSingleRegType:
1025 MI = new MachineInstr(ST, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001026 MI->SetMachineOperand(0, SrcReg, false);
1027 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001028 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1029 (int64_t) Offset, false);
1030 break;
1031
1032 case FPDoubleRegType:
1033 MI = new MachineInstr(STD, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001034 MI->SetMachineOperand(0, SrcReg, false);
1035 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001036 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1037 (int64_t) Offset, false);
1038 break;
1039
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001040 case IntCCRegType:
1041 assert( 0 && "Cannot directly store %ccr to memory");
1042
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001043 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001044 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001045 }
1046
1047 return MI;
1048}
1049
1050
1051//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001052// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001053// register number
1054//---------------------------------------------------------------------------
1055
1056
1057MachineInstr * UltraSparcRegInfo::cpMem2RegMI(const unsigned SrcPtrReg,
1058 const int Offset,
1059 const unsigned DestReg,
1060 const int RegType) const {
1061
1062 MachineInstr * MI = NULL;
1063
1064 switch( RegType ) {
1065
1066 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001067 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001068 MI = new MachineInstr(LDX, 3);
1069 MI->SetMachineOperand(0, SrcPtrReg, false);
1070 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1071 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001072 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001073 break;
1074
1075 case FPSingleRegType:
1076 MI = new MachineInstr(LD, 3);
1077 MI->SetMachineOperand(0, SrcPtrReg, false);
1078 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1079 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001080 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001081
1082 break;
1083
1084 case FPDoubleRegType:
1085 MI = new MachineInstr(LDD, 3);
1086 MI->SetMachineOperand(0, SrcPtrReg, false);
1087 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1088 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001089 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001090 break;
1091
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001092 case IntCCRegType:
1093 assert( 0 && "Cannot directly load into %ccr from memory");
1094
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001095 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001096 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001097 }
1098
1099 return MI;
1100}
1101
1102
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001103
1104
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001105
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001106//---------------------------------------------------------------------------
1107// Generate a copy instruction to copy a value to another. Temporarily
1108// used by PhiElimination code.
1109//---------------------------------------------------------------------------
1110
1111
1112MachineInstr * UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const{
1113
1114 int RegType = getRegType( Src );
1115
1116 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001117
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001118 MachineInstr * MI = NULL;
1119
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001120 switch( RegType ) {
1121
1122 case IntRegType:
1123
1124 MI = new MachineInstr(ADD, 3);
1125 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1126 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1127 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1128 break;
1129
1130 case FPSingleRegType:
1131 MI = new MachineInstr(FMOVS, 2);
1132 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1133 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1134 break;
1135
1136
1137 case FPDoubleRegType:
1138 MI = new MachineInstr(FMOVD, 2);
1139 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1140 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1141 break;
1142
1143 default:
1144 assert(0 && "Unknow RegType in CpValu2Value");
1145 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001146
1147 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001148}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149
1150
1151
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001152
1153
1154
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001155//----------------------------------------------------------------------------
1156// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001157// a call machine instruction. The caller saving/restoring instructions are
1158// inserted like:
1159//
1160// ** caller saving instructions
1161// other instructions inserted for the call by ColorCallArg
1162// CALL instruction
1163// other instructions inserted for the call ColorCallArg
1164// ** caller restoring instructions
1165//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001166//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001167
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001168
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001169void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1170 const BasicBlock *BB,
1171 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001172
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001173 // has set to record which registers were saved/restored
1174 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001175 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001176
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001177 // Now find the LR of the return value of the call
1178 // The last *implicit operand* is the return value of a call
1179 // Insert it to to he PushedRegSet since we must not save that register
1180 // and restore it after the call.
1181 // We do this because, we look at the LV set *after* the instruction
1182 // to determine, which LRs must be saved across calls. The return value
1183 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001184
1185
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001186 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001187
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001188 if( RetVal ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001189
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001190 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
1191 assert( RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001192
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001193 if( RetValLR->hasColor())
1194 PushedRegSet.insert(
1195 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001196 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001197 }
1198
1199
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001200 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001201
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001202 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001203
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001204 // for each live var in live variable set after machine inst
1205 for( ; LIt != LVSetAft->end(); ++LIt) {
1206
1207 // get the live range corresponding to live var
1208 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1209
1210 // LR can be null if it is a const since a const
1211 // doesn't have a dominating def - see Assumptions above
1212 if( LR ) {
1213
1214 if( LR->hasColor() ) {
1215
1216 unsigned RCID = (LR->getRegClass())->getID();
1217 unsigned Color = LR->getColor();
1218
1219 if ( isRegVolatile(RCID, Color) ) {
1220
1221 // if the value is in both LV sets (i.e., live before and after
1222 // the call machine instruction)
1223
1224 unsigned Reg = getUnifiedRegNum(RCID, Color);
1225
1226 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1227
1228 // if we haven't already pushed that register
1229
1230 unsigned RegType = getRegType( LR );
1231
1232 // Now get two instructions - to push on stack and pop from stack
1233 // and add them to InstrnsBefore and InstrnsAfter of the
1234 // call instruction
1235
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001236
1237 int StackOff = PRA.mcInfo.pushTempValue(target,
1238 getSpilledRegSize(RegType));
1239
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001240
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001241 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001242 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001243
1244
1245 //---- Insert code for pushing the reg on stack ----------
1246
1247 if( RegType == IntCCRegType ) {
1248
1249 // Handle IntCCRegType specially since we cannot directly
1250 // push %ccr on to the stack
1251
1252 const LiveVarSet *LVSetBef =
1253 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1254
1255 // get a free INTEGER register
1256 int FreeIntReg =
Ruchira Sasankac97ccc52001-11-15 20:25:07 +00001257 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001258 LVSetBef, AdIBefCC, AdIAftCC);
1259
1260 // insert the instructions in reverse order since we are
1261 // adding them to the front of InstrnsBefore
1262
1263 if(AdIAftCC)
1264 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1265
1266 AdICpCC = cpCCR2IntMI(FreeIntReg);
1267 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1268
1269 if(AdIBefCC)
1270 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1271
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001272 if(DEBUG_RA) {
1273 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1274 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1275 cerr << "\t" << *AdICpCC;
1276 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1277 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001278
1279 } else {
1280 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001281 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001282 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1283 }
1284
1285
1286 //---- Insert code for popping the reg from the stack ----------
1287
1288 if( RegType == IntCCRegType ) {
1289
1290 // Handle IntCCRegType specially since we cannot directly
1291 // pop %ccr on from the stack
1292
1293 // get a free INT register
1294 int FreeIntReg =
Ruchira Sasankac97ccc52001-11-15 20:25:07 +00001295 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001296 LVSetAft, AdIBefCC, AdIAftCC);
1297
1298 if(AdIBefCC)
1299 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1300
1301 AdICpCC = cpInt2CCRMI(FreeIntReg);
1302 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1303
1304 if(AdIAftCC)
1305 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1306
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001307 if(DEBUG_RA) {
1308
1309 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1310 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1311 cerr << "\t" << *AdICpCC;
1312 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1313 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001314
1315 } else {
1316 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001317 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001318 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001319 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001320
1321 PushedRegSet.insert( Reg );
1322
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001323 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001324 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001325 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001326 if( RegType == IntCCRegType )
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001327 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001328 else
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001329 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001330 }
1331 } // if not already pushed
1332
1333 } // if LR has a volatile color
1334
1335 } // if LR has color
1336
1337 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001338
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001339 } // for each value in the LV set after instruction
1340
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001341}
1342
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001343//---------------------------------------------------------------------------
1344// Copies %ccr into an integer register. IntReg is the UNIFIED register
1345// number.
1346//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001347
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001348MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(const unsigned IntReg) const {
1349 MachineInstr * MI = NULL;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001350
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001351 MI = new MachineInstr(RDCCR, 2);
1352 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1353 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001354
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001355 return MI;
1356}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001357
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001358//---------------------------------------------------------------------------
1359// Copies an integer register into %ccr. IntReg is the UNIFIED register
1360// number.
1361//---------------------------------------------------------------------------
1362
1363MachineInstr * UltraSparcRegInfo::cpInt2CCRMI(const unsigned IntReg) const {
1364 MachineInstr * MI = NULL;
1365
1366 MI = new MachineInstr(WRCCR, 3);
1367 MI->SetMachineOperand(0, IntReg, false);
1368 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1369 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
1370
1371 return MI;
1372}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001373
1374
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001375
1376
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001377//---------------------------------------------------------------------------
1378// Print the register assigned to a LR
1379//---------------------------------------------------------------------------
1380
1381void UltraSparcRegInfo::printReg(const LiveRange *const LR) {
1382
1383 unsigned RegClassID = (LR->getRegClass())->getID();
1384
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001385 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001386
1387 if( ! LR->hasColor() ) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001388 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001389 return;
1390 }
1391
1392 // if a color is found
1393
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001394 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001395
1396 if( RegClassID == IntRegClassID ) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001397 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001398
Chris Lattner7f74a562002-01-20 22:54:45 +00001399 } else if ( RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001400 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001401 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001402 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001403 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001404 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001405}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001406
1407//---------------------------------------------------------------------------
1408// This method examines instructions inserted by RegAlloc code before a
1409// machine instruction to detect invalid orders that destroy values before
1410// they are used. If it detects such conditions, it reorders the instructions.
1411//
1412// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001413// instructions inserted by RegAlloc. All such instruction MUST have
1414// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001415
1416// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1417// this method is called.
1418
1419// This method uses two vectors for efficiency in accessing
1420
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001421// Since instructions are inserted in RegAlloc, this assumes that the
1422// first operand is the source reg and the last operand is the dest reg.
1423
1424// All the uses are before THE def to a register
1425
1426
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001427//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001428void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1429 std::vector<MachineInstr *> &OrdVec,
1430 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001431
1432 /*
1433 Problem: We can have instructions inserted by RegAlloc like
1434 1. add %ox %g0 %oy
1435 2. add %oy %g0 %oz, where z!=x or z==x
1436
1437 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001438
1439 Solution:
1440 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001441
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001442 Algorithm:
1443
1444 do
1445 for each instruction 'DefInst' in the UnOrdVec
1446 for each instruction 'UseInst' that follows the DefInst
1447 if the reg defined by DefInst is used by UseInst
1448 mark DefInst as not movable in this iteration
1449 If DefInst is not marked as not-movable, move DefInst to OrdVec
1450 while all instructions in DefInst are moved to OrdVec
1451
1452 For moving, we call the move2OrdVec(). It checks whether there is a def
1453 in it for the uses in the instruction to be added to OrdVec. If there
1454 are no preceding defs, it just appends the instruction. If there is a
1455 preceding def, it puts two instructions to save the reg on stack before
1456 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001457
1458 */
1459
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001460
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001461 bool CouldMoveAll;
1462 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001463
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001464 do {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001465
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001466 CouldMoveAll = true;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001467
Chris Lattner7f74a562002-01-20 22:54:45 +00001468 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001469
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001470 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001471
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001472 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001473
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001474 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001475
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001476 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001477
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001478 //cerr << "\nInst in UnordVec = " << *DefInst;
1479
1480 // last operand is the def (unless for a store which has no def reg)
1481 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1482
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001483 if( DefOp.opIsDef() &&
1484 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001485
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001486 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001487
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001488 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001489
Chris Lattner7f74a562002-01-20 22:54:45 +00001490 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001491 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001492
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001493 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1494
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001495 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001496 if( UseInst == NULL) continue;
1497
1498 // for each inst (UseInst) that is below the DefInst do ...
1499
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001500
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001501 MachineOperand& UseOp = UseInst->getOperand(0);
1502
1503 if( ! UseOp.opIsDef() &&
1504 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1505
1506 // if use is a register ...
1507
1508 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1509
1510 // if Def and this use are the same, it means that this use
1511 // is destroyed by a def before it is used
1512
1513 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001514
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001515 DefEqUse = true;
1516 CouldMoveAll = false;
1517 DebugPrint = true;
1518 break;
1519 } // if two registers are equal
1520
1521 } // if use is a register
1522
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001523 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001524
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001525 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001526
1527 // after examining all the instructions that follow the DefInst
1528 // if there are no dependencies, we can move it to the OrdVec
1529
1530 // cerr << "Moved to Ord: " << *DefInst;
1531
1532 moveInst2OrdVec(OrdVec, DefInst, PRA);
1533
1534 //OrdVec.push_back(DefInst);
1535
1536 // mark the pos of DefInst with NULL to indicate that it is
1537 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538 *DefIt = NULL;
1539 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001541 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001542
1543 } // for all instructions in the UnordVec
1544
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001545
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001546 } while( !CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001547
1548
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001549 if(DebugPrint) {
1550 cerr << "\nAdded instructions were reordered to:\n";
1551 for(unsigned int i=0; i < OrdVec.size(); i++)
1552 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001553 }
1554
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001555}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001556
1557
1558
1559
1560
1561
1562
1563
Chris Lattner7f74a562002-01-20 22:54:45 +00001564void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565 MachineInstr *UnordInst,
1566 PhyRegAlloc &PRA ) const {
1567
1568 MachineOperand& UseOp = UnordInst->getOperand(0);
1569
1570 if( ! UseOp.opIsDef() &&
1571 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1572
1573 // for the use of UnordInst, see whether there is a defining instr
1574 // before in the OrdVec
1575 bool DefEqUse = false;
1576
Chris Lattner7f74a562002-01-20 22:54:45 +00001577 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001578
1579 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1580
1581 MachineInstr *OrdInst = *OrdIt ;
1582
1583 MachineOperand& DefOp =
1584 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1585
1586 if( DefOp.opIsDef() &&
1587 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1588
1589 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1590
1591 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1592
1593 // we are here because there is a preceding def in the OrdVec
1594 // for the use in this intr we are going to insert. This
1595 // happened because the original code was like:
1596 // 1. add %ox %g0 %oy
1597 // 2. add %oy %g0 %ox
1598 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1599 // Now we are processing %ox of 1.
1600 // We have to
1601
1602 const int UReg = DefOp.getMachineRegNum();
1603 const int RegType = getRegType(UReg);
1604 MachineInstr *AdIBef, *AdIAft;
1605
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001606 const int StackOff = PRA.mcInfo.pushTempValue(target,
1607 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001608
1609 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001610 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001611 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1612 OrdIt++; // points to current instr we processed
1613
1614 // Load directly into DReg (%oy)
1615 MachineOperand& DOp=
1616 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1617 assert(DOp.opIsDef() && "Last operand is not the def");
1618 const int DReg = DOp.getMachineRegNum();
1619
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001620 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001621 OrdVec.push_back(AdIAft);
1622
1623 cerr << "\nFixed CIRCULAR references by reordering";
1624
1625 if( DEBUG_RA ) {
1626 cerr << "\nBefore CIRCULAR Reordering:\n";
1627 cerr << *UnordInst;
1628 cerr << *OrdInst;
1629
1630 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1631 for(unsigned i=0; i < OrdVec.size(); i++)
1632 cerr << *(OrdVec[i]);
1633 }
1634
1635 // Do not copy the UseInst to OrdVec
1636 DefEqUse = true;
1637 break;
1638
1639 }// if two registers are equal
1640
1641 } // if Def is a register
1642
1643 } // for each instr in OrdVec
1644
1645 if( !DefEqUse ) {
1646
1647 // We didn't find a def in the OrdVec, so just append this inst
1648 OrdVec.push_back( UnordInst );
1649 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1650 }
1651
1652 }// if the operand in UnordInst is a use
1653
1654}
1655
1656
1657
1658
1659
1660