blob: 1c75e6587fca6819ecf306cac101199e9e3e8cd2 [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 Lattnera23969b2003-01-15 19:57:07 +000017#include "llvm/CodeGen/RegClass.h"
Chris Lattner90fc6652003-01-15 19:50:44 +000018#include "../../CodeGen/RegAlloc/RegAllocCommon.h" // FIXME!
Chris Lattner5216cc52002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000023using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000024using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000025
Chris Lattner24c1d5e2003-01-14 23:05:08 +000026enum {
27 BadRegClass = ~0
28};
29
Chris Lattner5216cc52002-02-04 05:59:25 +000030UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerf9781b52002-12-29 03:13:05 +000031 : TargetRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner5216cc52002-02-04 05:59:25 +000032 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
33
34 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
36 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
37 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000038
Chris Lattner56e91662002-08-12 21:25:05 +000039 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000040 "32 Float regs are used for float arg passing");
41}
42
43
Vikram S. Advedb1435f2002-03-18 03:12:16 +000044// getZeroRegNum - returns the register that contains always zero.
45// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000046//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000047int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000048 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
49 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000050}
Chris Lattner5216cc52002-02-04 05:59:25 +000051
52// getCallAddressReg - returns the reg used for pushing the address when a
53// method is called. This can be used for other purposes between calls
54//
55unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000056 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
57 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000058}
59
60// Returns the register containing the return address.
61// It should be made sure that this register contains the return
62// value when a return instruction is reached.
63//
64unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000065 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
66 SparcIntRegClass::i7);
67}
68
69// Register get name implementations...
70
71// Int register names in same order as enum in class SparcIntRegClass
72static const char * const IntRegNames[] = {
73 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
74 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
75 "i0", "i1", "i2", "i3", "i4", "i5",
76 "i6", "i7",
77 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
78 "o6"
79};
80
81const char * const SparcIntRegClass::getRegName(unsigned reg) {
82 assert(reg < NumOfAllRegs);
83 return IntRegNames[reg];
84}
85
86static const char * const FloatRegNames[] = {
87 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
88 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
89 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
90 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
91 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
92 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
93 "f60", "f61", "f62", "f63"
94};
95
96const char * const SparcFloatRegClass::getRegName(unsigned reg) {
97 assert (reg < NumOfAllRegs);
98 return FloatRegNames[reg];
99}
100
101
102static const char * const IntCCRegNames[] = {
103 "xcc", "ccr"
104};
105
106const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
107 assert(reg < 2);
108 return IntCCRegNames[reg];
109}
110
111static const char * const FloatCCRegNames[] = {
112 "fcc0", "fcc1", "fcc2", "fcc3"
113};
114
115const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
116 assert (reg < 4);
117 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000118}
119
120// given the unified register number, this gives the name
121// for generating assembly code or debugging.
122//
Chris Lattner56e91662002-08-12 21:25:05 +0000123const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000124 if( reg < 32 )
Chris Lattner56e91662002-08-12 21:25:05 +0000125 return SparcIntRegClass::getRegName(reg);
Chris Lattner5216cc52002-02-04 05:59:25 +0000126 else if ( reg < (64 + 32) )
Chris Lattner56e91662002-08-12 21:25:05 +0000127 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner5216cc52002-02-04 05:59:25 +0000128 else if( reg < (64+32+4) )
Chris Lattner56e91662002-08-12 21:25:05 +0000129 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner5216cc52002-02-04 05:59:25 +0000130 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner56e91662002-08-12 21:25:05 +0000131 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner5216cc52002-02-04 05:59:25 +0000132 else if (reg== InvalidRegNum) //****** TODO: Remove */
133 return "<*NoReg*>";
134 else
135 assert(0 && "Invalid register number");
136 return "";
137}
138
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000139// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000140unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000141 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
142 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000143}
144
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000145// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000146unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000147 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
148 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000149}
150
151
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000152//---------------------------------------------------------------------------
153// Finds whether a call is an indirect call
154//---------------------------------------------------------------------------
155
156inline bool
157isVarArgsFunction(const Type *funcType) {
158 return cast<FunctionType>(cast<PointerType>(funcType)
159 ->getElementType())->isVarArg();
160}
161
162inline bool
163isVarArgsCall(const MachineInstr *CallMI) {
164 Value* callee = CallMI->getOperand(0).getVRegValue();
165 // const Type* funcType = isa<Function>(callee)? callee->getType()
166 // : cast<PointerType>(callee->getType())->getElementType();
167 const Type* funcType = callee->getType();
168 return isVarArgsFunction(funcType);
169}
170
171
172// Get the register number for the specified integer arg#,
173// assuming there are argNum total args, intArgNum int args,
174// and fpArgNum FP args preceding (and not including) this one.
175// Use INT regs for FP args if this is a varargs call.
176//
177// Return value:
178// InvalidRegNum, if there is no int register available for the arg.
179// regNum, otherwise (this is NOT the unified reg. num).
180//
181inline int
182UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
183 unsigned argNo,
184 unsigned intArgNo, unsigned fpArgNo,
185 unsigned& regClassId) const
186{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000187 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000188 if (argNo >= NumOfIntArgRegs)
189 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000190 else
Chris Lattner56e91662002-08-12 21:25:05 +0000191 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000192}
193
194// Get the register number for the specified FP arg#,
195// assuming there are argNum total args, intArgNum int args,
196// and fpArgNum FP args preceding (and not including) this one.
197// Use INT regs for FP args if this is a varargs call.
198//
199// Return value:
200// InvalidRegNum, if there is no int register available for the arg.
201// regNum, otherwise (this is NOT the unified reg. num).
202//
203inline int
204UltraSparcRegInfo::regNumForFPArg(unsigned regType,
205 bool inCallee, bool isVarArgsCall,
206 unsigned argNo,
207 unsigned intArgNo, unsigned fpArgNo,
208 unsigned& regClassId) const
209{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000210 if (isVarArgsCall)
211 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
212 regClassId);
213 else
214 {
215 regClassId = FloatRegClassID;
216 if (regType == FPSingleRegType)
217 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000218 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000219 else if (regType == FPDoubleRegType)
220 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000221 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000222 else
223 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000224 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000225 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000226}
227
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000228
229//---------------------------------------------------------------------------
230// Finds the return address of a call sparc specific call instruction
231//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000232
Vikram S. Adveaee67012002-07-08 23:23:12 +0000233// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000234// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000235//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000236int UltraSparcRegInfo::getRegType(unsigned regClassID,
237 const Type* type) const {
238 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000239 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000240 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000241 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000242 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000243 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000244 return FPDoubleRegType;
245 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000246 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000247 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000249 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000250 }
251}
252
Vikram S. Advee9327f02002-05-19 15:25:51 +0000253int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
254 return getRegType(LR->getRegClass()->getID(), LR->getType());
255}
256
Chris Lattner5216cc52002-02-04 05:59:25 +0000257int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000258 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000259}
260
Vikram S. Adveaee67012002-07-08 23:23:12 +0000261int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
262 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000263 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000264 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000265 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000266 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000267 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000268 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000269 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000270 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000271 return IntCCRegType;
272 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000273 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000274 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000275}
276
277
Vikram S. Adveaee67012002-07-08 23:23:12 +0000278// To find the register class used for a specified Type
279//
280unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000281 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000282 Type::PrimitiveID ty = type->getPrimitiveID();
283 unsigned res;
284
285 // FIXME: Comparing types like this isn't very safe...
286 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
287 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
288 res = IntRegClassID; // sparc int reg (ty=0: void)
289 else if (ty <= Type::DoubleTyID)
290 res = FloatRegClassID; // sparc float reg class
291 else {
292 //std::cerr << "TypeID: " << ty << "\n";
293 assert(0 && "Cannot resolve register class for type");
294 return 0;
295 }
296
297 if(isCCReg)
298 return res + 2; // corresponidng condition code regiser
299 else
300 return res;
301}
302
303// To find the register class to which a specified register belongs
304//
305unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
306 unsigned classId = 0;
307 (void) getClassRegNum(unifiedRegNum, classId);
308 return classId;
309}
310
311unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
312 switch(regType) {
313 case IntRegType: return IntRegClassID;
314 case FPSingleRegType:
315 case FPDoubleRegType: return FloatRegClassID;
316 case IntCCRegType: return IntCCRegClassID;
317 case FloatCCRegType: return FloatCCRegClassID;
318 default:
319 assert(0 && "Invalid register type in getRegClassIDOfRegType");
320 return 0;
321 }
322}
323
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000324//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000325// Suggests a register for the ret address in the RET machine instruction.
326// We always suggest %i7 by convention.
327//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000328void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000329 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000330
Vikram S. Adveaee67012002-07-08 23:23:12 +0000331 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000332
Vikram S. Adveaee67012002-07-08 23:23:12 +0000333 // return address is always mapped to i7 so set it immediately
334 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000335 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000336
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000337 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000338 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000339 // we have to test later whether it received the suggested color.
340 // In that case, a LR has to be created at the start of method.
341 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000342
Vikram S. Adveaee67012002-07-08 23:23:12 +0000343 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000344 // const Value *RetAddrVal = MO.getVRegValue();
345 // assert( RetAddrVal && "LR for ret address must be created at start");
346 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
347 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000348 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000349}
350
351
352//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000353// Suggests a register for the ret address in the JMPL/CALL machine instr.
354// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000356void
357UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
358 LiveRangeInfo& LRI) const
359{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000360 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
361 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000362 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000363
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000364 // A LR must already exist for the return address.
365 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
366 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
367
368 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
369 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
370}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000371
372
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000373
374//---------------------------------------------------------------------------
375// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000376// According to the Sparc ABI, the first 6 incoming args are in
377// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000378// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000379// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000380//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000381void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000382 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000383{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000384 // check if this is a varArgs function. needed for choosing regs.
385 bool isVarArgs = isVarArgsFunction(Meth->getType());
386
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000387 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000388 unsigned argNo=0, intArgNo=0, fpArgNo=0;
389 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
390 I != E; ++I, ++argNo) {
391 // get the LR of arg
392 LiveRange *LR = LRI.getLiveRangeForValue(I);
393 assert(LR && "No live range found for method arg");
394
395 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000396 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000397
398 int regNum = (regType == IntRegType)
399 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
400 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
401 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
402 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
403
404 if(regNum != InvalidRegNum)
405 LR->setSuggestedColor(regNum);
406 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000407}
408
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000409
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000410//---------------------------------------------------------------------------
411// This method is called after graph coloring to move incoming args to
412// the correct hardware registers if they did not receive the correct
413// (suggested) color through graph coloring.
414//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000415void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000416 LiveRangeInfo &LRI,
417 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000418
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000419 // check if this is a varArgs function. needed for choosing regs.
420 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000421 MachineInstr *AdMI;
422
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000423 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000424 // for each argument. count INT and FP arguments separately.
425 unsigned argNo=0, intArgNo=0, fpArgNo=0;
426 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
427 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000428 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000429 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000430 assert( LR && "No live range found for method arg");
431
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000432 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000434
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000435 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000436 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000437 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000438 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000439 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000440 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000441
442 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000443 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
444 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
445 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
446 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000447
448 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000450 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000451 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000452
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000453 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000454
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000455 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
456
457 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000458 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000459 if( UniLRReg == UniArgReg )
460 continue;
461
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000462 // We are here because the LR did not receive the suggested
463 // but LR received another register.
464 // Now we have to copy the %i reg (or stack pos of arg)
465 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000466
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000467 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000468 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000469 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000470 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000471 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000472 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000473
474 // It is a variable argument call: the float reg must go in a %o reg.
475 // We have to move an int reg to a float reg via memory.
476 //
477 assert(isVarArgs &&
478 RegClassID == FloatRegClassID &&
479 regClassIDOfArgReg == IntRegClassID &&
480 "This should only be an Int register for an FP argument");
481
Chris Lattnerd47aac92002-12-28 20:21:29 +0000482 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000483 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000484 cpReg2MemMI(FirstAI->InstrnsBefore,
485 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000486
Vikram S. Adveaee67012002-07-08 23:23:12 +0000487 cpMem2RegMI(FirstAI->InstrnsBefore,
488 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000489 }
490 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000491 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000492 }
493 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000494 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000495
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000496 // Now the arg is coming on stack. Since the LR recieved a register,
497 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000498 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000499 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000500 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000501 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000502 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000503
Vikram S. Adveaee67012002-07-08 23:23:12 +0000504 cpMem2RegMI(FirstAI->InstrnsBefore,
505 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000506 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000507
508 } // if LR received a color
509
510 else {
511
512 // Now, the LR did not receive a color. But it has a stack offset for
513 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000514 // So, if the arg is coming in UniArgReg register, we can just move
515 // that on to the stack pos of LR
516
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000517 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000518
519 if( regClassIDOfArgReg != RegClassID ) {
520 assert(0 &&
521 "FP arguments to a varargs function should be explicitly "
522 "copied to/from int registers by instruction selection!");
523
524 // It must be a float arg for a variable argument call, which
525 // must come in a %o reg. Move the int reg to the stack.
526 //
527 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
528 "This should only be an Int register for an FP argument");
529
Vikram S. Adveaee67012002-07-08 23:23:12 +0000530 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
531 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000532 }
533 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000534 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
535 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000536 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000537 }
538
539 else {
540
541 // Now the arg is coming on stack. Since the LR did NOT
542 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000543 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000544 // since this method is called before any other method that makes
545 // uses of the stack pos of the LR (e.g., updateMachineInstr)
546
Chris Lattnerd47aac92002-12-28 20:21:29 +0000547 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000548 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000549 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000550 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000551
552 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000553 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000554
555 }
556
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000557 } // for each incoming argument
558
559}
560
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000561
562
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000563//---------------------------------------------------------------------------
564// This method is called before graph coloring to suggest colors to the
565// outgoing call args and the return value of the call.
566//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000567void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000568 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000569 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000570
Vikram S. Advee9327f02002-05-19 15:25:51 +0000571 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000572
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000573 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000574
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000575 // First color the return value of the call instruction, if any.
576 // The return value will be in %o0 if the value is an integer type,
577 // or in %f0 if the value is a float type.
578 //
579 if (const Value *RetVal = argDesc->getReturnValue()) {
580 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
581 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000582
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000583 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000584
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000585 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000586 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000587 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000588 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000589 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000590 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000591 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000592
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000593 // Now suggest colors for arguments (operands) of the call instruction.
594 // Colors are suggested only if the arg number is smaller than the
595 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000596 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000597
Vikram S. Advee9327f02002-05-19 15:25:51 +0000598 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000599
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000600 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
601 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000602
Vikram S. Advee9327f02002-05-19 15:25:51 +0000603 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604
605 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000606 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000607 assert (LR && "Must have a LR for all arguments since "
608 "all args (even consts) must be defined before");
609
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000610 unsigned regType = getRegType( LR );
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000611 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000612
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000613 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000614 // an INT or FP value. Here we ignore whether or not it is a
615 // varargs calls, because FP arguments will be explicitly copied
616 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000617 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000618 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
619 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
620 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
621 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000622
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000623 // If a register could be allocated, use it.
624 // If not, do NOTHING as this will be colored as a normal value.
625 if(regNum != InvalidRegNum)
626 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000627
Vikram S. Advee9327f02002-05-19 15:25:51 +0000628 // Repeat for the second copy of the argument, which would be
629 // an FP argument being passed to a function with no prototype
630 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
631 if (argCopy != NULL)
632 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000633 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000634 && "Must be passing copy of FP argument in int register");
635 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
636 argNo, intArgNo, fpArgNo-1,
637 regClassIDOfArgReg);
638 assert(copyRegNum != InvalidRegNum);
639 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
640 copyLR->setSuggestedColor(copyRegNum);
641 }
642
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000643 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000644
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000645}
646
647
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000648//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000649// Helper method for UltraSparcRegInfo::colorCallArgs().
650//---------------------------------------------------------------------------
651
652void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000653UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000654 AddedInstrns *CallAI,
655 PhyRegAlloc &PRA, LiveRange* LR,
656 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000657 int UniArgRegOrNone, unsigned argNo,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000658 std::vector<MachineInstr *>& AddedInstrnsBefore)
659 const
660{
661 MachineInstr *AdMI;
662 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000663 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000664 if (UniArgRegOrNone != InvalidRegNum)
665 {
666 isArgInReg = true;
667 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000668 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000669 }
670
671 if (LR->hasColor()) {
672 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
673
674 // if LR received the correct color, nothing to do
675 if( isArgInReg && UniArgReg == UniLRReg )
676 return;
677
678 // The LR is allocated to a register UniLRReg and must be copied
679 // to UniArgReg or to the stack slot.
680 //
681 if( isArgInReg ) {
682 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000683 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000684 }
685 else {
686 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000687 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000688 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000689 cpReg2MemMI(CallAI->InstrnsBefore,
690 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000691 }
692
693 } else { // LR is not colored (i.e., spilled)
694
695 if( isArgInReg ) {
696 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000697 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
698 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000699 // Now add the instruction
700 }
701
702 else {
703 // Now, we have to pass the arg on stack. Since LR also did NOT
704 // receive a register we have to move an argument in memory to
705 // outgoing parameter on stack.
706 // Use TReg to load and store the value.
707 // Use TmpOff to save TReg, since that may have a live value.
708 //
709 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Chris Lattnerd47aac92002-12-28 20:21:29 +0000710 int TmpOff = PRA.MF.getInfo()->
711 pushTempValue(getSpilledRegSize(getRegType(LR)));
712 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000713 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000714
715 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
716
717 // Sequence:
718 // (1) Save TReg on stack
719 // (2) Load LR value into TReg from stack pos of LR
720 // (3) Store Treg on outgoing Arg pos on stack
721 // (4) Load the old value of TReg from stack to TReg (restore it)
722 //
723 // OPTIMIZE THIS:
724 // When reverse pointers in MahineInstr are introduced:
725 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
726 // needed only if this fails. Currently, we cannot call the
727 // above method since we cannot find LVSetBefore without the BB
728 //
729 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
730 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000731 cpReg2MemMI(CallAI->InstrnsBefore,
732 TReg, getFramePointer(), TmpOff, regType);
733 cpMem2RegMI(CallAI->InstrnsBefore,
734 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
735 cpReg2MemMI(CallAI->InstrnsBefore,
736 TReg, getStackPointer(), argOffset, regType);
737 cpMem2RegMI(CallAI->InstrnsBefore,
738 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000739 }
740 }
741}
742
743//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000744// After graph coloring, we have call this method to see whehter the return
745// value and the call args received the correct colors. If not, we have
746// to instert copy instructions.
747//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000748
Vikram S. Adveaee67012002-07-08 23:23:12 +0000749void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000750 LiveRangeInfo &LRI,
751 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000752 PhyRegAlloc &PRA,
753 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000754
Vikram S. Adve879eac92002-10-13 00:05:30 +0000755 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000756
Vikram S. Advee9327f02002-05-19 15:25:51 +0000757 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
758
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000759 // First color the return value of the call.
760 // If there is a LR for the return value, it means this
761 // method returns a value
762
763 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000764
Vikram S. Advee9327f02002-05-19 15:25:51 +0000765 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000766
Chris Lattner30e8fb62002-02-05 01:43:49 +0000767 if (RetVal) {
768 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000769
Chris Lattner30e8fb62002-02-05 01:43:49 +0000770 if (!RetValLR) {
771 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000772 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000773 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000774
775 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000776 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000777 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000778 unsigned UniRetReg; // unified number for CorrectCol
779
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000780 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000781 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000782 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000783 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000784 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000785 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000786 return;
787 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000788
789 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000790 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000791
Vikram S. Adveaee67012002-07-08 23:23:12 +0000792 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000793 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000794
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000795 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000796 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
797 : false;
798
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000799 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000800 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000801 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000802
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000803 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000804
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000805 if( RetValLR->hasColor() ) {
806
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000807 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000808
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000809 // the return value is coming in UniRetReg but has to go into
810 // the UniRetLRReg
811
Vikram S. Adveaee67012002-07-08 23:23:12 +0000812 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000813
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000814 } // if LR has color
815 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000816
817 // if the LR did NOT receive a color, we have to move the return
818 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000819
Vikram S. Adveaee67012002-07-08 23:23:12 +0000820 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
821 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000822 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000823
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000824 } // the LR didn't receive the suggested color
825
826 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000827
828
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000829 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000830 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000831 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000832
Chris Lattner7f74a562002-01-20 22:54:45 +0000833 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000834
835 unsigned NumOfCallArgs = argDesc->getNumArgs();
836
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000837 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
838 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000839
Vikram S. Advee9327f02002-05-19 15:25:51 +0000840 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
841
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000842 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000843 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000844
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000845 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000846 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000847
Vikram S. Advee9327f02002-05-19 15:25:51 +0000848 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000849 // Also find the correct register the argument must use (UniArgReg)
850 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000851 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000852 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000853 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000854
Vikram S. Advee9327f02002-05-19 15:25:51 +0000855 // Find the register that must be used for this arg, depending on
856 // whether it is an INT or FP value. Here we ignore whether or not it
857 // is a varargs calls, because FP arguments will be explicitly copied
858 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000859 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000860 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
861 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
862 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
863 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000864
865 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000866 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000867 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000868 assert(regClassIDOfArgReg == RegClassID &&
869 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000870 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000871
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000872 // not possible to have a null LR since all args (even consts)
873 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000874 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000875 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000876 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000878
879 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
880 UniArgReg, argNo, AddedInstrnsBefore);
881
882 // Repeat for the second copy of the argument, which would be
883 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000884 // It may either be passed as a copy in an integer register
885 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000886 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
887 if (argCopy != NULL)
888 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000889 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000890 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000891
Vikram S. Advee9327f02002-05-19 15:25:51 +0000892 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
893 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
894
895 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
896 argNo, intArgNo, fpArgNo-1,
897 regClassIDOfArgReg);
898 assert(copyRegNum != InvalidRegNum);
899 assert(regClassIDOfArgReg == copyRegClassID &&
900 "Moving values between reg classes must happen during selection");
901
902 InitializeOutgoingArg(CallMI, CallAI, PRA,
903 LRI.getLiveRangeForValue(argCopy), copyRegType,
904 copyRegClassID, copyRegNum, argNo,
905 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000906 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000907
908 if (regNum != InvalidRegNum &&
909 argDesc->getArgInfo(i).usesStackSlot())
910 {
911 // Pass the argument via the stack in addition to regNum
912 assert(regType != IntRegType && "Passing an integer arg. twice?");
913 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
914 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
915 InvalidRegNum, argNo, AddedInstrnsBefore);
916 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000917 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000918
Vikram S. Advee9327f02002-05-19 15:25:51 +0000919 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000920 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000921 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000922 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000923 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000924
Chris Lattner5216cc52002-02-04 05:59:25 +0000925 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000926 cerr << "\nCalling reorder with instrns: \n";
927 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
928 cerr << *(AddedInstrnsBefore[i]);
929 }
930
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000931 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
932 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
933 && "Dropped some instructions when reordering!");
934
Chris Lattner5216cc52002-02-04 05:59:25 +0000935 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000936 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000937 for(unsigned i = 0; i < ReorderedVec.size(); i++)
938 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000939 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000940 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000941
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000942 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000943 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000944 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
945 CallMI, BB, PRA);
946
947 // Then insert the final reordered code for the call arguments.
948 //
949 for(unsigned i=0; i < ReorderedVec.size(); i++)
950 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000951}
952
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953//---------------------------------------------------------------------------
954// This method is called for an LLVM return instruction to identify which
955// values will be returned from this method and to suggest colors.
956//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000957void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000958 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000959
Vikram S. Adve879eac92002-10-13 00:05:30 +0000960 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000961
Vikram S. Adveaee67012002-07-08 23:23:12 +0000962 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000963
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000964 // if there is an implicit ref, that has to be the ret value
965 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000966
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000967 // The first implicit operand is the return value of a return instr
968 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000970 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000971
Chris Lattner30e8fb62002-02-05 01:43:49 +0000972 if (!LR) {
973 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
974 assert(0 && "No LR for return value of non-void method");
975 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000977 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000978
Chris Lattner5216cc52002-02-04 05:59:25 +0000979 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000980 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000981 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000982 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000983 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984}
985
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000986
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000987
988//---------------------------------------------------------------------------
989// Colors the return value of a method to %i0 or %f0, if possible. If it is
990// not possilbe to directly color the LR, insert a copy instruction to move
991// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
992// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000993//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000994void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000995 LiveRangeInfo &LRI,
996 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000997
Vikram S. Adve879eac92002-10-13 00:05:30 +0000998 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000999
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001000 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +00001001 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001003 // The first implicit operand is the return value of a return instr
1004 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001005
Chris Lattner5216cc52002-02-04 05:59:25 +00001006 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001007
Chris Lattner30e8fb62002-02-05 01:43:49 +00001008 if (!LR) {
1009 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1010 // assert( LR && "No LR for return value of non-void method");
1011 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001012 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001015 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001016
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001017 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001019 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001021 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001022 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001023 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001024 return;
1025 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001026
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001027 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001028 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001029
Vikram S. Adveaee67012002-07-08 23:23:12 +00001030 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001031 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001032
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001033 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001034
Chris Lattner5216cc52002-02-04 05:59:25 +00001035 if (LR->hasColor() && LR->getColor() == CorrectCol)
1036 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001037
Chris Lattner5216cc52002-02-04 05:59:25 +00001038 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001039
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001040 // We are here because the LR was allocted a regiter
1041 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001042
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001043 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001044
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001045 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001046
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001047 // the LR received UniLRReg but must be colored with UniRetReg
1048 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001049 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001050 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001051 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001052 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1053 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001054 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001055 }
1056
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001057 } // if there is a return value
1058
1059}
1060
Vikram S. Adveaee67012002-07-08 23:23:12 +00001061//---------------------------------------------------------------------------
1062// Check if a specified register type needs a scratch register to be
1063// copied to/from memory. If it does, the reg. type that must be used
1064// for scratch registers is returned in scratchRegType.
1065//
1066// Only the int CC register needs such a scratch register.
1067// The FP CC registers can (and must) be copied directly to/from memory.
1068//---------------------------------------------------------------------------
1069
1070bool
1071UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1072 int& scratchRegType) const
1073{
1074 if (RegType == IntCCRegType)
1075 {
1076 scratchRegType = IntRegType;
1077 return true;
1078 }
1079 return false;
1080}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001081
1082//---------------------------------------------------------------------------
1083// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001084// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001085//---------------------------------------------------------------------------
1086
Vikram S. Advee9327f02002-05-19 15:25:51 +00001087void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001088UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1089 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001090 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001091 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001092 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001093 "Invalid Register");
1094
1095 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001096
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001097 switch( RegType ) {
1098
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001099 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001100 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001101 { // copy intCC reg to int reg
1102 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001103 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001104 }
1105 else
1106 { // copy int reg to intCC reg
1107 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001108 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001109 && "Can only copy CC reg to/from integer reg");
Chris Lattner1ebaa902003-01-15 17:47:49 +00001110 MI = BuildMI(WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001111 }
1112 break;
1113
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001114 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001115 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001116 break;
1117
1118 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001119 MI = BuildMI(ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1120 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001121 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001122
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001123 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001124 MI = BuildMI(FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001125 break;
1126
1127 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001128 MI = BuildMI(FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001129 break;
1130
1131 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001132 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001133 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001134 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001135
1136 if (MI)
1137 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001138}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001139
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001140//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001141// Copy from a register to memory (i.e., Store). Register number must
1142// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001143//---------------------------------------------------------------------------
1144
1145
Vikram S. Advee9327f02002-05-19 15:25:51 +00001146void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001147UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1148 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001149 unsigned DestPtrReg,
1150 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001151 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001152 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001153 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001154 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001155 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001156 MI = BuildMI(STX, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001157 break;
1158
1159 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001160 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001161 MI = BuildMI(ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001162 break;
1163
1164 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001165 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001166 MI = BuildMI(STD, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001167 break;
1168
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001169 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001170 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001171 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001172
1173 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001174 MI = BuildMI(RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001175 mvec.push_back(MI);
1176
Chris Lattner56e91662002-08-12 21:25:05 +00001177 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001178 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001179
1180 case FloatCCRegType:
1181 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 +00001182 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001183 MI = BuildMI(STXFSR, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001184 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001185
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001186 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001187 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001188 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001189 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001190}
1191
1192
1193//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001194// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001195// register number
1196//---------------------------------------------------------------------------
1197
1198
Vikram S. Advee9327f02002-05-19 15:25:51 +00001199void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001200UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1201 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001202 int Offset,
1203 unsigned DestReg,
1204 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001205 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001206 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001207 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001208 case IntRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001209 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001210 MI = BuildMI(LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1211 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001212 break;
1213
1214 case FPSingleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001215 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001216 MI = BuildMI(LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1217 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001218 break;
1219
1220 case FPDoubleRegType:
Vikram S. Adve879eac92002-10-13 00:05:30 +00001221 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001222 MI = BuildMI(LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
1223 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001224 break;
1225
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001226 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001227 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001228 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1229 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001230
1231 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner1ebaa902003-01-15 17:47:49 +00001232 MI = BuildMI(WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001233 break;
1234
1235 case FloatCCRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001236 assert(0 && "Tell Vikram if this assertion fails: we may have to mask "
1237 "out the other bits here");
Vikram S. Adve879eac92002-10-13 00:05:30 +00001238 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Chris Lattner1ebaa902003-01-15 17:47:49 +00001239 MI = BuildMI(LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
1240 .addMReg(DestReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001241 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001242
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001243 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001244 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001245 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001246 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001247}
1248
1249
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001250//---------------------------------------------------------------------------
1251// Generate a copy instruction to copy a value to another. Temporarily
1252// used by PhiElimination code.
1253//---------------------------------------------------------------------------
1254
1255
Vikram S. Advee9327f02002-05-19 15:25:51 +00001256void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001257UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001258 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001259 int RegType = getRegType( Src );
1260
1261 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001262
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001263 MachineInstr * MI = NULL;
1264
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001265 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001266 case IntRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001267 MI = BuildMI(ADD, 3).addReg(Src).addMReg(getZeroRegNum()).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001268 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001269 case FPSingleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001270 MI = BuildMI(FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001271 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001272 case FPDoubleRegType:
Chris Lattner1ebaa902003-01-15 17:47:49 +00001273 MI = BuildMI(FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001274 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001275 default:
1276 assert(0 && "Unknow RegType in CpValu2Value");
1277 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001278
Chris Lattner9bebf832002-10-28 20:10:56 +00001279 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001280}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001281
1282
1283
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001284
1285
1286
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001287//----------------------------------------------------------------------------
1288// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001289// a call machine instruction. The caller saving/restoring instructions are
1290// inserted like:
1291//
1292// ** caller saving instructions
1293// other instructions inserted for the call by ColorCallArg
1294// CALL instruction
1295// other instructions inserted for the call ColorCallArg
1296// ** caller restoring instructions
1297//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001298//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001299
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001300
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001301void
1302UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1303 vector<MachineInstr*>& instrnsAfter,
1304 MachineInstr *CallMI,
1305 const BasicBlock *BB,
1306 PhyRegAlloc &PRA) const
1307{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001308 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001309
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001310 // has set to record which registers were saved/restored
1311 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001312 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001313
Vikram S. Advee9327f02002-05-19 15:25:51 +00001314 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1315
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001316 // Now find the LR of the return value of the call
1317 // The last *implicit operand* is the return value of a call
1318 // Insert it to to he PushedRegSet since we must not save that register
1319 // and restore it after the call.
1320 // We do this because, we look at the LV set *after* the instruction
1321 // to determine, which LRs must be saved across calls. The return value
1322 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001323
Vikram S. Advee9327f02002-05-19 15:25:51 +00001324 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001325
Chris Lattner5216cc52002-02-04 05:59:25 +00001326 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001327 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001328 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001329
Chris Lattner5216cc52002-02-04 05:59:25 +00001330 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001331 PushedRegSet.insert(
1332 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001333 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001334 }
1335
Vikram S. Advee9327f02002-05-19 15:25:51 +00001336 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001337 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001338
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001339 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001340 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001341
1342 // get the live range corresponding to live var
1343 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1344
1345 // LR can be null if it is a const since a const
1346 // doesn't have a dominating def - see Assumptions above
1347 if( LR ) {
1348
1349 if( LR->hasColor() ) {
1350
1351 unsigned RCID = (LR->getRegClass())->getID();
1352 unsigned Color = LR->getColor();
1353
1354 if ( isRegVolatile(RCID, Color) ) {
1355
1356 // if the value is in both LV sets (i.e., live before and after
1357 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001358
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001359 unsigned Reg = getUnifiedRegNum(RCID, Color);
1360
1361 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1362
1363 // if we haven't already pushed that register
1364
1365 unsigned RegType = getRegType( LR );
1366
1367 // Now get two instructions - to push on stack and pop from stack
1368 // and add them to InstrnsBefore and InstrnsAfter of the
1369 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001370 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001371 int StackOff =
1372 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001373
Vikram S. Adveaee67012002-07-08 23:23:12 +00001374 vector<MachineInstr*> AdIBef, AdIAft;
1375
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001376 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001377
1378 // We may need a scratch register to copy the saved value
1379 // to/from memory. This may itself have to insert code to
1380 // free up a scratch register. Any such code should go before
1381 // the save code.
1382 int scratchRegType = -1;
1383 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001384 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001385 { // Find a register not live in the LVSet before CallMI
1386 const ValueSet &LVSetBef =
1387 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1388 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1389 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001390 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001391 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001392 }
1393
1394 if (AdIBef.size() > 0)
1395 instrnsBefore.insert(instrnsBefore.end(),
1396 AdIBef.begin(), AdIBef.end());
1397
1398 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1399 scratchReg);
1400
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001401 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001402 instrnsBefore.insert(instrnsBefore.end(),
1403 AdIAft.begin(), AdIAft.end());
1404
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001405 //---- Insert code for popping the reg from the stack ----------
1406
Vikram S. Adveaee67012002-07-08 23:23:12 +00001407 // We may need a scratch register to copy the saved value
1408 // from memory. This may itself have to insert code to
1409 // free up a scratch register. Any such code should go
1410 // after the save code.
1411 //
1412 scratchRegType = -1;
1413 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001414 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001415 { // Find a register not live in the LVSet after CallMI
1416 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1417 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001418 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001419 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001420 }
1421
1422 if (AdIBef.size() > 0)
1423 instrnsAfter.insert(instrnsAfter.end(),
1424 AdIBef.begin(), AdIBef.end());
1425
1426 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1427 scratchReg);
1428
1429 if (AdIAft.size() > 0)
1430 instrnsAfter.insert(instrnsAfter.end(),
1431 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001432
Chris Lattner7e5ee422002-02-05 04:20:12 +00001433 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001434
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001435 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001436 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001437 cerr << " -inserted caller saving instrs: Before:\n\t ";
1438 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001439 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001440 cerr << " -and After:\n\t ";
1441 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001442 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001443 }
1444 } // if not already pushed
1445
1446 } // if LR has a volatile color
1447
1448 } // if LR has color
1449
1450 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001451
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001452 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001453}
1454
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001455
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001456//---------------------------------------------------------------------------
1457// Print the register assigned to a LR
1458//---------------------------------------------------------------------------
1459
Chris Lattner5216cc52002-02-04 05:59:25 +00001460void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001461 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001462 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001463
Chris Lattner5216cc52002-02-04 05:59:25 +00001464 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001465 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001466 return;
1467 }
1468
1469 // if a color is found
1470
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001471 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001472
Chris Lattner5216cc52002-02-04 05:59:25 +00001473 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001474 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001475
Chris Lattner5216cc52002-02-04 05:59:25 +00001476 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001477 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001478 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001479 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001480 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001481 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001482}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001483
1484//---------------------------------------------------------------------------
1485// This method examines instructions inserted by RegAlloc code before a
1486// machine instruction to detect invalid orders that destroy values before
1487// they are used. If it detects such conditions, it reorders the instructions.
1488//
1489// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001490// instructions inserted by RegAlloc. All such instruction MUST have
1491// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001492//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001493// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1494// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001495//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001496// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001497//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001498// Since instructions are inserted in RegAlloc, this assumes that the
1499// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001500// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001501//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001502// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001503//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001504
1505void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1506 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001507 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001508
1509 /*
1510 Problem: We can have instructions inserted by RegAlloc like
1511 1. add %ox %g0 %oy
1512 2. add %oy %g0 %oz, where z!=x or z==x
1513
1514 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001515
1516 Solution:
1517 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001518
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001519 Algorithm:
1520
1521 do
1522 for each instruction 'DefInst' in the UnOrdVec
1523 for each instruction 'UseInst' that follows the DefInst
1524 if the reg defined by DefInst is used by UseInst
1525 mark DefInst as not movable in this iteration
1526 If DefInst is not marked as not-movable, move DefInst to OrdVec
1527 while all instructions in DefInst are moved to OrdVec
1528
1529 For moving, we call the move2OrdVec(). It checks whether there is a def
1530 in it for the uses in the instruction to be added to OrdVec. If there
1531 are no preceding defs, it just appends the instruction. If there is a
1532 preceding def, it puts two instructions to save the reg on stack before
1533 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001534
1535 */
1536
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001537 bool CouldMoveAll;
1538 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001541 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001542 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001543
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001544 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001545
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001546 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001547
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001548 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001549
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001550 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001551
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001552 //cerr << "\nInst in UnordVec = " << *DefInst;
1553
1554 // last operand is the def (unless for a store which has no def reg)
1555 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1556
Chris Lattner6a30b022002-10-28 04:45:29 +00001557 if (DefOp.opIsDef() &&
1558 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001559
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001561 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001562
Chris Lattner7f74a562002-01-20 22:54:45 +00001563 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001564 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001566 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1567
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001568 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001569 if( UseInst == NULL) continue;
1570
1571 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001572 MachineOperand& UseOp = UseInst->getOperand(0);
1573
Chris Lattner6a30b022002-10-28 04:45:29 +00001574 if (!UseOp.opIsDef() &&
1575 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001576
1577 // if use is a register ...
1578
1579 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1580
1581 // if Def and this use are the same, it means that this use
1582 // is destroyed by a def before it is used
1583
1584 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001585
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001586 DefEqUse = true;
1587 CouldMoveAll = false;
1588 DebugPrint = true;
1589 break;
1590 } // if two registers are equal
1591
1592 } // if use is a register
1593
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001595
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001596 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001597
1598 // after examining all the instructions that follow the DefInst
1599 // if there are no dependencies, we can move it to the OrdVec
1600
1601 // cerr << "Moved to Ord: " << *DefInst;
1602
1603 moveInst2OrdVec(OrdVec, DefInst, PRA);
1604
1605 //OrdVec.push_back(DefInst);
1606
1607 // mark the pos of DefInst with NULL to indicate that it is
1608 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001609 *DefIt = NULL;
1610 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001611
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001612 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001613
1614 } // for all instructions in the UnordVec
1615
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001616
Chris Lattner5216cc52002-02-04 05:59:25 +00001617 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001618
Chris Lattner070cf772002-06-04 03:09:57 +00001619 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001620 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001621 for(unsigned i=0; i < OrdVec.size(); i++)
1622 cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001623 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001624}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001625
1626
1627
1628
1629
Chris Lattner7f74a562002-01-20 22:54:45 +00001630void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001631 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001632 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001633 MachineOperand& UseOp = UnordInst->getOperand(0);
1634
Chris Lattner6a30b022002-10-28 04:45:29 +00001635 if (!UseOp.opIsDef() &&
1636 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001637
1638 // for the use of UnordInst, see whether there is a defining instr
1639 // before in the OrdVec
1640 bool DefEqUse = false;
1641
Chris Lattner7f74a562002-01-20 22:54:45 +00001642 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643
1644 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1645
1646 MachineInstr *OrdInst = *OrdIt ;
1647
1648 MachineOperand& DefOp =
1649 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1650
1651 if( DefOp.opIsDef() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001652 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001653
1654 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1655
1656 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1657
1658 // we are here because there is a preceding def in the OrdVec
1659 // for the use in this intr we are going to insert. This
1660 // happened because the original code was like:
1661 // 1. add %ox %g0 %oy
1662 // 2. add %oy %g0 %ox
1663 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1664 // Now we are processing %ox of 1.
1665 // We have to
1666
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001667 int UReg = DefOp.getMachineRegNum();
1668 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001669 MachineInstr *AdIBef, *AdIAft;
1670
Chris Lattnerd47aac92002-12-28 20:21:29 +00001671 int StackOff =
1672 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001673
1674 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001675 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001676 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattnerd47aac92002-12-28 20:21:29 +00001677 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1678 MI != mvec.end(); ++MI)
1679 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001680
1681 // Load directly into DReg (%oy)
1682 MachineOperand& DOp=
1683 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1684 assert(DOp.opIsDef() && "Last operand is not the def");
1685 const int DReg = DOp.getMachineRegNum();
1686
Vikram S. Adveaee67012002-07-08 23:23:12 +00001687 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001688
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001689 if( DEBUG_RA ) {
Vikram S. Adve92ccbb92002-10-14 16:32:49 +00001690 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001691 cerr << "\nBefore CIRCULAR Reordering:\n";
1692 cerr << *UnordInst;
1693 cerr << *OrdInst;
1694
1695 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1696 for(unsigned i=0; i < OrdVec.size(); i++)
1697 cerr << *(OrdVec[i]);
1698 }
1699
1700 // Do not copy the UseInst to OrdVec
1701 DefEqUse = true;
1702 break;
1703
1704 }// if two registers are equal
1705
1706 } // if Def is a register
1707
1708 } // for each instr in OrdVec
1709
Chris Lattner5216cc52002-02-04 05:59:25 +00001710 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001711
1712 // We didn't find a def in the OrdVec, so just append this inst
1713 OrdVec.push_back( UnordInst );
1714 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1715 }
1716
1717 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001718}