blob: 078d8dc85823482dcd82bad94b742dcb202b2cf7 [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//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000235int UltraSparcRegInfo::getRegType(unsigned regClassID,
236 const Type* type) const {
237 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 {
253 return getRegType(LR->getRegClass()->getID(), LR->getType());
254}
255
Chris Lattner5216cc52002-02-04 05:59:25 +0000256int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000257 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000258}
259
Vikram S. Adveaee67012002-07-08 23:23:12 +0000260int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
261 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000262 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000263 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000264 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000265 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000266 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000267 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000268 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000269 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000270 return IntCCRegType;
271 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000272 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000273 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000274}
275
276
Vikram S. Adveaee67012002-07-08 23:23:12 +0000277// To find the register class used for a specified Type
278//
279unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000280 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000281 Type::PrimitiveID ty = type->getPrimitiveID();
282 unsigned res;
283
284 // FIXME: Comparing types like this isn't very safe...
285 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
286 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
287 res = IntRegClassID; // sparc int reg (ty=0: void)
288 else if (ty <= Type::DoubleTyID)
289 res = FloatRegClassID; // sparc float reg class
290 else {
291 //std::cerr << "TypeID: " << ty << "\n";
292 assert(0 && "Cannot resolve register class for type");
293 return 0;
294 }
295
296 if(isCCReg)
297 return res + 2; // corresponidng condition code regiser
298 else
299 return res;
300}
301
302// To find the register class to which a specified register belongs
303//
304unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
305 unsigned classId = 0;
306 (void) getClassRegNum(unifiedRegNum, classId);
307 return classId;
308}
309
310unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
311 switch(regType) {
312 case IntRegType: return IntRegClassID;
313 case FPSingleRegType:
314 case FPDoubleRegType: return FloatRegClassID;
315 case IntCCRegType: return IntCCRegClassID;
316 case FloatCCRegType: return FloatCCRegClassID;
317 default:
318 assert(0 && "Invalid register type in getRegClassIDOfRegType");
319 return 0;
320 }
321}
322
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000323//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000324// Suggests a register for the ret address in the RET machine instruction.
325// We always suggest %i7 by convention.
326//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000327void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000328 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000329
Vikram S. Adveaee67012002-07-08 23:23:12 +0000330 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000331
Vikram S. Adveaee67012002-07-08 23:23:12 +0000332 // return address is always mapped to i7 so set it immediately
333 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000334 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000335
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000336 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000337 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000338 // we have to test later whether it received the suggested color.
339 // In that case, a LR has to be created at the start of method.
340 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000341
Vikram S. Adveaee67012002-07-08 23:23:12 +0000342 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000343 // const Value *RetAddrVal = MO.getVRegValue();
344 // assert( RetAddrVal && "LR for ret address must be created at start");
345 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
346 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000347 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000348}
349
350
351//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000352// Suggests a register for the ret address in the JMPL/CALL machine instr.
353// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000354//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000355void
356UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
357 LiveRangeInfo& LRI) const
358{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000359 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
360 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000361 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000362
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000363 // A LR must already exist for the return address.
364 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
365 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
366
367 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
368 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
369}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000370
371
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000372
373//---------------------------------------------------------------------------
374// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000375// According to the Sparc ABI, the first 6 incoming args are in
376// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000377// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000378// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000379//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000380void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000381 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000382{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000383 // check if this is a varArgs function. needed for choosing regs.
384 bool isVarArgs = isVarArgsFunction(Meth->getType());
385
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000386 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000387 unsigned argNo=0, intArgNo=0, fpArgNo=0;
388 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
389 I != E; ++I, ++argNo) {
390 // get the LR of arg
391 LiveRange *LR = LRI.getLiveRangeForValue(I);
392 assert(LR && "No live range found for method arg");
393
394 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000395 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000396
397 int regNum = (regType == IntRegType)
398 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
399 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
400 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
401 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
402
403 if(regNum != InvalidRegNum)
404 LR->setSuggestedColor(regNum);
405 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000406}
407
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000408
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000409//---------------------------------------------------------------------------
410// This method is called after graph coloring to move incoming args to
411// the correct hardware registers if they did not receive the correct
412// (suggested) color through graph coloring.
413//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000414void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000415 LiveRangeInfo &LRI,
416 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000417
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000418 // check if this is a varArgs function. needed for choosing regs.
419 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000420 MachineInstr *AdMI;
421
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000422 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000423 // for each argument. count INT and FP arguments separately.
424 unsigned argNo=0, intArgNo=0, fpArgNo=0;
425 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
426 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000427 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000428 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000429 assert( LR && "No live range found for method arg");
430
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000431 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000432 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000433
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000434 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000435 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000436 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000437 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000438 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000439 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000440
441 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000442 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
443 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
444 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
445 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000446
447 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000448 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000449 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000450 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000452 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000453
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000454 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
455
456 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000457 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000458 if( UniLRReg == UniArgReg )
459 continue;
460
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000461 // We are here because the LR did not receive the suggested
462 // but LR received another register.
463 // Now we have to copy the %i reg (or stack pos of arg)
464 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000465
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000466 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000467 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000468 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000469 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000470 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000471 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000472
473 // It is a variable argument call: the float reg must go in a %o reg.
474 // We have to move an int reg to a float reg via memory.
475 //
476 assert(isVarArgs &&
477 RegClassID == FloatRegClassID &&
478 regClassIDOfArgReg == IntRegClassID &&
479 "This should only be an Int register for an FP argument");
480
Chris Lattnerd47aac92002-12-28 20:21:29 +0000481 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000482 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000483 cpReg2MemMI(FirstAI->InstrnsBefore,
484 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000485
Vikram S. Adveaee67012002-07-08 23:23:12 +0000486 cpMem2RegMI(FirstAI->InstrnsBefore,
487 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000488 }
489 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000490 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000491 }
492 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000493 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000494
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000495 // Now the arg is coming on stack. Since the LR recieved a register,
496 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000497 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000498 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000499 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000500 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000501 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000502
Vikram S. Adveaee67012002-07-08 23:23:12 +0000503 cpMem2RegMI(FirstAI->InstrnsBefore,
504 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000505 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000506
507 } // if LR received a color
508
509 else {
510
511 // Now, the LR did not receive a color. But it has a stack offset for
512 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000513 // So, if the arg is coming in UniArgReg register, we can just move
514 // that on to the stack pos of LR
515
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000516 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000517
518 if( regClassIDOfArgReg != RegClassID ) {
519 assert(0 &&
520 "FP arguments to a varargs function should be explicitly "
521 "copied to/from int registers by instruction selection!");
522
523 // It must be a float arg for a variable argument call, which
524 // must come in a %o reg. Move the int reg to the stack.
525 //
526 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
527 "This should only be an Int register for an FP argument");
528
Vikram S. Adveaee67012002-07-08 23:23:12 +0000529 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
530 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000531 }
532 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000533 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
534 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000535 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000536 }
537
538 else {
539
540 // Now the arg is coming on stack. Since the LR did NOT
541 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000542 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000543 // since this method is called before any other method that makes
544 // uses of the stack pos of the LR (e.g., updateMachineInstr)
545
Chris Lattnerd47aac92002-12-28 20:21:29 +0000546 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000547 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000548 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000549 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000550
551 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000552 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000553
554 }
555
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000556 } // for each incoming argument
557
558}
559
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000560
561
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000562//---------------------------------------------------------------------------
563// This method is called before graph coloring to suggest colors to the
564// outgoing call args and the return value of the call.
565//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000566void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000567 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000568 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000569
Vikram S. Advee9327f02002-05-19 15:25:51 +0000570 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000571
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000572 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000573
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000574 // First color the return value of the call instruction, if any.
575 // The return value will be in %o0 if the value is an integer type,
576 // or in %f0 if the value is a float type.
577 //
578 if (const Value *RetVal = argDesc->getReturnValue()) {
579 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
580 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000581
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000582 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000583
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000584 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000586 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000587 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000588 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000589 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000590 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000591
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000592 // Now suggest colors for arguments (operands) of the call instruction.
593 // Colors are suggested only if the arg number is smaller than the
594 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000595 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000596
Vikram S. Advee9327f02002-05-19 15:25:51 +0000597 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000598
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000599 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
600 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000601
Vikram S. Advee9327f02002-05-19 15:25:51 +0000602 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000603
604 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000605 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000606 assert (LR && "Must have a LR for all arguments since "
607 "all args (even consts) must be defined before");
608
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000609 unsigned regType = getRegType( LR );
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000610 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000611
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000612 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000613 // an INT or FP value. Here we ignore whether or not it is a
614 // varargs calls, because FP arguments will be explicitly copied
615 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000616 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000617 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
618 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
619 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
620 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000621
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000622 // If a register could be allocated, use it.
623 // If not, do NOTHING as this will be colored as a normal value.
624 if(regNum != InvalidRegNum)
625 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000626
Vikram S. Advee9327f02002-05-19 15:25:51 +0000627 // Repeat for the second copy of the argument, which would be
628 // an FP argument being passed to a function with no prototype
629 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
630 if (argCopy != NULL)
631 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000632 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000633 && "Must be passing copy of FP argument in int register");
634 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
635 argNo, intArgNo, fpArgNo-1,
636 regClassIDOfArgReg);
637 assert(copyRegNum != InvalidRegNum);
638 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
639 copyLR->setSuggestedColor(copyRegNum);
640 }
641
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000642 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000643
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000644}
645
646
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000647//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000648// Helper method for UltraSparcRegInfo::colorCallArgs().
649//---------------------------------------------------------------------------
650
651void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000652UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000653 AddedInstrns *CallAI,
654 PhyRegAlloc &PRA, LiveRange* LR,
655 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000656 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000657 std::vector<MachineInstr *>& AddedInstrnsBefore)
658 const
659{
660 MachineInstr *AdMI;
661 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000662 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000663 if (UniArgRegOrNone != InvalidRegNum)
664 {
665 isArgInReg = true;
666 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000667 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000668 }
669
670 if (LR->hasColor()) {
671 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
672
673 // if LR received the correct color, nothing to do
674 if( isArgInReg && UniArgReg == UniLRReg )
675 return;
676
677 // The LR is allocated to a register UniLRReg and must be copied
678 // to UniArgReg or to the stack slot.
679 //
680 if( isArgInReg ) {
681 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000682 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000683 }
684 else {
685 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000686 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000687 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000688 cpReg2MemMI(CallAI->InstrnsBefore,
689 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000690 }
691
692 } else { // LR is not colored (i.e., spilled)
693
694 if( isArgInReg ) {
695 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000696 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
697 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000698 // Now add the instruction
699 }
700
701 else {
702 // Now, we have to pass the arg on stack. Since LR also did NOT
703 // receive a register we have to move an argument in memory to
704 // outgoing parameter on stack.
705 // Use TReg to load and store the value.
706 // Use TmpOff to save TReg, since that may have a live value.
707 //
708 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Chris Lattnerd47aac92002-12-28 20:21:29 +0000709 int TmpOff = PRA.MF.getInfo()->
710 pushTempValue(getSpilledRegSize(getRegType(LR)));
711 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000712 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000713
714 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
715
716 // Sequence:
717 // (1) Save TReg on stack
718 // (2) Load LR value into TReg from stack pos of LR
719 // (3) Store Treg on outgoing Arg pos on stack
720 // (4) Load the old value of TReg from stack to TReg (restore it)
721 //
722 // OPTIMIZE THIS:
723 // When reverse pointers in MahineInstr are introduced:
724 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
725 // needed only if this fails. Currently, we cannot call the
726 // above method since we cannot find LVSetBefore without the BB
727 //
728 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
729 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000730 cpReg2MemMI(CallAI->InstrnsBefore,
731 TReg, getFramePointer(), TmpOff, regType);
732 cpMem2RegMI(CallAI->InstrnsBefore,
733 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
734 cpReg2MemMI(CallAI->InstrnsBefore,
735 TReg, getStackPointer(), argOffset, regType);
736 cpMem2RegMI(CallAI->InstrnsBefore,
737 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000738 }
739 }
740}
741
742//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000743// After graph coloring, we have call this method to see whehter the return
744// value and the call args received the correct colors. If not, we have
745// to instert copy instructions.
746//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000747
Vikram S. Adveaee67012002-07-08 23:23:12 +0000748void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000749 LiveRangeInfo &LRI,
750 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000751 PhyRegAlloc &PRA,
752 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000753
Vikram S. Adve879eac92002-10-13 00:05:30 +0000754 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000755
Vikram S. Advee9327f02002-05-19 15:25:51 +0000756 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
757
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000758 // First color the return value of the call.
759 // If there is a LR for the return value, it means this
760 // method returns a value
761
762 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000763
Vikram S. Advee9327f02002-05-19 15:25:51 +0000764 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000765
Chris Lattner30e8fb62002-02-05 01:43:49 +0000766 if (RetVal) {
767 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000768
Chris Lattner30e8fb62002-02-05 01:43:49 +0000769 if (!RetValLR) {
770 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000771 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000772 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000773
774 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000775 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000776 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000777 unsigned UniRetReg; // unified number for CorrectCol
778
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000779 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000780 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000781 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000782 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000783 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000784 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000785 return;
786 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000787
788 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000789 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000790
Vikram S. Adveaee67012002-07-08 23:23:12 +0000791 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000792 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000793
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000794 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000795 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
796 : false;
797
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000798 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000799 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000800 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000801
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000802 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000803
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000804 if( RetValLR->hasColor() ) {
805
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000806 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000807
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000808 // the return value is coming in UniRetReg but has to go into
809 // the UniRetLRReg
810
Vikram S. Adveaee67012002-07-08 23:23:12 +0000811 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000812
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000813 } // if LR has color
814 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000815
816 // if the LR did NOT receive a color, we have to move the return
817 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000818
Vikram S. Adveaee67012002-07-08 23:23:12 +0000819 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
820 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000821 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000822
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000823 } // the LR didn't receive the suggested color
824
825 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000826
827
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000828 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000829 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000830 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000831
Chris Lattner7f74a562002-01-20 22:54:45 +0000832 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000833
834 unsigned NumOfCallArgs = argDesc->getNumArgs();
835
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000836 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
837 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000838
Vikram S. Advee9327f02002-05-19 15:25:51 +0000839 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
840
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000841 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000842 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000843
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000844 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000845 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000846
Vikram S. Advee9327f02002-05-19 15:25:51 +0000847 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000848 // Also find the correct register the argument must use (UniArgReg)
849 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000850 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000851 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000852 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000853
Vikram S. Advee9327f02002-05-19 15:25:51 +0000854 // Find the register that must be used for this arg, depending on
855 // whether it is an INT or FP value. Here we ignore whether or not it
856 // is a varargs calls, because FP arguments will be explicitly copied
857 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000858 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000859 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
860 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
861 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
862 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000863
864 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000865 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000866 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000867 assert(regClassIDOfArgReg == RegClassID &&
868 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000869 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000870
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000871 // not possible to have a null LR since all args (even consts)
872 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000873 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000874 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000875 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000876 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000877
878 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
879 UniArgReg, argNo, AddedInstrnsBefore);
880
881 // Repeat for the second copy of the argument, which would be
882 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000883 // It may either be passed as a copy in an integer register
884 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000885 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
886 if (argCopy != NULL)
887 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000888 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000889 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000890
Vikram S. Advee9327f02002-05-19 15:25:51 +0000891 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
892 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
893
894 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
895 argNo, intArgNo, fpArgNo-1,
896 regClassIDOfArgReg);
897 assert(copyRegNum != InvalidRegNum);
898 assert(regClassIDOfArgReg == copyRegClassID &&
899 "Moving values between reg classes must happen during selection");
900
901 InitializeOutgoingArg(CallMI, CallAI, PRA,
902 LRI.getLiveRangeForValue(argCopy), copyRegType,
903 copyRegClassID, copyRegNum, argNo,
904 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000905 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000906
907 if (regNum != InvalidRegNum &&
908 argDesc->getArgInfo(i).usesStackSlot())
909 {
910 // Pass the argument via the stack in addition to regNum
911 assert(regType != IntRegType && "Passing an integer arg. twice?");
912 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
913 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
914 InvalidRegNum, argNo, AddedInstrnsBefore);
915 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000916 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000917
Vikram S. Advee9327f02002-05-19 15:25:51 +0000918 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000919 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000920 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000921 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000922 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000923
Chris Lattner5216cc52002-02-04 05:59:25 +0000924 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000925 cerr << "\nCalling reorder with instrns: \n";
926 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
927 cerr << *(AddedInstrnsBefore[i]);
928 }
929
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000930 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
931 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
932 && "Dropped some instructions when reordering!");
933
Chris Lattner5216cc52002-02-04 05:59:25 +0000934 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000935 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000936 for(unsigned i = 0; i < ReorderedVec.size(); i++)
937 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000938 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000939 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000940
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000941 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000942 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000943 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
944 CallMI, BB, PRA);
945
946 // Then insert the final reordered code for the call arguments.
947 //
948 for(unsigned i=0; i < ReorderedVec.size(); i++)
949 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000950}
951
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000952//---------------------------------------------------------------------------
953// This method is called for an LLVM return instruction to identify which
954// values will be returned from this method and to suggest colors.
955//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000956void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000957 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000958
Vikram S. Adve879eac92002-10-13 00:05:30 +0000959 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000960
Vikram S. Adveaee67012002-07-08 23:23:12 +0000961 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000962
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000963 // if there is an implicit ref, that has to be the ret value
964 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000965
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000966 // The first implicit operand is the return value of a return instr
967 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000968
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000970
Chris Lattner30e8fb62002-02-05 01:43:49 +0000971 if (!LR) {
972 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
973 assert(0 && "No LR for return value of non-void method");
974 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000975
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000976 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000977
Chris Lattner5216cc52002-02-04 05:59:25 +0000978 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000979 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000980 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000981 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000982 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000983}
984
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000985
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000986
987//---------------------------------------------------------------------------
988// Colors the return value of a method to %i0 or %f0, if possible. If it is
989// not possilbe to directly color the LR, insert a copy instruction to move
990// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
991// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000992//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000993void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000994 LiveRangeInfo &LRI,
995 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996
Vikram S. Adve879eac92002-10-13 00:05:30 +0000997 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000998
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000999 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001000 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001001
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001002 // The first implicit operand is the return value of a return instr
1003 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Chris Lattner5216cc52002-02-04 05:59:25 +00001005 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001006
Chris Lattner30e8fb62002-02-05 01:43:49 +00001007 if (!LR) {
1008 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1009 // assert( LR && "No LR for return value of non-void method");
1010 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001011 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001012
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001013 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001014 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001015
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001016 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001017 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001018 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001019 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001020 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001021 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001022 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001023 return;
1024 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001025
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001026 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001027 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001028
Vikram S. Adveaee67012002-07-08 23:23:12 +00001029 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001030 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001031
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001032 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001033
Chris Lattner5216cc52002-02-04 05:59:25 +00001034 if (LR->hasColor() && LR->getColor() == CorrectCol)
1035 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001036
Chris Lattner5216cc52002-02-04 05:59:25 +00001037 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001038
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001039 // We are here because the LR was allocted a regiter
1040 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001041
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001042 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001043
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001044 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001045
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001046 // the LR received UniLRReg but must be colored with UniRetReg
1047 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001048 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001049 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001050 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001051 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1052 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001053 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001054 }
1055
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001056 } // if there is a return value
1057
1058}
1059
Vikram S. Adveaee67012002-07-08 23:23:12 +00001060//---------------------------------------------------------------------------
1061// Check if a specified register type needs a scratch register to be
1062// copied to/from memory. If it does, the reg. type that must be used
1063// for scratch registers is returned in scratchRegType.
1064//
1065// Only the int CC register needs such a scratch register.
1066// The FP CC registers can (and must) be copied directly to/from memory.
1067//---------------------------------------------------------------------------
1068
1069bool
1070UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1071 int& scratchRegType) const
1072{
1073 if (RegType == IntCCRegType)
1074 {
1075 scratchRegType = IntRegType;
1076 return true;
1077 }
1078 return false;
1079}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001080
1081//---------------------------------------------------------------------------
1082// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001083// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001084//---------------------------------------------------------------------------
1085
Vikram S. Advee9327f02002-05-19 15:25:51 +00001086void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001087UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1088 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001089 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001090 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001091 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001092 "Invalid Register");
1093
1094 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001095
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001096 switch( RegType ) {
1097
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001098 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001099 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001100 { // copy intCC reg to int reg
1101 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001102 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001103 }
1104 else
1105 { // copy int reg to intCC reg
1106 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001107 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001108 && "Can only copy CC reg to/from integer reg");
Chris Lattner1ebaa902003-01-15 17:47:49 +00001109 MI = BuildMI(WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001110 }
1111 break;
1112
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001113 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001114 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001115 break;
1116
1117 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001118 MI = BuildMI(ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1119 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001120 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001121
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001122 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001123 MI = BuildMI(FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001124 break;
1125
1126 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001127 MI = BuildMI(FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001128 break;
1129
1130 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001131 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001132 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001133 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001134
1135 if (MI)
1136 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001137}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001138
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001140// Copy from a register to memory (i.e., Store). Register number must
1141// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001142//---------------------------------------------------------------------------
1143
1144
Vikram S. Advee9327f02002-05-19 15:25:51 +00001145void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001146UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1147 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001148 unsigned DestPtrReg,
1149 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001150 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001151 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001152 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001153 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001154 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001155 MI = BuildMI(STX, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001156 break;
1157
1158 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001159 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001160 MI = BuildMI(ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001161 break;
1162
1163 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001164 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001165 MI = BuildMI(STD, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001166 break;
1167
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001168 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001169 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001170 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001171
1172 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001173 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001174 mvec.push_back(MI);
1175
Chris Lattner56e91662002-08-12 21:25:05 +00001176 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001177 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001178
1179 case FloatCCRegType:
1180 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001181 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001182 MI = BuildMI(STXFSR, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001183 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001184
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001185 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001186 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001187 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001188 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001189}
1190
1191
1192//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001193// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001194// register number
1195//---------------------------------------------------------------------------
1196
1197
Vikram S. Advee9327f02002-05-19 15:25:51 +00001198void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001199UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1200 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001201 int Offset,
1202 unsigned DestReg,
1203 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001204 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001205 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001206 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001207 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001208 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001209 MI = BuildMI(LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1210 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001211 break;
1212
1213 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001214 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001215 MI = BuildMI(LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1216 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001217 break;
1218
1219 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001220 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001221 MI = BuildMI(LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
1222 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001223 break;
1224
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001225 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001226 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001227 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1228 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001229
1230 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001231 MI = BuildMI(WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001232 break;
1233
1234 case FloatCCRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001235 assert(0 && "Tell Vikram if this assertion fails: we may have to mask "
1236 "out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001237 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001238 MI = BuildMI(LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
1239 .addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001240 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001241
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001242 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001243 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001244 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001245 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001246}
1247
1248
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001249//---------------------------------------------------------------------------
1250// Generate a copy instruction to copy a value to another. Temporarily
1251// used by PhiElimination code.
1252//---------------------------------------------------------------------------
1253
1254
Vikram S. Advee9327f02002-05-19 15:25:51 +00001255void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001256UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001257 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001258 int RegType = getRegType( Src );
1259
1260 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001261
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001262 MachineInstr * MI = NULL;
1263
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001264 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001265 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001266 MI = BuildMI(ADD, 3).addReg(Src).addMReg(getZeroRegNum()).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001267 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001268 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001269 MI = BuildMI(FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001270 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001271 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001272 MI = BuildMI(FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001273 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001274 default:
1275 assert(0 && "Unknow RegType in CpValu2Value");
1276 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001277
Chris Lattner9bebf832002-10-28 20:10:56 +00001278 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001279}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001280
1281
1282
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001283
1284
1285
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001286//----------------------------------------------------------------------------
1287// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001288// a call machine instruction. The caller saving/restoring instructions are
1289// inserted like:
1290//
1291// ** caller saving instructions
1292// other instructions inserted for the call by ColorCallArg
1293// CALL instruction
1294// other instructions inserted for the call ColorCallArg
1295// ** caller restoring instructions
1296//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001297//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001298
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001299
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001300void
1301UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1302 vector<MachineInstr*>& instrnsAfter,
1303 MachineInstr *CallMI,
1304 const BasicBlock *BB,
1305 PhyRegAlloc &PRA) const
1306{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001307 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001308
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001309 // has set to record which registers were saved/restored
1310 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001311 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001312
Vikram S. Advee9327f02002-05-19 15:25:51 +00001313 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1314
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001315 // Now find the LR of the return value of the call
1316 // The last *implicit operand* is the return value of a call
1317 // Insert it to to he PushedRegSet since we must not save that register
1318 // and restore it after the call.
1319 // We do this because, we look at the LV set *after* the instruction
1320 // to determine, which LRs must be saved across calls. The return value
1321 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001322
Vikram S. Advee9327f02002-05-19 15:25:51 +00001323 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001324
Chris Lattner5216cc52002-02-04 05:59:25 +00001325 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001326 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001327 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001328
Chris Lattner5216cc52002-02-04 05:59:25 +00001329 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001330 PushedRegSet.insert(
1331 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001332 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001333 }
1334
Vikram S. Advee9327f02002-05-19 15:25:51 +00001335 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001336 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001337
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001338 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001339 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001340
1341 // get the live range corresponding to live var
1342 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1343
1344 // LR can be null if it is a const since a const
1345 // doesn't have a dominating def - see Assumptions above
1346 if( LR ) {
1347
1348 if( LR->hasColor() ) {
1349
1350 unsigned RCID = (LR->getRegClass())->getID();
1351 unsigned Color = LR->getColor();
1352
1353 if ( isRegVolatile(RCID, Color) ) {
1354
1355 // if the value is in both LV sets (i.e., live before and after
1356 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001357
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001358 unsigned Reg = getUnifiedRegNum(RCID, Color);
1359
1360 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1361
1362 // if we haven't already pushed that register
1363
1364 unsigned RegType = getRegType( LR );
1365
1366 // Now get two instructions - to push on stack and pop from stack
1367 // and add them to InstrnsBefore and InstrnsAfter of the
1368 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001369 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001370 int StackOff =
1371 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001372
Vikram S. Adveaee67012002-07-08 23:23:12 +00001373 vector<MachineInstr*> AdIBef, AdIAft;
1374
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001375 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001376
1377 // We may need a scratch register to copy the saved value
1378 // to/from memory. This may itself have to insert code to
1379 // free up a scratch register. Any such code should go before
1380 // the save code.
1381 int scratchRegType = -1;
1382 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001383 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001384 { // Find a register not live in the LVSet before CallMI
1385 const ValueSet &LVSetBef =
1386 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1387 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1388 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001389 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001390 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001391 }
1392
1393 if (AdIBef.size() > 0)
1394 instrnsBefore.insert(instrnsBefore.end(),
1395 AdIBef.begin(), AdIBef.end());
1396
1397 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1398 scratchReg);
1399
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001400 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001401 instrnsBefore.insert(instrnsBefore.end(),
1402 AdIAft.begin(), AdIAft.end());
1403
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001404 //---- Insert code for popping the reg from the stack ----------
1405
Vikram S. Adveaee67012002-07-08 23:23:12 +00001406 // We may need a scratch register to copy the saved value
1407 // from memory. This may itself have to insert code to
1408 // free up a scratch register. Any such code should go
1409 // after the save code.
1410 //
1411 scratchRegType = -1;
1412 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001413 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001414 { // Find a register not live in the LVSet after CallMI
1415 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1416 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001417 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001418 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001419 }
1420
1421 if (AdIBef.size() > 0)
1422 instrnsAfter.insert(instrnsAfter.end(),
1423 AdIBef.begin(), AdIBef.end());
1424
1425 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1426 scratchReg);
1427
1428 if (AdIAft.size() > 0)
1429 instrnsAfter.insert(instrnsAfter.end(),
1430 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001431
Chris Lattner7e5ee422002-02-05 04:20:12 +00001432 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001433
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001434 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001435 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001436 cerr << " -inserted caller saving instrs: Before:\n\t ";
1437 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001438 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001439 cerr << " -and After:\n\t ";
1440 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001441 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001442 }
1443 } // if not already pushed
1444
1445 } // if LR has a volatile color
1446
1447 } // if LR has color
1448
1449 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001450
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001451 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001452}
1453
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001454
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001455//---------------------------------------------------------------------------
1456// Print the register assigned to a LR
1457//---------------------------------------------------------------------------
1458
Chris Lattner5216cc52002-02-04 05:59:25 +00001459void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001460 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001461 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001462
Chris Lattner5216cc52002-02-04 05:59:25 +00001463 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001464 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001465 return;
1466 }
1467
1468 // if a color is found
1469
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001470 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001471
Chris Lattner5216cc52002-02-04 05:59:25 +00001472 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001473 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001474
Chris Lattner5216cc52002-02-04 05:59:25 +00001475 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001476 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001477 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001478 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001479 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001480 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001481}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001482
1483//---------------------------------------------------------------------------
1484// This method examines instructions inserted by RegAlloc code before a
1485// machine instruction to detect invalid orders that destroy values before
1486// they are used. If it detects such conditions, it reorders the instructions.
1487//
1488// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001489// instructions inserted by RegAlloc. All such instruction MUST have
1490// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001491//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001492// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1493// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001494//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001495// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001496//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001497// Since instructions are inserted in RegAlloc, this assumes that the
1498// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001499// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001500//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001501// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001502//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001503
1504void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1505 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001506 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001507
1508 /*
1509 Problem: We can have instructions inserted by RegAlloc like
1510 1. add %ox %g0 %oy
1511 2. add %oy %g0 %oz, where z!=x or z==x
1512
1513 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001514
1515 Solution:
1516 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001517
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001518 Algorithm:
1519
1520 do
1521 for each instruction 'DefInst' in the UnOrdVec
1522 for each instruction 'UseInst' that follows the DefInst
1523 if the reg defined by DefInst is used by UseInst
1524 mark DefInst as not movable in this iteration
1525 If DefInst is not marked as not-movable, move DefInst to OrdVec
1526 while all instructions in DefInst are moved to OrdVec
1527
1528 For moving, we call the move2OrdVec(). It checks whether there is a def
1529 in it for the uses in the instruction to be added to OrdVec. If there
1530 are no preceding defs, it just appends the instruction. If there is a
1531 preceding def, it puts two instructions to save the reg on stack before
1532 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001533
1534 */
1535
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001536 bool CouldMoveAll;
1537 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001539 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001541 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001542
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001543 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001544
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001545 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001546
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001549 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001550
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001551 //cerr << "\nInst in UnordVec = " << *DefInst;
1552
1553 // last operand is the def (unless for a store which has no def reg)
1554 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1555
Chris Lattner6a30b022002-10-28 04:45:29 +00001556 if (DefOp.opIsDef() &&
1557 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001558
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001559 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561
Chris Lattner7f74a562002-01-20 22:54:45 +00001562 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001563 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001564
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001565 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1566
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001567 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001568 if( UseInst == NULL) continue;
1569
1570 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001571 MachineOperand& UseOp = UseInst->getOperand(0);
1572
Chris Lattner6a30b022002-10-28 04:45:29 +00001573 if (!UseOp.opIsDef() &&
1574 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001575
1576 // if use is a register ...
1577
1578 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1579
1580 // if Def and this use are the same, it means that this use
1581 // is destroyed by a def before it is used
1582
1583 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001584
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001585 DefEqUse = true;
1586 CouldMoveAll = false;
1587 DebugPrint = true;
1588 break;
1589 } // if two registers are equal
1590
1591 } // if use is a register
1592
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001593 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001594
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001595 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001596
1597 // after examining all the instructions that follow the DefInst
1598 // if there are no dependencies, we can move it to the OrdVec
1599
1600 // cerr << "Moved to Ord: " << *DefInst;
1601
1602 moveInst2OrdVec(OrdVec, DefInst, PRA);
1603
1604 //OrdVec.push_back(DefInst);
1605
1606 // mark the pos of DefInst with NULL to indicate that it is
1607 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001608 *DefIt = NULL;
1609 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001610
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001611 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001612
1613 } // for all instructions in the UnordVec
1614
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001615
Chris Lattner5216cc52002-02-04 05:59:25 +00001616 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001617
Chris Lattner070cf772002-06-04 03:09:57 +00001618 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001619 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001620 for(unsigned i=0; i < OrdVec.size(); i++)
1621 cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001622 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001623}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001624
1625
1626
1627
1628
Chris Lattner7f74a562002-01-20 22:54:45 +00001629void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001630 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001631 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001632 MachineOperand& UseOp = UnordInst->getOperand(0);
1633
Chris Lattner6a30b022002-10-28 04:45:29 +00001634 if (!UseOp.opIsDef() &&
1635 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001636
1637 // for the use of UnordInst, see whether there is a defining instr
1638 // before in the OrdVec
1639 bool DefEqUse = false;
1640
Chris Lattner7f74a562002-01-20 22:54:45 +00001641 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001642
1643 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1644
1645 MachineInstr *OrdInst = *OrdIt ;
1646
1647 MachineOperand& DefOp =
1648 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1649
1650 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001651 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001652
1653 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1654
1655 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1656
1657 // we are here because there is a preceding def in the OrdVec
1658 // for the use in this intr we are going to insert. This
1659 // happened because the original code was like:
1660 // 1. add %ox %g0 %oy
1661 // 2. add %oy %g0 %ox
1662 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1663 // Now we are processing %ox of 1.
1664 // We have to
1665
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001666 int UReg = DefOp.getMachineRegNum();
1667 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001668 MachineInstr *AdIBef, *AdIAft;
1669
Chris Lattnerd47aac92002-12-28 20:21:29 +00001670 int StackOff =
1671 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001672
1673 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001674 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001675 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattnerd47aac92002-12-28 20:21:29 +00001676 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1677 MI != mvec.end(); ++MI)
1678 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001679
1680 // Load directly into DReg (%oy)
1681 MachineOperand& DOp=
1682 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1683 assert(DOp.opIsDef() && "Last operand is not the def");
1684 const int DReg = DOp.getMachineRegNum();
1685
Vikram S. Adveaee67012002-07-08 23:23:12 +00001686 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001687
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001688 if( DEBUG_RA ) {
Vikram S. Adve92ccbb92002-10-14 16:32:49 +00001689 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001690 cerr << "\nBefore CIRCULAR Reordering:\n";
1691 cerr << *UnordInst;
1692 cerr << *OrdInst;
1693
1694 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1695 for(unsigned i=0; i < OrdVec.size(); i++)
1696 cerr << *(OrdVec[i]);
1697 }
1698
1699 // Do not copy the UseInst to OrdVec
1700 DefEqUse = true;
1701 break;
1702
1703 }// if two registers are equal
1704
1705 } // if Def is a register
1706
1707 } // for each instr in OrdVec
1708
Chris Lattner5216cc52002-02-04 05:59:25 +00001709 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001710
1711 // We didn't find a def in the OrdVec, so just append this inst
1712 OrdVec.push_back( UnordInst );
1713 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1714 }
1715
1716 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001717}