blob: 8749396365530e9e254699eecfbfac08c60e11c6 [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) {
Chris Lattner4f596d72003-01-15 21:36:30 +0000257 default: assert( 0 && "Unknown reg class ID");
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000258 case IntRegClassID: return IntRegType;
259 case FloatRegClassID:
260 if (type == Type::FloatTy)
261 return FPSingleRegType;
262 else if (type == Type::DoubleTy)
263 return FPDoubleRegType;
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000264 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner4f596d72003-01-15 21:36:30 +0000265 case IntCCRegClassID: return IntCCRegType;
266 case FloatCCRegClassID: return FloatCCRegType;
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000267 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000268}
269
Chris Lattner5216cc52002-02-04 05:59:25 +0000270
Vikram S. Adveaee67012002-07-08 23:23:12 +0000271int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
272 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000273 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000274 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000275 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000276 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000277 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000278 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000279 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000280 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000281 return IntCCRegType;
282 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000283 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000284 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000285}
286
287
Vikram S. Adveaee67012002-07-08 23:23:12 +0000288// To find the register class used for a specified Type
289//
290unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000291 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000292 Type::PrimitiveID ty = type->getPrimitiveID();
293 unsigned res;
294
295 // FIXME: Comparing types like this isn't very safe...
296 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
297 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
298 res = IntRegClassID; // sparc int reg (ty=0: void)
299 else if (ty <= Type::DoubleTyID)
300 res = FloatRegClassID; // sparc float reg class
301 else {
302 //std::cerr << "TypeID: " << ty << "\n";
303 assert(0 && "Cannot resolve register class for type");
304 return 0;
305 }
306
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000307 if (isCCReg)
308 return res + 2; // corresponding condition code register
Vikram S. Adveaee67012002-07-08 23:23:12 +0000309 else
310 return res;
311}
312
313// To find the register class to which a specified register belongs
314//
315unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
316 unsigned classId = 0;
317 (void) getClassRegNum(unifiedRegNum, classId);
318 return classId;
319}
320
321unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
322 switch(regType) {
323 case IntRegType: return IntRegClassID;
324 case FPSingleRegType:
325 case FPDoubleRegType: return FloatRegClassID;
326 case IntCCRegType: return IntCCRegClassID;
327 case FloatCCRegType: return FloatCCRegClassID;
328 default:
329 assert(0 && "Invalid register type in getRegClassIDOfRegType");
330 return 0;
331 }
332}
333
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000334//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335// Suggests a register for the ret address in the RET machine instruction.
336// We always suggest %i7 by convention.
337//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000338void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000339 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000340
Vikram S. Adveaee67012002-07-08 23:23:12 +0000341 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000342
Vikram S. Adveaee67012002-07-08 23:23:12 +0000343 // return address is always mapped to i7 so set it immediately
344 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000345 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000346
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000347 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000348 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000349 // we have to test later whether it received the suggested color.
350 // In that case, a LR has to be created at the start of method.
351 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000352
Vikram S. Adveaee67012002-07-08 23:23:12 +0000353 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000354 // const Value *RetAddrVal = MO.getVRegValue();
355 // assert( RetAddrVal && "LR for ret address must be created at start");
356 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
357 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000358 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000359}
360
361
362//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000363// Suggests a register for the ret address in the JMPL/CALL machine instr.
364// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000365//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000366void
367UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
368 LiveRangeInfo& LRI) const
369{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000370 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
371 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000372 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000373
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000374 // A LR must already exist for the return address.
375 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
376 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
377
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000378 unsigned RegClassID = RetAddrLR->getRegClassID();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000379 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
380}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000381
382
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000383
384//---------------------------------------------------------------------------
385// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000386// According to the Sparc ABI, the first 6 incoming args are in
387// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000388// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000389// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000390//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000391void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000392 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000393{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000394 // check if this is a varArgs function. needed for choosing regs.
395 bool isVarArgs = isVarArgsFunction(Meth->getType());
396
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000397 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000398 unsigned argNo=0, intArgNo=0, fpArgNo=0;
399 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
400 I != E; ++I, ++argNo) {
401 // get the LR of arg
402 LiveRange *LR = LRI.getLiveRangeForValue(I);
403 assert(LR && "No live range found for method arg");
404
405 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000406 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000407
408 int regNum = (regType == IntRegType)
409 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
410 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
411 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
412 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
413
414 if(regNum != InvalidRegNum)
415 LR->setSuggestedColor(regNum);
416 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000417}
418
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000419
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000420//---------------------------------------------------------------------------
421// This method is called after graph coloring to move incoming args to
422// the correct hardware registers if they did not receive the correct
423// (suggested) color through graph coloring.
424//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000425void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000426 LiveRangeInfo &LRI,
427 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000428
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000429 // check if this is a varArgs function. needed for choosing regs.
430 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000431 MachineInstr *AdMI;
432
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000434 // for each argument. count INT and FP arguments separately.
435 unsigned argNo=0, intArgNo=0, fpArgNo=0;
436 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
437 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000438 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000439 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000440 assert( LR && "No live range found for method arg");
441
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000442 unsigned regType = getRegType(LR);
443 unsigned RegClassID = LR->getRegClassID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000444
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000445 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000446 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000447 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000448 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000449 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000450 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000451
452 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000453 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
454 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
455 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
456 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000457
458 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000459 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000460 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000461 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000462
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000463 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000464
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000465 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
466
467 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000468 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000469 if( UniLRReg == UniArgReg )
470 continue;
471
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000472 // We are here because the LR did not receive the suggested
473 // but LR received another register.
474 // Now we have to copy the %i reg (or stack pos of arg)
475 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000476
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000477 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000478 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000479 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000480 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000481 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000482 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000483
484 // It is a variable argument call: the float reg must go in a %o reg.
485 // We have to move an int reg to a float reg via memory.
486 //
487 assert(isVarArgs &&
488 RegClassID == FloatRegClassID &&
489 regClassIDOfArgReg == IntRegClassID &&
490 "This should only be an Int register for an FP argument");
491
Chris Lattnerd47aac92002-12-28 20:21:29 +0000492 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000493 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000494 cpReg2MemMI(FirstAI->InstrnsBefore,
495 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000496
Vikram S. Adveaee67012002-07-08 23:23:12 +0000497 cpMem2RegMI(FirstAI->InstrnsBefore,
498 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000499 }
500 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000501 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000502 }
503 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000504 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000505
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000506 // Now the arg is coming on stack. Since the LR recieved a register,
507 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000508 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000509 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000510 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000511 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000512 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000513
Vikram S. Adveaee67012002-07-08 23:23:12 +0000514 cpMem2RegMI(FirstAI->InstrnsBefore,
515 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000516 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000517
518 } // if LR received a color
519
520 else {
521
522 // Now, the LR did not receive a color. But it has a stack offset for
523 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000524 // So, if the arg is coming in UniArgReg register, we can just move
525 // that on to the stack pos of LR
526
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000527 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000528
529 if( regClassIDOfArgReg != RegClassID ) {
530 assert(0 &&
531 "FP arguments to a varargs function should be explicitly "
532 "copied to/from int registers by instruction selection!");
533
534 // It must be a float arg for a variable argument call, which
535 // must come in a %o reg. Move the int reg to the stack.
536 //
537 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
538 "This should only be an Int register for an FP argument");
539
Vikram S. Adveaee67012002-07-08 23:23:12 +0000540 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
541 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000542 }
543 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000544 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
545 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000546 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000547 }
548
549 else {
550
551 // Now the arg is coming on stack. Since the LR did NOT
552 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000553 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000554 // since this method is called before any other method that makes
555 // uses of the stack pos of the LR (e.g., updateMachineInstr)
556
Chris Lattnerd47aac92002-12-28 20:21:29 +0000557 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000558 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000559 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000560 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000561
562 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000563 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000564
565 }
566
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000567 } // for each incoming argument
568
569}
570
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000571
572
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000573//---------------------------------------------------------------------------
574// This method is called before graph coloring to suggest colors to the
575// outgoing call args and the return value of the call.
576//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000577void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000578 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000579 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000580
Vikram S. Advee9327f02002-05-19 15:25:51 +0000581 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000582
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000583 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000584
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000585 // First color the return value of the call instruction, if any.
586 // The return value will be in %o0 if the value is an integer type,
587 // or in %f0 if the value is a float type.
588 //
589 if (const Value *RetVal = argDesc->getReturnValue()) {
590 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
591 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000592
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000593 unsigned RegClassID = RetValLR->getRegClassID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000594
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000595 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000596 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000597 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000598 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000599 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000600 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000601 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000602
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000603 // Now suggest colors for arguments (operands) of the call instruction.
604 // Colors are suggested only if the arg number is smaller than the
605 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000606 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000607
Vikram S. Advee9327f02002-05-19 15:25:51 +0000608 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000609
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000610 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
611 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000612
Vikram S. Advee9327f02002-05-19 15:25:51 +0000613 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000614
615 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000616 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000617 assert (LR && "Must have a LR for all arguments since "
618 "all args (even consts) must be defined before");
619
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000620 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000621 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000622
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000623 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000624 // an INT or FP value. Here we ignore whether or not it is a
625 // varargs calls, because FP arguments will be explicitly copied
626 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000627 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000628 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
629 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
630 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
631 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000632
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000633 // If a register could be allocated, use it.
634 // If not, do NOTHING as this will be colored as a normal value.
635 if(regNum != InvalidRegNum)
636 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000637
Vikram S. Advee9327f02002-05-19 15:25:51 +0000638 // Repeat for the second copy of the argument, which would be
639 // an FP argument being passed to a function with no prototype
640 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
641 if (argCopy != NULL)
642 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000643 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000644 && "Must be passing copy of FP argument in int register");
645 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
646 argNo, intArgNo, fpArgNo-1,
647 regClassIDOfArgReg);
648 assert(copyRegNum != InvalidRegNum);
649 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
650 copyLR->setSuggestedColor(copyRegNum);
651 }
652
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000653 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000654
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000655}
656
657
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000658//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000659// Helper method for UltraSparcRegInfo::colorCallArgs().
660//---------------------------------------------------------------------------
661
662void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000663UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000664 AddedInstrns *CallAI,
665 PhyRegAlloc &PRA, LiveRange* LR,
666 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000667 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000668 std::vector<MachineInstr *>& AddedInstrnsBefore)
669 const
670{
671 MachineInstr *AdMI;
672 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000673 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000674 if (UniArgRegOrNone != InvalidRegNum)
675 {
676 isArgInReg = true;
677 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000678 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000679 }
680
681 if (LR->hasColor()) {
682 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
683
684 // if LR received the correct color, nothing to do
685 if( isArgInReg && UniArgReg == UniLRReg )
686 return;
687
688 // The LR is allocated to a register UniLRReg and must be copied
689 // to UniArgReg or to the stack slot.
690 //
691 if( isArgInReg ) {
692 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000693 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000694 }
695 else {
696 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000697 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000698 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000699 cpReg2MemMI(CallAI->InstrnsBefore,
700 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000701 }
702
703 } else { // LR is not colored (i.e., spilled)
704
705 if( isArgInReg ) {
706 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000707 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
708 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000709 // Now add the instruction
710 }
711
712 else {
713 // Now, we have to pass the arg on stack. Since LR also did NOT
714 // receive a register we have to move an argument in memory to
715 // outgoing parameter on stack.
716 // Use TReg to load and store the value.
717 // Use TmpOff to save TReg, since that may have a live value.
718 //
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000719 int TReg = PRA.getUniRegNotUsedByThisInst(LR->getRegClass(), CallMI);
Chris Lattnerd47aac92002-12-28 20:21:29 +0000720 int TmpOff = PRA.MF.getInfo()->
721 pushTempValue(getSpilledRegSize(getRegType(LR)));
722 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000723 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000724
725 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
726
727 // Sequence:
728 // (1) Save TReg on stack
729 // (2) Load LR value into TReg from stack pos of LR
730 // (3) Store Treg on outgoing Arg pos on stack
731 // (4) Load the old value of TReg from stack to TReg (restore it)
732 //
733 // OPTIMIZE THIS:
734 // When reverse pointers in MahineInstr are introduced:
735 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
736 // needed only if this fails. Currently, we cannot call the
737 // above method since we cannot find LVSetBefore without the BB
738 //
739 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
740 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000741 cpReg2MemMI(CallAI->InstrnsBefore,
742 TReg, getFramePointer(), TmpOff, regType);
743 cpMem2RegMI(CallAI->InstrnsBefore,
744 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
745 cpReg2MemMI(CallAI->InstrnsBefore,
746 TReg, getStackPointer(), argOffset, regType);
747 cpMem2RegMI(CallAI->InstrnsBefore,
748 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000749 }
750 }
751}
752
753//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000754// After graph coloring, we have call this method to see whehter the return
755// value and the call args received the correct colors. If not, we have
756// to instert copy instructions.
757//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000758
Vikram S. Adveaee67012002-07-08 23:23:12 +0000759void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000760 LiveRangeInfo &LRI,
761 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000762 PhyRegAlloc &PRA,
763 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000764
Vikram S. Adve879eac92002-10-13 00:05:30 +0000765 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000766
Vikram S. Advee9327f02002-05-19 15:25:51 +0000767 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
768
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000769 // First color the return value of the call.
770 // If there is a LR for the return value, it means this
771 // method returns a value
772
773 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000774
Vikram S. Advee9327f02002-05-19 15:25:51 +0000775 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000776
Chris Lattner30e8fb62002-02-05 01:43:49 +0000777 if (RetVal) {
778 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000779
Chris Lattner30e8fb62002-02-05 01:43:49 +0000780 if (!RetValLR) {
781 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000782 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000783 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000784
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000785 unsigned RegClassID = RetValLR->getRegClassID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000786 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000787 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000788 unsigned UniRetReg; // unified number for CorrectCol
789
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000790 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000791 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000792 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000793 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000794 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000795 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000796 return;
797 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000798
799 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000800 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000801
Vikram S. Adveaee67012002-07-08 23:23:12 +0000802 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000803 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000804
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000805 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000806 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
807 : false;
808
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000809 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000810 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000811 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000812
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000813 unsigned regType = getRegType(RetValLR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000814
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000815 if( RetValLR->hasColor() ) {
816
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000817 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000818
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000819 // the return value is coming in UniRetReg but has to go into
820 // the UniRetLRReg
821
Vikram S. Adveaee67012002-07-08 23:23:12 +0000822 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000823
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000824 } // if LR has color
825 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000826
827 // if the LR did NOT receive a color, we have to move the return
828 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000829
Vikram S. Adveaee67012002-07-08 23:23:12 +0000830 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
831 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000832 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000833
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000834 } // the LR didn't receive the suggested color
835
836 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000837
838
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000839 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000840 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000841 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000842
Chris Lattner7f74a562002-01-20 22:54:45 +0000843 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000844
845 unsigned NumOfCallArgs = argDesc->getNumArgs();
846
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000847 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
848 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000849
Vikram S. Advee9327f02002-05-19 15:25:51 +0000850 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
851
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000852 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000853 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000854
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000855 unsigned RegClassID = getRegClassIDOfType(CallArg->getType());
856 unsigned regType = getRegType(CallArg->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000857
Vikram S. Advee9327f02002-05-19 15:25:51 +0000858 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000859 // Also find the correct register the argument must use (UniArgReg)
860 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000861 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000862 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000863 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000864
Vikram S. Advee9327f02002-05-19 15:25:51 +0000865 // Find the register that must be used for this arg, depending on
866 // whether it is an INT or FP value. Here we ignore whether or not it
867 // is a varargs calls, because FP arguments will be explicitly copied
868 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000869 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000870 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
871 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
872 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
873 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000874
875 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000876 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000877 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000878 assert(regClassIDOfArgReg == RegClassID &&
879 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000880 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000881
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000882 // not possible to have a null LR since all args (even consts)
883 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000884 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000885 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000886 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000887 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000888
889 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
890 UniArgReg, argNo, AddedInstrnsBefore);
891
892 // Repeat for the second copy of the argument, which would be
893 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000894 // It may either be passed as a copy in an integer register
895 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000896 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
897 if (argCopy != NULL)
898 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000899 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000900 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000901
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000902 unsigned copyRegClassID = getRegClassIDOfType(argCopy->getType());
903 unsigned copyRegType = getRegType(argCopy->getType());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000904
905 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
906 argNo, intArgNo, fpArgNo-1,
907 regClassIDOfArgReg);
908 assert(copyRegNum != InvalidRegNum);
909 assert(regClassIDOfArgReg == copyRegClassID &&
910 "Moving values between reg classes must happen during selection");
911
912 InitializeOutgoingArg(CallMI, CallAI, PRA,
913 LRI.getLiveRangeForValue(argCopy), copyRegType,
914 copyRegClassID, copyRegNum, argNo,
915 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000916 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000917
918 if (regNum != InvalidRegNum &&
919 argDesc->getArgInfo(i).usesStackSlot())
920 {
921 // Pass the argument via the stack in addition to regNum
922 assert(regType != IntRegType && "Passing an integer arg. twice?");
923 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
924 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
925 InvalidRegNum, argNo, AddedInstrnsBefore);
926 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000927 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000928
Vikram S. Advee9327f02002-05-19 15:25:51 +0000929 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000930 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000931 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000932 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000933 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000934
Chris Lattner5216cc52002-02-04 05:59:25 +0000935 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000936 cerr << "\nCalling reorder with instrns: \n";
937 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
938 cerr << *(AddedInstrnsBefore[i]);
939 }
940
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000941 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
942 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
943 && "Dropped some instructions when reordering!");
944
Chris Lattner5216cc52002-02-04 05:59:25 +0000945 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000946 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000947 for(unsigned i = 0; i < ReorderedVec.size(); i++)
948 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000949 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000950 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000951
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000952 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000953 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000954 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
955 CallMI, BB, PRA);
956
957 // Then insert the final reordered code for the call arguments.
958 //
959 for(unsigned i=0; i < ReorderedVec.size(); i++)
960 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000961}
962
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000963//---------------------------------------------------------------------------
964// This method is called for an LLVM return instruction to identify which
965// values will be returned from this method and to suggest colors.
966//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000967void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000968 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000969
Vikram S. Adve879eac92002-10-13 00:05:30 +0000970 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000971
Vikram S. Adveaee67012002-07-08 23:23:12 +0000972 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000973
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000974 // if there is an implicit ref, that has to be the ret value
975 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000977 // The first implicit operand is the return value of a return instr
978 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000979
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000981
Chris Lattner30e8fb62002-02-05 01:43:49 +0000982 if (!LR) {
983 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
984 assert(0 && "No LR for return value of non-void method");
985 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000986
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000987 unsigned RegClassID = LR->getRegClassID();
Chris Lattner5216cc52002-02-04 05:59:25 +0000988 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000989 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000990 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000991 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000992 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000993}
994
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000995
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000996
997//---------------------------------------------------------------------------
998// Colors the return value of a method to %i0 or %f0, if possible. If it is
999// not possilbe to directly color the LR, insert a copy instruction to move
1000// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
1001// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001003void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +00001004 LiveRangeInfo &LRI,
1005 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001006
Vikram S. Adve879eac92002-10-13 00:05:30 +00001007 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001008
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001009 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001010 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001011
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001012 // The first implicit operand is the return value of a return instr
1013 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014
Chris Lattner5216cc52002-02-04 05:59:25 +00001015 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001016
Chris Lattner30e8fb62002-02-05 01:43:49 +00001017 if (!LR) {
1018 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1019 // assert( LR && "No LR for return value of non-void method");
1020 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001021 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001022
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001023 unsigned RegClassID = getRegClassIDOfType(RetVal->getType());
1024 unsigned regType = getRegType(RetVal->getType());
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001025
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001026 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001027 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001028 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001029 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001030 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001031 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001032 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001033 return;
1034 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001035
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001036 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001037 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001038
Vikram S. Adveaee67012002-07-08 23:23:12 +00001039 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001040 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001041
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001042 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001043
Chris Lattner5216cc52002-02-04 05:59:25 +00001044 if (LR->hasColor() && LR->getColor() == CorrectCol)
1045 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001046
Chris Lattner5216cc52002-02-04 05:59:25 +00001047 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001048
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001049 // We are here because the LR was allocted a regiter
1050 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001051
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001052 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001053
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001054 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001055
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001056 // the LR received UniLRReg but must be colored with UniRetReg
1057 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001058 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001059 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001060 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001061 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1062 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattnerb1eee002003-05-12 20:10:12 +00001063 //cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001064 }
1065
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001066 } // if there is a return value
1067
1068}
1069
Vikram S. Adveaee67012002-07-08 23:23:12 +00001070//---------------------------------------------------------------------------
1071// Check if a specified register type needs a scratch register to be
1072// copied to/from memory. If it does, the reg. type that must be used
1073// for scratch registers is returned in scratchRegType.
1074//
1075// Only the int CC register needs such a scratch register.
1076// The FP CC registers can (and must) be copied directly to/from memory.
1077//---------------------------------------------------------------------------
1078
1079bool
1080UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1081 int& scratchRegType) const
1082{
1083 if (RegType == IntCCRegType)
1084 {
1085 scratchRegType = IntRegType;
1086 return true;
1087 }
1088 return false;
1089}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001090
1091//---------------------------------------------------------------------------
1092// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001093// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001094//---------------------------------------------------------------------------
1095
Vikram S. Advee9327f02002-05-19 15:25:51 +00001096void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001097UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1098 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001099 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001100 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001101 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001102 "Invalid Register");
1103
1104 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001105
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001106 switch( RegType ) {
1107
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001108 case IntCCRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001109 if (getRegType(DestReg) == IntRegType) {
1110 // copy intCC reg to int reg
1111 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1112 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg,MOTy::Def);
1113 } else {
1114 // copy int reg to intCC reg
1115 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1116 assert(getRegType(SrcReg) == IntRegType
1117 && "Can only copy CC reg to/from integer reg");
1118 MI = BuildMI(V9::WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
1119 }
Vikram S. Adveaee67012002-07-08 23:23:12 +00001120 break;
1121
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001122 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001123 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001124 break;
1125
1126 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001127 MI = BuildMI(V9::ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1128 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001129 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001130
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001131 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001132 MI = BuildMI(V9::FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001133 break;
1134
1135 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001136 MI = BuildMI(V9::FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001137 break;
1138
1139 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001140 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001141 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001142 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001143
1144 if (MI)
1145 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001146}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001147
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001148//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001149// Copy from a register to memory (i.e., Store). Register number must
1150// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001151//---------------------------------------------------------------------------
1152
1153
Vikram S. Advee9327f02002-05-19 15:25:51 +00001154void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001155UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1156 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001157 unsigned DestPtrReg,
1158 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001159 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001160 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001161 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001162 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001163 assert(target.getInstrInfo().constantFitsInImmedField(V9::STX, Offset));
1164 MI = BuildMI(V9::STX,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001165 break;
1166
1167 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001168 assert(target.getInstrInfo().constantFitsInImmedField(V9::ST, Offset));
1169 MI = BuildMI(V9::ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001170 break;
1171
1172 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001173 assert(target.getInstrInfo().constantFitsInImmedField(V9::STD, Offset));
1174 MI = BuildMI(V9::STD,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001175 break;
1176
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001177 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001178 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001179 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001180
1181 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001182 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001183 mvec.push_back(MI);
1184
Chris Lattner56e91662002-08-12 21:25:05 +00001185 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001186 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001187
1188 case FloatCCRegType:
1189 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Misha Brukman56f4fa12003-05-20 20:32:24 +00001190 assert(target.getInstrInfo().constantFitsInImmedField(V9::STXFSR, Offset));
1191 MI = BuildMI(V9::STXFSR, 3).addMReg(SrcReg).addMReg(DestPtrReg)
1192 .addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001193 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001194
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001195 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001196 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001197 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001198 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001199}
1200
1201
1202//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001203// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001204// register number
1205//---------------------------------------------------------------------------
1206
1207
Vikram S. Advee9327f02002-05-19 15:25:51 +00001208void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001209UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1210 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001211 int Offset,
1212 unsigned DestReg,
1213 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001214 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001215 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001216 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001217 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001218 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDX, Offset));
1219 MI = BuildMI(V9::LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1220 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001221 break;
1222
1223 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001224 assert(target.getInstrInfo().constantFitsInImmedField(V9::LD, Offset));
1225 MI = BuildMI(V9::LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1226 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001227 break;
1228
1229 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001230 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDD, Offset));
1231 MI = BuildMI(V9::LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
Chris Lattner1ebaa902003-01-15 17:47:49 +00001232 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001233 break;
1234
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001235 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001236 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001237 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1238 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001239
1240 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001241 MI = BuildMI(V9::WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1,MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001242 break;
1243
1244 case FloatCCRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001245 assert(0 && "Tell Vikram if this assertion fails: we may have to mask "
1246 "out the other bits here");
Misha Brukman56f4fa12003-05-20 20:32:24 +00001247 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDXFSR, Offset));
1248 MI = BuildMI(V9::LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
1249 .addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001250 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001251
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001252 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001253 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001254 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001255 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001256}
1257
1258
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001259//---------------------------------------------------------------------------
1260// Generate a copy instruction to copy a value to another. Temporarily
1261// used by PhiElimination code.
1262//---------------------------------------------------------------------------
1263
1264
Vikram S. Advee9327f02002-05-19 15:25:51 +00001265void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001266UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001267 vector<MachineInstr*>& mvec) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001268 int RegType = getRegType(Src->getType());
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001269 MachineInstr * MI = NULL;
1270
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001271 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001272 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001273 MI = BuildMI(V9::ADD, 3).addReg(Src).addMReg(getZeroRegNum())
1274 .addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001275 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001276 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001277 MI = BuildMI(V9::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:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001280 MI = BuildMI(V9::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}