blob: 8fa0037a3379f09c7d767d933ee5a992e7a3dbc6 [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 Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
Misha Brukman7ae7f842002-10-28 00:28:31 +000010#include "llvm/CodeGen/MachineFunction.h"
Chris Lattnerd47aac92002-12-28 20:21:29 +000011#include "llvm/CodeGen/MachineFunctionInfo.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner1ebaa902003-01-15 17:47:49 +000014#include "llvm/CodeGen/MachineInstrBuilder.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000015#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattner24c1d5e2003-01-14 23:05:08 +000016#include "llvm/CodeGen/FunctionLiveVarInfo.h" // FIXME: Remove
Chris Lattner90fc6652003-01-15 19:50:44 +000017#include "../../CodeGen/RegAlloc/RegAllocCommon.h" // FIXME!
Chris Lattner5216cc52002-02-04 05:59:25 +000018#include "llvm/iTerminators.h"
19#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000020#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000021#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000022using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000023using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000024
Chris Lattner24c1d5e2003-01-14 23:05:08 +000025enum {
26 BadRegClass = ~0
27};
28
Chris Lattner5216cc52002-02-04 05:59:25 +000029UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerf9781b52002-12-29 03:13:05 +000030 : TargetRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner5216cc52002-02-04 05:59:25 +000031 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
32
33 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
34 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
35 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
36 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000037
Chris Lattner56e91662002-08-12 21:25:05 +000038 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000039 "32 Float regs are used for float arg passing");
40}
41
42
Vikram S. Advedb1435f2002-03-18 03:12:16 +000043// getZeroRegNum - returns the register that contains always zero.
44// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000045//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000046int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000047 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
48 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000049}
Chris Lattner5216cc52002-02-04 05:59:25 +000050
51// getCallAddressReg - returns the reg used for pushing the address when a
52// method is called. This can be used for other purposes between calls
53//
54unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000055 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
56 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000057}
58
59// Returns the register containing the return address.
60// It should be made sure that this register contains the return
61// value when a return instruction is reached.
62//
63unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000064 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
65 SparcIntRegClass::i7);
66}
67
68// Register get name implementations...
69
70// Int register names in same order as enum in class SparcIntRegClass
71static const char * const IntRegNames[] = {
72 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
73 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
74 "i0", "i1", "i2", "i3", "i4", "i5",
75 "i6", "i7",
76 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
77 "o6"
78};
79
80const char * const SparcIntRegClass::getRegName(unsigned reg) {
81 assert(reg < NumOfAllRegs);
82 return IntRegNames[reg];
83}
84
85static const char * const FloatRegNames[] = {
86 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
87 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
88 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
89 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
90 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
91 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
92 "f60", "f61", "f62", "f63"
93};
94
95const char * const SparcFloatRegClass::getRegName(unsigned reg) {
96 assert (reg < NumOfAllRegs);
97 return FloatRegNames[reg];
98}
99
100
101static const char * const IntCCRegNames[] = {
102 "xcc", "ccr"
103};
104
105const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
106 assert(reg < 2);
107 return IntCCRegNames[reg];
108}
109
110static const char * const FloatCCRegNames[] = {
111 "fcc0", "fcc1", "fcc2", "fcc3"
112};
113
114const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
115 assert (reg < 4);
116 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000117}
118
119// given the unified register number, this gives the name
120// for generating assembly code or debugging.
121//
Chris Lattner56e91662002-08-12 21:25:05 +0000122const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000123 if( reg < 32 )
Chris Lattner56e91662002-08-12 21:25:05 +0000124 return SparcIntRegClass::getRegName(reg);
Chris Lattner5216cc52002-02-04 05:59:25 +0000125 else if ( reg < (64 + 32) )
Chris Lattner56e91662002-08-12 21:25:05 +0000126 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner5216cc52002-02-04 05:59:25 +0000127 else if( reg < (64+32+4) )
Chris Lattner56e91662002-08-12 21:25:05 +0000128 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner5216cc52002-02-04 05:59:25 +0000129 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner56e91662002-08-12 21:25:05 +0000130 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner5216cc52002-02-04 05:59:25 +0000131 else if (reg== InvalidRegNum) //****** TODO: Remove */
132 return "<*NoReg*>";
133 else
134 assert(0 && "Invalid register number");
135 return "";
136}
137
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000138// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000139unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000140 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
141 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000142}
143
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000144// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000145unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000146 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
147 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000148}
149
150
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000151//---------------------------------------------------------------------------
152// Finds whether a call is an indirect call
153//---------------------------------------------------------------------------
154
155inline bool
156isVarArgsFunction(const Type *funcType) {
157 return cast<FunctionType>(cast<PointerType>(funcType)
158 ->getElementType())->isVarArg();
159}
160
161inline bool
162isVarArgsCall(const MachineInstr *CallMI) {
163 Value* callee = CallMI->getOperand(0).getVRegValue();
164 // const Type* funcType = isa<Function>(callee)? callee->getType()
165 // : cast<PointerType>(callee->getType())->getElementType();
166 const Type* funcType = callee->getType();
167 return isVarArgsFunction(funcType);
168}
169
170
171// Get the register number for the specified integer arg#,
172// assuming there are argNum total args, intArgNum int args,
173// and fpArgNum FP args preceding (and not including) this one.
174// Use INT regs for FP args if this is a varargs call.
175//
176// Return value:
177// InvalidRegNum, if there is no int register available for the arg.
178// regNum, otherwise (this is NOT the unified reg. num).
179//
180inline int
181UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
182 unsigned argNo,
183 unsigned intArgNo, unsigned fpArgNo,
184 unsigned& regClassId) const
185{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000186 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000187 if (argNo >= NumOfIntArgRegs)
188 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000189 else
Chris Lattner56e91662002-08-12 21:25:05 +0000190 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000191}
192
193// Get the register number for the specified FP arg#,
194// assuming there are argNum total args, intArgNum int args,
195// and fpArgNum FP args preceding (and not including) this one.
196// Use INT regs for FP args if this is a varargs call.
197//
198// Return value:
199// InvalidRegNum, if there is no int register available for the arg.
200// regNum, otherwise (this is NOT the unified reg. num).
201//
202inline int
203UltraSparcRegInfo::regNumForFPArg(unsigned regType,
204 bool inCallee, bool isVarArgsCall,
205 unsigned argNo,
206 unsigned intArgNo, unsigned fpArgNo,
207 unsigned& regClassId) const
208{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000209 if (isVarArgsCall)
210 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
211 regClassId);
212 else
213 {
214 regClassId = FloatRegClassID;
215 if (regType == FPSingleRegType)
216 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000217 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000218 else if (regType == FPDoubleRegType)
219 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000220 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000221 else
222 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000223 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000224 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000225}
226
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000227
228//---------------------------------------------------------------------------
229// Finds the return address of a call sparc specific call instruction
230//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000231
Vikram S. Adveaee67012002-07-08 23:23:12 +0000232// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000233// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000234//
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000235int UltraSparcRegInfo::getRegType(const Type* type) const {
236 unsigned regClassID = getRegClassIDOfType(type);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000237 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000238 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000239 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000240 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000241 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000242 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000243 return FPDoubleRegType;
244 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000245 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000246 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000247 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000248 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000249 }
250}
251
Vikram S. Advee9327f02002-05-19 15:25:51 +0000252int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000253 const Type* type = LR->getType();
254
255 unsigned regClassID = LR->getRegClassID();
256 switch (regClassID) {
257 case IntRegClassID: return IntRegType;
258 case FloatRegClassID:
259 if (type == Type::FloatTy)
260 return FPSingleRegType;
261 else if (type == Type::DoubleTy)
262 return FPDoubleRegType;
263 break;
264 assert(0 && "Unknown type in FloatRegClass");
265 case IntCCRegClassID: return IntCCRegType; break;
266 case FloatCCRegClassID: return FloatCCRegType; break;
267 default: assert( 0 && "Unknown reg class ID"); return 0;
268 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000269}
270
Chris Lattner5216cc52002-02-04 05:59:25 +0000271
Vikram S. Adveaee67012002-07-08 23:23:12 +0000272int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
273 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000274 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000275 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000276 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000277 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000278 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000279 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000280 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000281 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000282 return IntCCRegType;
283 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000284 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000285 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000286}
287
288
Vikram S. Adveaee67012002-07-08 23:23:12 +0000289// To find the register class used for a specified Type
290//
291unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000292 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000293 Type::PrimitiveID ty = type->getPrimitiveID();
294 unsigned res;
295
296 // FIXME: Comparing types like this isn't very safe...
297 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
298 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
299 res = IntRegClassID; // sparc int reg (ty=0: void)
300 else if (ty <= Type::DoubleTyID)
301 res = FloatRegClassID; // sparc float reg class
302 else {
303 //std::cerr << "TypeID: " << ty << "\n";
304 assert(0 && "Cannot resolve register class for type");
305 return 0;
306 }
307
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000308 if (isCCReg)
309 return res + 2; // corresponding condition code register
Vikram S. Adveaee67012002-07-08 23:23:12 +0000310 else
311 return res;
312}
313
314// To find the register class to which a specified register belongs
315//
316unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
317 unsigned classId = 0;
318 (void) getClassRegNum(unifiedRegNum, classId);
319 return classId;
320}
321
322unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
323 switch(regType) {
324 case IntRegType: return IntRegClassID;
325 case FPSingleRegType:
326 case FPDoubleRegType: return FloatRegClassID;
327 case IntCCRegType: return IntCCRegClassID;
328 case FloatCCRegType: return FloatCCRegClassID;
329 default:
330 assert(0 && "Invalid register type in getRegClassIDOfRegType");
331 return 0;
332 }
333}
334
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000336// Suggests a register for the ret address in the RET machine instruction.
337// We always suggest %i7 by convention.
338//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000339void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000340 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000341
Vikram S. Adveaee67012002-07-08 23:23:12 +0000342 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000343
Vikram S. Adveaee67012002-07-08 23:23:12 +0000344 // return address is always mapped to i7 so set it immediately
345 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000346 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000347
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000348 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000349 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000350 // we have to test later whether it received the suggested color.
351 // In that case, a LR has to be created at the start of method.
352 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353
Vikram S. Adveaee67012002-07-08 23:23:12 +0000354 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000355 // const Value *RetAddrVal = MO.getVRegValue();
356 // assert( RetAddrVal && "LR for ret address must be created at start");
357 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
358 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000359 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000360}
361
362
363//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000364// Suggests a register for the ret address in the JMPL/CALL machine instr.
365// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000366//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000367void
368UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
369 LiveRangeInfo& LRI) const
370{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000371 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
372 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000373 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000374
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000375 // A LR must already exist for the return address.
376 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
377 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
378
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000379 unsigned RegClassID = RetAddrLR->getRegClassID();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000380 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
381}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000382
383
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000384
385//---------------------------------------------------------------------------
386// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000387// According to the Sparc ABI, the first 6 incoming args are in
388// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000389// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000390// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000391//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000392void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000393 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000394{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000395 // check if this is a varArgs function. needed for choosing regs.
396 bool isVarArgs = isVarArgsFunction(Meth->getType());
397
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000398 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000399 unsigned argNo=0, intArgNo=0, fpArgNo=0;
400 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
401 I != E; ++I, ++argNo) {
402 // get the LR of arg
403 LiveRange *LR = LRI.getLiveRangeForValue(I);
404 assert(LR && "No live range found for method arg");
405
406 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000407 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000408
409 int regNum = (regType == IntRegType)
410 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
411 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
412 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
413 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
414
415 if(regNum != InvalidRegNum)
416 LR->setSuggestedColor(regNum);
417 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000418}
419
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000420
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000421//---------------------------------------------------------------------------
422// This method is called after graph coloring to move incoming args to
423// the correct hardware registers if they did not receive the correct
424// (suggested) color through graph coloring.
425//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000426void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000427 LiveRangeInfo &LRI,
428 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000429
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000430 // check if this is a varArgs function. needed for choosing regs.
431 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000432 MachineInstr *AdMI;
433
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000434 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000435 // for each argument. count INT and FP arguments separately.
436 unsigned argNo=0, intArgNo=0, fpArgNo=0;
437 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
438 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000439 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000440 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000441 assert( LR && "No live range found for method arg");
442
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000443 unsigned regType = getRegType(LR);
444 unsigned RegClassID = LR->getRegClassID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000445
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000446 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000447 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000448 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000450 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000451 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000452
453 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000454 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
455 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
456 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
457 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000458
459 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000460 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000461 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000462 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000463
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000464 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000465
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000466 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
467
468 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000469 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000470 if( UniLRReg == UniArgReg )
471 continue;
472
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000473 // We are here because the LR did not receive the suggested
474 // but LR received another register.
475 // Now we have to copy the %i reg (or stack pos of arg)
476 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000477
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000478 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000479 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000480 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000481 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000482 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000483 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000484
485 // It is a variable argument call: the float reg must go in a %o reg.
486 // We have to move an int reg to a float reg via memory.
487 //
488 assert(isVarArgs &&
489 RegClassID == FloatRegClassID &&
490 regClassIDOfArgReg == IntRegClassID &&
491 "This should only be an Int register for an FP argument");
492
Chris Lattnerd47aac92002-12-28 20:21:29 +0000493 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000494 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000495 cpReg2MemMI(FirstAI->InstrnsBefore,
496 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000497
Vikram S. Adveaee67012002-07-08 23:23:12 +0000498 cpMem2RegMI(FirstAI->InstrnsBefore,
499 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000500 }
501 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000502 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000503 }
504 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000505 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000506
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000507 // Now the arg is coming on stack. Since the LR recieved a register,
508 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000509 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000510 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000511 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000512 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000513 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000514
Vikram S. Adveaee67012002-07-08 23:23:12 +0000515 cpMem2RegMI(FirstAI->InstrnsBefore,
516 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000517 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000518
519 } // if LR received a color
520
521 else {
522
523 // Now, the LR did not receive a color. But it has a stack offset for
524 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000525 // So, if the arg is coming in UniArgReg register, we can just move
526 // that on to the stack pos of LR
527
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000528 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000529
530 if( regClassIDOfArgReg != RegClassID ) {
531 assert(0 &&
532 "FP arguments to a varargs function should be explicitly "
533 "copied to/from int registers by instruction selection!");
534
535 // It must be a float arg for a variable argument call, which
536 // must come in a %o reg. Move the int reg to the stack.
537 //
538 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
539 "This should only be an Int register for an FP argument");
540
Vikram S. Adveaee67012002-07-08 23:23:12 +0000541 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
542 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000543 }
544 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000545 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
546 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000547 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000548 }
549
550 else {
551
552 // Now the arg is coming on stack. Since the LR did NOT
553 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000554 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000555 // since this method is called before any other method that makes
556 // uses of the stack pos of the LR (e.g., updateMachineInstr)
557
Chris Lattnerd47aac92002-12-28 20:21:29 +0000558 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000559 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000560 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000561 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000562
563 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000564 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000565
566 }
567
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000568 } // for each incoming argument
569
570}
571
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000572
573
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000574//---------------------------------------------------------------------------
575// This method is called before graph coloring to suggest colors to the
576// outgoing call args and the return value of the call.
577//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000578void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000579 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000580 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000581
Vikram S. Advee9327f02002-05-19 15:25:51 +0000582 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000583
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000584 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000585
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000586 // First color the return value of the call instruction, if any.
587 // The return value will be in %o0 if the value is an integer type,
588 // or in %f0 if the value is a float type.
589 //
590 if (const Value *RetVal = argDesc->getReturnValue()) {
591 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
592 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000593
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000594 unsigned RegClassID = RetValLR->getRegClassID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000595
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000596 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000597 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000598 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000599 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000600 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000601 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000602 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000603
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604 // Now suggest colors for arguments (operands) of the call instruction.
605 // Colors are suggested only if the arg number is smaller than the
606 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000607 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000608
Vikram S. Advee9327f02002-05-19 15:25:51 +0000609 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000610
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000611 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
612 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000613
Vikram S. Advee9327f02002-05-19 15:25:51 +0000614 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000615
616 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000617 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000618 assert (LR && "Must have a LR for all arguments since "
619 "all args (even consts) must be defined before");
620
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000621 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000622 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000623
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000624 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000625 // an INT or FP value. Here we ignore whether or not it is a
626 // varargs calls, because FP arguments will be explicitly copied
627 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000628 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000629 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
630 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
631 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
632 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000633
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000634 // If a register could be allocated, use it.
635 // If not, do NOTHING as this will be colored as a normal value.
636 if(regNum != InvalidRegNum)
637 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000638
Vikram S. Advee9327f02002-05-19 15:25:51 +0000639 // Repeat for the second copy of the argument, which would be
640 // an FP argument being passed to a function with no prototype
641 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
642 if (argCopy != NULL)
643 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000644 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000645 && "Must be passing copy of FP argument in int register");
646 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
647 argNo, intArgNo, fpArgNo-1,
648 regClassIDOfArgReg);
649 assert(copyRegNum != InvalidRegNum);
650 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
651 copyLR->setSuggestedColor(copyRegNum);
652 }
653
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000654 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000655
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000656}
657
658
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000659//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000660// Helper method for UltraSparcRegInfo::colorCallArgs().
661//---------------------------------------------------------------------------
662
663void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000664UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000665 AddedInstrns *CallAI,
666 PhyRegAlloc &PRA, LiveRange* LR,
667 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000668 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000669 std::vector<MachineInstr *>& AddedInstrnsBefore)
670 const
671{
672 MachineInstr *AdMI;
673 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000674 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000675 if (UniArgRegOrNone != InvalidRegNum)
676 {
677 isArgInReg = true;
678 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000679 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000680 }
681
682 if (LR->hasColor()) {
683 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
684
685 // if LR received the correct color, nothing to do
686 if( isArgInReg && UniArgReg == UniLRReg )
687 return;
688
689 // The LR is allocated to a register UniLRReg and must be copied
690 // to UniArgReg or to the stack slot.
691 //
692 if( isArgInReg ) {
693 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000694 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000695 }
696 else {
697 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000698 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000699 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000700 cpReg2MemMI(CallAI->InstrnsBefore,
701 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000702 }
703
704 } else { // LR is not colored (i.e., spilled)
705
706 if( isArgInReg ) {
707 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000708 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
709 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000710 // Now add the instruction
711 }
712
713 else {
714 // Now, we have to pass the arg on stack. Since LR also did NOT
715 // receive a register we have to move an argument in memory to
716 // outgoing parameter on stack.
717 // Use TReg to load and store the value.
718 // Use TmpOff to save TReg, since that may have a live value.
719 //
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000720 int TReg = PRA.getUniRegNotUsedByThisInst(LR->getRegClass(), CallMI);
Chris Lattnerd47aac92002-12-28 20:21:29 +0000721 int TmpOff = PRA.MF.getInfo()->
722 pushTempValue(getSpilledRegSize(getRegType(LR)));
723 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000724 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000725
726 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
727
728 // Sequence:
729 // (1) Save TReg on stack
730 // (2) Load LR value into TReg from stack pos of LR
731 // (3) Store Treg on outgoing Arg pos on stack
732 // (4) Load the old value of TReg from stack to TReg (restore it)
733 //
734 // OPTIMIZE THIS:
735 // When reverse pointers in MahineInstr are introduced:
736 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
737 // needed only if this fails. Currently, we cannot call the
738 // above method since we cannot find LVSetBefore without the BB
739 //
740 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
741 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000742 cpReg2MemMI(CallAI->InstrnsBefore,
743 TReg, getFramePointer(), TmpOff, regType);
744 cpMem2RegMI(CallAI->InstrnsBefore,
745 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
746 cpReg2MemMI(CallAI->InstrnsBefore,
747 TReg, getStackPointer(), argOffset, regType);
748 cpMem2RegMI(CallAI->InstrnsBefore,
749 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000750 }
751 }
752}
753
754//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000755// After graph coloring, we have call this method to see whehter the return
756// value and the call args received the correct colors. If not, we have
757// to instert copy instructions.
758//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000759
Vikram S. Adveaee67012002-07-08 23:23:12 +0000760void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000761 LiveRangeInfo &LRI,
762 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000763 PhyRegAlloc &PRA,
764 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000765
Vikram S. Adve879eac92002-10-13 00:05:30 +0000766 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000767
Vikram S. Advee9327f02002-05-19 15:25:51 +0000768 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
769
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000770 // First color the return value of the call.
771 // If there is a LR for the return value, it means this
772 // method returns a value
773
774 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000775
Vikram S. Advee9327f02002-05-19 15:25:51 +0000776 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000777
Chris Lattner30e8fb62002-02-05 01:43:49 +0000778 if (RetVal) {
779 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000780
Chris Lattner30e8fb62002-02-05 01:43:49 +0000781 if (!RetValLR) {
782 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000783 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000784 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000785
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000786 unsigned RegClassID = RetValLR->getRegClassID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000787 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000788 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000789 unsigned UniRetReg; // unified number for CorrectCol
790
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000791 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000792 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000793 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000794 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000795 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000796 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000797 return;
798 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000799
800 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000801 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000802
Vikram S. Adveaee67012002-07-08 23:23:12 +0000803 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000804 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000805
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000806 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000807 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
808 : false;
809
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000810 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000811 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000812 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000813
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000814 unsigned regType = getRegType(RetValLR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000815
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000816 if( RetValLR->hasColor() ) {
817
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000818 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000819
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000820 // the return value is coming in UniRetReg but has to go into
821 // the UniRetLRReg
822
Vikram S. Adveaee67012002-07-08 23:23:12 +0000823 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000824
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000825 } // if LR has color
826 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000827
828 // if the LR did NOT receive a color, we have to move the return
829 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000830
Vikram S. Adveaee67012002-07-08 23:23:12 +0000831 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
832 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000833 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000834
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000835 } // the LR didn't receive the suggested color
836
837 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000838
839
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000840 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000841 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000842 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000843
Chris Lattner7f74a562002-01-20 22:54:45 +0000844 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000845
846 unsigned NumOfCallArgs = argDesc->getNumArgs();
847
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000848 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
849 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000850
Vikram S. Advee9327f02002-05-19 15:25:51 +0000851 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
852
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000853 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000854 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000855
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000856 unsigned RegClassID = getRegClassIDOfType(CallArg->getType());
857 unsigned regType = getRegType(CallArg->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000858
Vikram S. Advee9327f02002-05-19 15:25:51 +0000859 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000860 // Also find the correct register the argument must use (UniArgReg)
861 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000862 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000863 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000864 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000865
Vikram S. Advee9327f02002-05-19 15:25:51 +0000866 // Find the register that must be used for this arg, depending on
867 // whether it is an INT or FP value. Here we ignore whether or not it
868 // is a varargs calls, because FP arguments will be explicitly copied
869 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000870 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000871 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
872 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
873 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
874 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000875
876 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000878 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000879 assert(regClassIDOfArgReg == RegClassID &&
880 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000881 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000882
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000883 // not possible to have a null LR since all args (even consts)
884 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000885 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000886 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000887 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000888 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000889
890 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
891 UniArgReg, argNo, AddedInstrnsBefore);
892
893 // Repeat for the second copy of the argument, which would be
894 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000895 // It may either be passed as a copy in an integer register
896 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000897 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
898 if (argCopy != NULL)
899 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000900 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000901 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000902
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000903 unsigned copyRegClassID = getRegClassIDOfType(argCopy->getType());
904 unsigned copyRegType = getRegType(argCopy->getType());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000905
906 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
907 argNo, intArgNo, fpArgNo-1,
908 regClassIDOfArgReg);
909 assert(copyRegNum != InvalidRegNum);
910 assert(regClassIDOfArgReg == copyRegClassID &&
911 "Moving values between reg classes must happen during selection");
912
913 InitializeOutgoingArg(CallMI, CallAI, PRA,
914 LRI.getLiveRangeForValue(argCopy), copyRegType,
915 copyRegClassID, copyRegNum, argNo,
916 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000917 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000918
919 if (regNum != InvalidRegNum &&
920 argDesc->getArgInfo(i).usesStackSlot())
921 {
922 // Pass the argument via the stack in addition to regNum
923 assert(regType != IntRegType && "Passing an integer arg. twice?");
924 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
925 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
926 InvalidRegNum, argNo, AddedInstrnsBefore);
927 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000928 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000929
Vikram S. Advee9327f02002-05-19 15:25:51 +0000930 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000931 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000932 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000933 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000934 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000935
Chris Lattner5216cc52002-02-04 05:59:25 +0000936 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000937 cerr << "\nCalling reorder with instrns: \n";
938 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
939 cerr << *(AddedInstrnsBefore[i]);
940 }
941
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000942 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
943 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
944 && "Dropped some instructions when reordering!");
945
Chris Lattner5216cc52002-02-04 05:59:25 +0000946 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000947 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000948 for(unsigned i = 0; i < ReorderedVec.size(); i++)
949 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000950 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000951 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000952
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000953 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000954 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000955 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
956 CallMI, BB, PRA);
957
958 // Then insert the final reordered code for the call arguments.
959 //
960 for(unsigned i=0; i < ReorderedVec.size(); i++)
961 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000962}
963
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964//---------------------------------------------------------------------------
965// This method is called for an LLVM return instruction to identify which
966// values will be returned from this method and to suggest colors.
967//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000968void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000969 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000970
Vikram S. Adve879eac92002-10-13 00:05:30 +0000971 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000972
Vikram S. Adveaee67012002-07-08 23:23:12 +0000973 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000974
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000975 // if there is an implicit ref, that has to be the ret value
976 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000977
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000978 // The first implicit operand is the return value of a return instr
979 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000981 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000982
Chris Lattner30e8fb62002-02-05 01:43:49 +0000983 if (!LR) {
984 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
985 assert(0 && "No LR for return value of non-void method");
986 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000987
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000988 unsigned RegClassID = LR->getRegClassID();
Chris Lattner5216cc52002-02-04 05:59:25 +0000989 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000990 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000991 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000992 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000993 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000994}
995
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000997
998//---------------------------------------------------------------------------
999// Colors the return value of a method to %i0 or %f0, if possible. If it is
1000// not possilbe to directly color the LR, insert a copy instruction to move
1001// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
1002// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001003//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001004void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +00001005 LiveRangeInfo &LRI,
1006 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001007
Vikram S. Adve879eac92002-10-13 00:05:30 +00001008 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001009
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001010 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001011 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013 // The first implicit operand is the return value of a return instr
1014 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001015
Chris Lattner5216cc52002-02-04 05:59:25 +00001016 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001017
Chris Lattner30e8fb62002-02-05 01:43:49 +00001018 if (!LR) {
1019 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1020 // assert( LR && "No LR for return value of non-void method");
1021 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001022 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001023
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001024 unsigned RegClassID = getRegClassIDOfType(RetVal->getType());
1025 unsigned regType = getRegType(RetVal->getType());
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001026
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001027 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001028 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001029 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001030 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001031 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001032 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001033 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001034 return;
1035 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001036
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001037 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001038 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001039
Vikram S. Adveaee67012002-07-08 23:23:12 +00001040 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001041 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001042
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001043 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001044
Chris Lattner5216cc52002-02-04 05:59:25 +00001045 if (LR->hasColor() && LR->getColor() == CorrectCol)
1046 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001047
Chris Lattner5216cc52002-02-04 05:59:25 +00001048 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001049
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001050 // We are here because the LR was allocted a regiter
1051 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001052
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001053 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001054
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001055 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001056
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001057 // the LR received UniLRReg but must be colored with UniRetReg
1058 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001059 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001060 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001061 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001062 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1063 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001064 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001065 }
1066
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001067 } // if there is a return value
1068
1069}
1070
Vikram S. Adveaee67012002-07-08 23:23:12 +00001071//---------------------------------------------------------------------------
1072// Check if a specified register type needs a scratch register to be
1073// copied to/from memory. If it does, the reg. type that must be used
1074// for scratch registers is returned in scratchRegType.
1075//
1076// Only the int CC register needs such a scratch register.
1077// The FP CC registers can (and must) be copied directly to/from memory.
1078//---------------------------------------------------------------------------
1079
1080bool
1081UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1082 int& scratchRegType) const
1083{
1084 if (RegType == IntCCRegType)
1085 {
1086 scratchRegType = IntRegType;
1087 return true;
1088 }
1089 return false;
1090}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001091
1092//---------------------------------------------------------------------------
1093// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001094// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001095//---------------------------------------------------------------------------
1096
Vikram S. Advee9327f02002-05-19 15:25:51 +00001097void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001098UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1099 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001100 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001101 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001102 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001103 "Invalid Register");
1104
1105 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001106
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001107 switch( RegType ) {
1108
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001109 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001110 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001111 { // copy intCC reg to int reg
1112 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001113 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001114 }
1115 else
1116 { // copy int reg to intCC reg
1117 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001118 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001119 && "Can only copy CC reg to/from integer reg");
Chris Lattner1ebaa902003-01-15 17:47:49 +00001120 MI = BuildMI(WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001121 }
1122 break;
1123
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001124 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001125 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001126 break;
1127
1128 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001129 MI = BuildMI(ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1130 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001131 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001132
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001133 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001134 MI = BuildMI(FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001135 break;
1136
1137 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001138 MI = BuildMI(FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001139 break;
1140
1141 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001142 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001143 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001144 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001145
1146 if (MI)
1147 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001148}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001149
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001150//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001151// Copy from a register to memory (i.e., Store). Register number must
1152// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001153//---------------------------------------------------------------------------
1154
1155
Vikram S. Advee9327f02002-05-19 15:25:51 +00001156void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001157UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1158 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001159 unsigned DestPtrReg,
1160 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001161 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001162 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001163 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001164 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001165 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001166 MI = BuildMI(STX, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001167 break;
1168
1169 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001170 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001171 MI = BuildMI(ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001172 break;
1173
1174 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001175 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001176 MI = BuildMI(STD, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001177 break;
1178
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001179 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001180 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001181 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001182
1183 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001184 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001185 mvec.push_back(MI);
1186
Chris Lattner56e91662002-08-12 21:25:05 +00001187 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001188 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001189
1190 case FloatCCRegType:
1191 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001192 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001193 MI = BuildMI(STXFSR, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001194 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001195
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001196 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001197 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001198 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001199 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001200}
1201
1202
1203//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001204// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001205// register number
1206//---------------------------------------------------------------------------
1207
1208
Vikram S. Advee9327f02002-05-19 15:25:51 +00001209void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001210UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1211 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001212 int Offset,
1213 unsigned DestReg,
1214 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001215 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001216 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001217 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001218 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001219 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001220 MI = BuildMI(LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1221 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001222 break;
1223
1224 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001225 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001226 MI = BuildMI(LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1227 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001228 break;
1229
1230 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001231 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001232 MI = BuildMI(LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
1233 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001234 break;
1235
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001236 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001237 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001238 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1239 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001240
1241 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001242 MI = BuildMI(WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001243 break;
1244
1245 case FloatCCRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001246 assert(0 && "Tell Vikram if this assertion fails: we may have to mask "
1247 "out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001248 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001249 MI = BuildMI(LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
1250 .addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001251 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001252
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001253 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001254 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001255 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001256 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001257}
1258
1259
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001260//---------------------------------------------------------------------------
1261// Generate a copy instruction to copy a value to another. Temporarily
1262// used by PhiElimination code.
1263//---------------------------------------------------------------------------
1264
1265
Vikram S. Advee9327f02002-05-19 15:25:51 +00001266void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001267UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001268 vector<MachineInstr*>& mvec) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001269 int RegType = getRegType(Src->getType());
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001270 MachineInstr * MI = NULL;
1271
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001272 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001273 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001274 MI = BuildMI(ADD, 3).addReg(Src).addMReg(getZeroRegNum()).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001275 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001276 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001277 MI = BuildMI(FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001278 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001279 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001280 MI = BuildMI(FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001281 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001282 default:
1283 assert(0 && "Unknow RegType in CpValu2Value");
1284 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001285
Chris Lattner9bebf832002-10-28 20:10:56 +00001286 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001287}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001288
1289
1290
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001291
1292
1293
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001294//----------------------------------------------------------------------------
1295// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001296// a call machine instruction. The caller saving/restoring instructions are
1297// inserted like:
1298//
1299// ** caller saving instructions
1300// other instructions inserted for the call by ColorCallArg
1301// CALL instruction
1302// other instructions inserted for the call ColorCallArg
1303// ** caller restoring instructions
1304//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001305//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001306
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001307
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001308void
1309UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1310 vector<MachineInstr*>& instrnsAfter,
1311 MachineInstr *CallMI,
1312 const BasicBlock *BB,
1313 PhyRegAlloc &PRA) const
1314{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001315 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001316
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001317 // has set to record which registers were saved/restored
1318 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001319 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001320
Vikram S. Advee9327f02002-05-19 15:25:51 +00001321 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1322
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001323 // Now find the LR of the return value of the call
1324 // The last *implicit operand* is the return value of a call
1325 // Insert it to to he PushedRegSet since we must not save that register
1326 // and restore it after the call.
1327 // We do this because, we look at the LV set *after* the instruction
1328 // to determine, which LRs must be saved across calls. The return value
1329 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001330
Vikram S. Advee9327f02002-05-19 15:25:51 +00001331 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001332
Chris Lattner5216cc52002-02-04 05:59:25 +00001333 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001334 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001335 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001336
Chris Lattner5216cc52002-02-04 05:59:25 +00001337 if (RetValLR->hasColor())
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001338 PushedRegSet.insert(getUnifiedRegNum(RetValLR->getRegClassID(),
1339 RetValLR->getColor()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001340 }
1341
Vikram S. Advee9327f02002-05-19 15:25:51 +00001342 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001343 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001344
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001345 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001346 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001347
1348 // get the live range corresponding to live var
1349 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1350
1351 // LR can be null if it is a const since a const
1352 // doesn't have a dominating def - see Assumptions above
1353 if( LR ) {
1354
1355 if( LR->hasColor() ) {
1356
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001357 unsigned RCID = LR->getRegClassID();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001358 unsigned Color = LR->getColor();
1359
1360 if ( isRegVolatile(RCID, Color) ) {
1361
1362 // if the value is in both LV sets (i.e., live before and after
1363 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001364
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001365 unsigned Reg = getUnifiedRegNum(RCID, Color);
1366
1367 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1368
1369 // if we haven't already pushed that register
1370
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001371 unsigned RegType = getRegType(LR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001372
1373 // Now get two instructions - to push on stack and pop from stack
1374 // and add them to InstrnsBefore and InstrnsAfter of the
1375 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001376 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001377 int StackOff =
1378 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001379
Vikram S. Adveaee67012002-07-08 23:23:12 +00001380 vector<MachineInstr*> AdIBef, AdIAft;
1381
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001382 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001383
1384 // We may need a scratch register to copy the saved value
1385 // to/from memory. This may itself have to insert code to
1386 // free up a scratch register. Any such code should go before
1387 // the save code.
1388 int scratchRegType = -1;
1389 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001390 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001391 { // Find a register not live in the LVSet before CallMI
1392 const ValueSet &LVSetBef =
1393 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1394 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1395 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001396 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001397 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001398 }
1399
1400 if (AdIBef.size() > 0)
1401 instrnsBefore.insert(instrnsBefore.end(),
1402 AdIBef.begin(), AdIBef.end());
1403
1404 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1405 scratchReg);
1406
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001407 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001408 instrnsBefore.insert(instrnsBefore.end(),
1409 AdIAft.begin(), AdIAft.end());
1410
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001411 //---- Insert code for popping the reg from the stack ----------
1412
Vikram S. Adveaee67012002-07-08 23:23:12 +00001413 // We may need a scratch register to copy the saved value
1414 // from memory. This may itself have to insert code to
1415 // free up a scratch register. Any such code should go
1416 // after the save code.
1417 //
1418 scratchRegType = -1;
1419 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001420 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001421 { // Find a register not live in the LVSet after CallMI
1422 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1423 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001424 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001425 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001426 }
1427
1428 if (AdIBef.size() > 0)
1429 instrnsAfter.insert(instrnsAfter.end(),
1430 AdIBef.begin(), AdIBef.end());
1431
1432 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1433 scratchReg);
1434
1435 if (AdIAft.size() > 0)
1436 instrnsAfter.insert(instrnsAfter.end(),
1437 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001438
Chris Lattner7e5ee422002-02-05 04:20:12 +00001439 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001440
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001441 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001442 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001443 cerr << " -inserted caller saving instrs: Before:\n\t ";
1444 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001445 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001446 cerr << " -and After:\n\t ";
1447 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001448 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001449 }
1450 } // if not already pushed
1451
1452 } // if LR has a volatile color
1453
1454 } // if LR has color
1455
1456 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001457
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001458 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001459}
1460
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001461
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001462//---------------------------------------------------------------------------
1463// Print the register assigned to a LR
1464//---------------------------------------------------------------------------
1465
Chris Lattner5216cc52002-02-04 05:59:25 +00001466void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001467 unsigned RegClassID = LR->getRegClassID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001468 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001469
Chris Lattner5216cc52002-02-04 05:59:25 +00001470 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001471 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001472 return;
1473 }
1474
1475 // if a color is found
1476
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001477 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001478
Chris Lattner5216cc52002-02-04 05:59:25 +00001479 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001480 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001481
Chris Lattner5216cc52002-02-04 05:59:25 +00001482 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001483 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001484 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001485 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001486 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001487 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001488}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001489
1490//---------------------------------------------------------------------------
1491// This method examines instructions inserted by RegAlloc code before a
1492// machine instruction to detect invalid orders that destroy values before
1493// they are used. If it detects such conditions, it reorders the instructions.
1494//
1495// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001496// instructions inserted by RegAlloc. All such instruction MUST have
1497// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001498//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001499// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1500// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001501//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001502// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001503//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001504// Since instructions are inserted in RegAlloc, this assumes that the
1505// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001506// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001507//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001508// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001509//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001510
1511void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1512 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001513 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001514
1515 /*
1516 Problem: We can have instructions inserted by RegAlloc like
1517 1. add %ox %g0 %oy
1518 2. add %oy %g0 %oz, where z!=x or z==x
1519
1520 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001521
1522 Solution:
1523 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001524
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001525 Algorithm:
1526
1527 do
1528 for each instruction 'DefInst' in the UnOrdVec
1529 for each instruction 'UseInst' that follows the DefInst
1530 if the reg defined by DefInst is used by UseInst
1531 mark DefInst as not movable in this iteration
1532 If DefInst is not marked as not-movable, move DefInst to OrdVec
1533 while all instructions in DefInst are moved to OrdVec
1534
1535 For moving, we call the move2OrdVec(). It checks whether there is a def
1536 in it for the uses in the instruction to be added to OrdVec. If there
1537 are no preceding defs, it just appends the instruction. If there is a
1538 preceding def, it puts two instructions to save the reg on stack before
1539 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001540
1541 */
1542
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001543 bool CouldMoveAll;
1544 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001545
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001546 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001548 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001549
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001550 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001551
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001552 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001553
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001554 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001555
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001556 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001557
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001558 //cerr << "\nInst in UnordVec = " << *DefInst;
1559
1560 // last operand is the def (unless for a store which has no def reg)
1561 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1562
Chris Lattner6a30b022002-10-28 04:45:29 +00001563 if (DefOp.opIsDef() &&
1564 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001566 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001567 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001568
Chris Lattner7f74a562002-01-20 22:54:45 +00001569 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001570 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001571
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001572 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1573
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001574 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001575 if( UseInst == NULL) continue;
1576
1577 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001578 MachineOperand& UseOp = UseInst->getOperand(0);
1579
Chris Lattner6a30b022002-10-28 04:45:29 +00001580 if (!UseOp.opIsDef() &&
1581 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001582
1583 // if use is a register ...
1584
1585 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1586
1587 // if Def and this use are the same, it means that this use
1588 // is destroyed by a def before it is used
1589
1590 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001591
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001592 DefEqUse = true;
1593 CouldMoveAll = false;
1594 DebugPrint = true;
1595 break;
1596 } // if two registers are equal
1597
1598 } // if use is a register
1599
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001600 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001601
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001602 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001603
1604 // after examining all the instructions that follow the DefInst
1605 // if there are no dependencies, we can move it to the OrdVec
1606
1607 // cerr << "Moved to Ord: " << *DefInst;
1608
1609 moveInst2OrdVec(OrdVec, DefInst, PRA);
1610
1611 //OrdVec.push_back(DefInst);
1612
1613 // mark the pos of DefInst with NULL to indicate that it is
1614 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001615 *DefIt = NULL;
1616 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001617
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001618 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001619
1620 } // for all instructions in the UnordVec
1621
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001622
Chris Lattner5216cc52002-02-04 05:59:25 +00001623 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001624
Chris Lattner070cf772002-06-04 03:09:57 +00001625 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001626 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001627 for(unsigned i=0; i < OrdVec.size(); i++)
1628 cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001629 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001630}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001631
1632
1633
1634
1635
Chris Lattner7f74a562002-01-20 22:54:45 +00001636void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001637 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001638 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001639 MachineOperand& UseOp = UnordInst->getOperand(0);
1640
Chris Lattner6a30b022002-10-28 04:45:29 +00001641 if (!UseOp.opIsDef() &&
1642 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643
1644 // for the use of UnordInst, see whether there is a defining instr
1645 // before in the OrdVec
1646 bool DefEqUse = false;
1647
Chris Lattner7f74a562002-01-20 22:54:45 +00001648 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001649
1650 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1651
1652 MachineInstr *OrdInst = *OrdIt ;
1653
1654 MachineOperand& DefOp =
1655 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1656
1657 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001658 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001659
1660 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1661
1662 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1663
1664 // we are here because there is a preceding def in the OrdVec
1665 // for the use in this intr we are going to insert. This
1666 // happened because the original code was like:
1667 // 1. add %ox %g0 %oy
1668 // 2. add %oy %g0 %ox
1669 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1670 // Now we are processing %ox of 1.
1671 // We have to
1672
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001673 int UReg = DefOp.getMachineRegNum();
1674 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001675 MachineInstr *AdIBef, *AdIAft;
1676
Chris Lattnerd47aac92002-12-28 20:21:29 +00001677 int StackOff =
1678 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001679
1680 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001681 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001682 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattnerd47aac92002-12-28 20:21:29 +00001683 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1684 MI != mvec.end(); ++MI)
1685 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001686
1687 // Load directly into DReg (%oy)
1688 MachineOperand& DOp=
1689 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1690 assert(DOp.opIsDef() && "Last operand is not the def");
1691 const int DReg = DOp.getMachineRegNum();
1692
Vikram S. Adveaee67012002-07-08 23:23:12 +00001693 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001694
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001695 if( DEBUG_RA ) {
Vikram S. Adve92ccbb92002-10-14 16:32:49 +00001696 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001697 cerr << "\nBefore CIRCULAR Reordering:\n";
1698 cerr << *UnordInst;
1699 cerr << *OrdInst;
1700
1701 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1702 for(unsigned i=0; i < OrdVec.size(); i++)
1703 cerr << *(OrdVec[i]);
1704 }
1705
1706 // Do not copy the UseInst to OrdVec
1707 DefEqUse = true;
1708 break;
1709
1710 }// if two registers are equal
1711
1712 } // if Def is a register
1713
1714 } // for each instr in OrdVec
1715
Chris Lattner5216cc52002-02-04 05:59:25 +00001716 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001717
1718 // We didn't find a def in the OrdVec, so just append this inst
1719 OrdVec.push_back( UnordInst );
1720 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1721 }
1722
1723 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001724}