blob: de83adf56f36f24ba884d66e28cf006f08167cb0 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
Misha Brukman7ae7f842002-10-28 00:28:31 +000010#include "llvm/CodeGen/MachineFunction.h"
Chris Lattnerd47aac92002-12-28 20:21:29 +000011#include "llvm/CodeGen/MachineFunctionInfo.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner1ebaa902003-01-15 17:47:49 +000014#include "llvm/CodeGen/MachineInstrBuilder.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000015#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattner24c1d5e2003-01-14 23:05:08 +000016#include "llvm/CodeGen/FunctionLiveVarInfo.h" // FIXME: Remove
Chris Lattner90fc6652003-01-15 19:50:44 +000017#include "../../CodeGen/RegAlloc/RegAllocCommon.h" // FIXME!
Chris Lattner5216cc52002-02-04 05:59:25 +000018#include "llvm/iTerminators.h"
19#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000020#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000021#include "llvm/DerivedTypes.h"
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000022
Chris Lattner24c1d5e2003-01-14 23:05:08 +000023enum {
24 BadRegClass = ~0
25};
26
Chris Lattner5216cc52002-02-04 05:59:25 +000027UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerf9781b52002-12-29 03:13:05 +000028 : TargetRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner5216cc52002-02-04 05:59:25 +000029 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
30
31 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
32 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
33 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
34 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adve8adb9942003-05-27 00:02:22 +000035 MachineRegClassArr.push_back(new SparcSpecialRegClass(SpecialRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000036
Chris Lattner56e91662002-08-12 21:25:05 +000037 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000038 "32 Float regs are used for float arg passing");
39}
40
41
Vikram S. Advedb1435f2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000044//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000046 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000048}
Chris Lattner5216cc52002-02-04 05:59:25 +000049
50// getCallAddressReg - returns the reg used for pushing the address when a
51// method is called. This can be used for other purposes between calls
52//
53unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000054 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000056}
57
58// Returns the register containing the return address.
59// It should be made sure that this register contains the return
60// value when a return instruction is reached.
61//
62unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000063 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegClass::i7);
65}
66
67// Register get name implementations...
68
69// Int register names in same order as enum in class SparcIntRegClass
70static const char * const IntRegNames[] = {
71 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
72 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
73 "i0", "i1", "i2", "i3", "i4", "i5",
74 "i6", "i7",
75 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
76 "o6"
77};
78
Vikram S. Adve8adb9942003-05-27 00:02:22 +000079const char * const SparcIntRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +000080 assert(reg < NumOfAllRegs);
81 return IntRegNames[reg];
82}
83
84static const char * const FloatRegNames[] = {
85 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
86 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
87 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
88 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
89 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
90 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
91 "f60", "f61", "f62", "f63"
92};
93
Vikram S. Adve8adb9942003-05-27 00:02:22 +000094const char * const SparcFloatRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +000095 assert (reg < NumOfAllRegs);
96 return FloatRegNames[reg];
97}
98
99
100static const char * const IntCCRegNames[] = {
101 "xcc", "ccr"
102};
103
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000104const char * const SparcIntCCRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +0000105 assert(reg < 2);
106 return IntCCRegNames[reg];
107}
108
109static const char * const FloatCCRegNames[] = {
110 "fcc0", "fcc1", "fcc2", "fcc3"
111};
112
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000113const char * const SparcFloatCCRegClass::getRegName(unsigned reg) const {
114 assert (reg < 5);
Chris Lattner56e91662002-08-12 21:25:05 +0000115 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000116}
117
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000118static const char * const SpecialRegNames[] = {
119 "fsr"
120};
121
122const char * const SparcSpecialRegClass::getRegName(unsigned reg) const {
123 assert (reg < 1);
124 return SpecialRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000125}
126
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000127// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000128unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000129 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
130 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000131}
132
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000133// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000134unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000135 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
136 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000137}
138
139
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000140//---------------------------------------------------------------------------
141// Finds whether a call is an indirect call
142//---------------------------------------------------------------------------
143
144inline bool
145isVarArgsFunction(const Type *funcType) {
146 return cast<FunctionType>(cast<PointerType>(funcType)
147 ->getElementType())->isVarArg();
148}
149
150inline bool
151isVarArgsCall(const MachineInstr *CallMI) {
152 Value* callee = CallMI->getOperand(0).getVRegValue();
153 // const Type* funcType = isa<Function>(callee)? callee->getType()
154 // : cast<PointerType>(callee->getType())->getElementType();
155 const Type* funcType = callee->getType();
156 return isVarArgsFunction(funcType);
157}
158
159
160// Get the register number for the specified integer arg#,
161// assuming there are argNum total args, intArgNum int args,
162// and fpArgNum FP args preceding (and not including) this one.
163// Use INT regs for FP args if this is a varargs call.
164//
165// Return value:
166// InvalidRegNum, if there is no int register available for the arg.
167// regNum, otherwise (this is NOT the unified reg. num).
168//
169inline int
170UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
171 unsigned argNo,
172 unsigned intArgNo, unsigned fpArgNo,
173 unsigned& regClassId) const
174{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000175 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000176 if (argNo >= NumOfIntArgRegs)
177 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000178 else
Chris Lattner56e91662002-08-12 21:25:05 +0000179 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000180}
181
182// Get the register number for the specified FP arg#,
183// assuming there are argNum total args, intArgNum int args,
184// and fpArgNum FP args preceding (and not including) this one.
185// Use INT regs for FP args if this is a varargs call.
186//
187// Return value:
188// InvalidRegNum, if there is no int register available for the arg.
189// regNum, otherwise (this is NOT the unified reg. num).
190//
191inline int
192UltraSparcRegInfo::regNumForFPArg(unsigned regType,
193 bool inCallee, bool isVarArgsCall,
194 unsigned argNo,
195 unsigned intArgNo, unsigned fpArgNo,
196 unsigned& regClassId) const
197{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000198 if (isVarArgsCall)
199 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
200 regClassId);
201 else
202 {
203 regClassId = FloatRegClassID;
204 if (regType == FPSingleRegType)
205 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000206 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000207 else if (regType == FPDoubleRegType)
208 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000209 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000210 else
211 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000212 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000213 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000214}
215
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000216
217//---------------------------------------------------------------------------
218// Finds the return address of a call sparc specific call instruction
219//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000220
Vikram S. Adveaee67012002-07-08 23:23:12 +0000221// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000222// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000223//
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000224int UltraSparcRegInfo::getRegTypeForClassAndType(unsigned regClassID,
225 const Type* type) const
226{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000227 switch (regClassID) {
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000228 case IntRegClassID: return IntRegType;
229 case FloatRegClassID:
230 if (type == Type::FloatTy) return FPSingleRegType;
231 else if (type == Type::DoubleTy) return FPDoubleRegType;
232 assert(0 && "Unknown type in FloatRegClass"); return 0;
233 case IntCCRegClassID: return IntCCRegType;
234 case FloatCCRegClassID: return FloatCCRegType;
235 case SpecialRegClassID: return SpecialRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000236 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000237 }
238}
239
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000240int UltraSparcRegInfo::getRegType(const Type* type) const
241{
242 return getRegTypeForClassAndType(getRegClassIDOfType(type), type);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000243}
244
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000245int UltraSparcRegInfo::getRegType(const LiveRange *LR) const
246{
247 return getRegTypeForClassAndType(LR->getRegClassID(), LR->getType());
248}
Chris Lattner5216cc52002-02-04 05:59:25 +0000249
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000250int UltraSparcRegInfo::getRegType(int unifiedRegNum) const
251{
Vikram S. Adveaee67012002-07-08 23:23:12 +0000252 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000253 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000254 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000255 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000256 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000257 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000258 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000259 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000260 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000261 return IntCCRegType;
262 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000263 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000264 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000265}
266
267
Vikram S. Adveaee67012002-07-08 23:23:12 +0000268// To find the register class used for a specified Type
269//
270unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000271 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000272 Type::PrimitiveID ty = type->getPrimitiveID();
273 unsigned res;
274
275 // FIXME: Comparing types like this isn't very safe...
276 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
277 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
278 res = IntRegClassID; // sparc int reg (ty=0: void)
279 else if (ty <= Type::DoubleTyID)
280 res = FloatRegClassID; // sparc float reg class
281 else {
282 //std::cerr << "TypeID: " << ty << "\n";
283 assert(0 && "Cannot resolve register class for type");
284 return 0;
285 }
286
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000287 if (isCCReg)
288 return res + 2; // corresponding condition code register
Vikram S. Adveaee67012002-07-08 23:23:12 +0000289 else
290 return res;
291}
292
Vikram S. Adveaee67012002-07-08 23:23:12 +0000293unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
294 switch(regType) {
295 case IntRegType: return IntRegClassID;
296 case FPSingleRegType:
297 case FPDoubleRegType: return FloatRegClassID;
298 case IntCCRegType: return IntCCRegClassID;
299 case FloatCCRegType: return FloatCCRegClassID;
300 default:
301 assert(0 && "Invalid register type in getRegClassIDOfRegType");
302 return 0;
303 }
304}
305
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000306//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000307// Suggests a register for the ret address in the RET machine instruction.
308// We always suggest %i7 by convention.
309//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000310void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000311 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000312
Vikram S. Adveaee67012002-07-08 23:23:12 +0000313 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000314
Vikram S. Adveaee67012002-07-08 23:23:12 +0000315 // return address is always mapped to i7 so set it immediately
316 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000317 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000318
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000319 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000320 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000321 // we have to test later whether it received the suggested color.
322 // In that case, a LR has to be created at the start of method.
323 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000324
Vikram S. Adveaee67012002-07-08 23:23:12 +0000325 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000326 // const Value *RetAddrVal = MO.getVRegValue();
327 // assert( RetAddrVal && "LR for ret address must be created at start");
328 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
329 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000330 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000331}
332
333
334//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335// Suggests a register for the ret address in the JMPL/CALL machine instr.
336// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000337//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000338void
339UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
340 LiveRangeInfo& LRI) const
341{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000342 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
343 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000344 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000345
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000346 // A LR must already exist for the return address.
347 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
348 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
349
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000350 unsigned RegClassID = RetAddrLR->getRegClassID();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000351 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
352}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000353
354
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355
356//---------------------------------------------------------------------------
357// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000358// According to the Sparc ABI, the first 6 incoming args are in
359// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000360// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000361// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000362//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000363void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000364 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000365{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000366 // check if this is a varArgs function. needed for choosing regs.
367 bool isVarArgs = isVarArgsFunction(Meth->getType());
368
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000369 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000370 unsigned argNo=0, intArgNo=0, fpArgNo=0;
371 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
372 I != E; ++I, ++argNo) {
373 // get the LR of arg
374 LiveRange *LR = LRI.getLiveRangeForValue(I);
375 assert(LR && "No live range found for method arg");
376
377 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000378 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000379
380 int regNum = (regType == IntRegType)
381 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
382 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
383 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
384 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
385
386 if(regNum != InvalidRegNum)
387 LR->setSuggestedColor(regNum);
388 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000389}
390
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000391
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000392//---------------------------------------------------------------------------
393// This method is called after graph coloring to move incoming args to
394// the correct hardware registers if they did not receive the correct
395// (suggested) color through graph coloring.
396//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000397void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000398 LiveRangeInfo &LRI,
399 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000400
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000401 // check if this is a varArgs function. needed for choosing regs.
402 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000403 MachineInstr *AdMI;
404
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000405 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000406 // for each argument. count INT and FP arguments separately.
407 unsigned argNo=0, intArgNo=0, fpArgNo=0;
408 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
409 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000410 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000411 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000412 assert( LR && "No live range found for method arg");
413
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000414 unsigned regType = getRegType(LR);
415 unsigned RegClassID = LR->getRegClassID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000416
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000417 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000418 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000419 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000420 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000421 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000422 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000423
424 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000425 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
426 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
427 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
428 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000429
430 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000431 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000432 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000434
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000435 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000436
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000437 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
438
439 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000440 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000441 if( UniLRReg == UniArgReg )
442 continue;
443
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000444 // We are here because the LR did not receive the suggested
445 // but LR received another register.
446 // Now we have to copy the %i reg (or stack pos of arg)
447 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000448
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000449 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000450 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000451 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000452 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000453 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000454 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000455
456 // It is a variable argument call: the float reg must go in a %o reg.
457 // We have to move an int reg to a float reg via memory.
458 //
459 assert(isVarArgs &&
460 RegClassID == FloatRegClassID &&
461 regClassIDOfArgReg == IntRegClassID &&
462 "This should only be an Int register for an FP argument");
463
Chris Lattnerd47aac92002-12-28 20:21:29 +0000464 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000465 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000466 cpReg2MemMI(FirstAI->InstrnsBefore,
467 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000468
Vikram S. Adveaee67012002-07-08 23:23:12 +0000469 cpMem2RegMI(FirstAI->InstrnsBefore,
470 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000471 }
472 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000473 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000474 }
475 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000476 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000477
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000478 // Now the arg is coming on stack. Since the LR recieved a register,
479 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000480 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000481 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000482 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000483 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000484 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000485
Vikram S. Adveaee67012002-07-08 23:23:12 +0000486 cpMem2RegMI(FirstAI->InstrnsBefore,
487 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000488 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000489
490 } // if LR received a color
491
492 else {
493
494 // Now, the LR did not receive a color. But it has a stack offset for
495 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000496 // So, if the arg is coming in UniArgReg register, we can just move
497 // that on to the stack pos of LR
498
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000499 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000500
501 if( regClassIDOfArgReg != RegClassID ) {
502 assert(0 &&
503 "FP arguments to a varargs function should be explicitly "
504 "copied to/from int registers by instruction selection!");
505
506 // It must be a float arg for a variable argument call, which
507 // must come in a %o reg. Move the int reg to the stack.
508 //
509 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
510 "This should only be an Int register for an FP argument");
511
Vikram S. Adveaee67012002-07-08 23:23:12 +0000512 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
513 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000514 }
515 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000516 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
517 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000518 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000519 }
520
521 else {
522
523 // Now the arg is coming on stack. Since the LR did NOT
524 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000525 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000526 // since this method is called before any other method that makes
527 // uses of the stack pos of the LR (e.g., updateMachineInstr)
528
Chris Lattnerd47aac92002-12-28 20:21:29 +0000529 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000530 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000531 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000532 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000533
534 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000535 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000536
537 }
538
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000539 } // for each incoming argument
540
541}
542
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000543
544
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000545//---------------------------------------------------------------------------
546// This method is called before graph coloring to suggest colors to the
547// outgoing call args and the return value of the call.
548//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000549void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000550 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000551 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000552
Vikram S. Advee9327f02002-05-19 15:25:51 +0000553 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000554
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000555 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000556
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000557 // First color the return value of the call instruction, if any.
558 // The return value will be in %o0 if the value is an integer type,
559 // or in %f0 if the value is a float type.
560 //
561 if (const Value *RetVal = argDesc->getReturnValue()) {
562 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
563 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000564
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000565 unsigned RegClassID = RetValLR->getRegClassID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000566
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000567 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000568 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000569 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000570 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000571 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000572 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000573 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000574
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000575 // Now suggest colors for arguments (operands) of the call instruction.
576 // Colors are suggested only if the arg number is smaller than the
577 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000578 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000579
Vikram S. Advee9327f02002-05-19 15:25:51 +0000580 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000581
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000582 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
583 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000584
Vikram S. Advee9327f02002-05-19 15:25:51 +0000585 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000586
587 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000588 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000589 assert (LR && "Must have a LR for all arguments since "
590 "all args (even consts) must be defined before");
591
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000592 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000593 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000594
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000595 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000596 // an INT or FP value. Here we ignore whether or not it is a
597 // varargs calls, because FP arguments will be explicitly copied
598 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000599 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000600 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
601 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
602 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
603 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000604
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000605 // If a register could be allocated, use it.
606 // If not, do NOTHING as this will be colored as a normal value.
607 if(regNum != InvalidRegNum)
608 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000609
Vikram S. Advee9327f02002-05-19 15:25:51 +0000610 // Repeat for the second copy of the argument, which would be
611 // an FP argument being passed to a function with no prototype
612 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
613 if (argCopy != NULL)
614 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000615 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000616 && "Must be passing copy of FP argument in int register");
617 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
618 argNo, intArgNo, fpArgNo-1,
619 regClassIDOfArgReg);
620 assert(copyRegNum != InvalidRegNum);
621 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
622 copyLR->setSuggestedColor(copyRegNum);
623 }
624
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000625 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000626
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000627}
628
629
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000630//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000631// Helper method for UltraSparcRegInfo::colorCallArgs().
632//---------------------------------------------------------------------------
633
634void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000635UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000636 AddedInstrns *CallAI,
637 PhyRegAlloc &PRA, LiveRange* LR,
638 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000639 int UniArgRegOrNone, unsigned argNo,
Misha Brukman352f7ac2003-05-21 17:59:06 +0000640 std::vector<MachineInstr*> &AddedInstrnsBefore)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000641 const
642{
643 MachineInstr *AdMI;
644 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000645 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advee9327f02002-05-19 15:25:51 +0000646 if (UniArgRegOrNone != InvalidRegNum)
647 {
648 isArgInReg = true;
649 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattnerce64edd2002-10-22 23:16:21 +0000650 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000651 }
652
653 if (LR->hasColor()) {
654 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
655
656 // if LR received the correct color, nothing to do
657 if( isArgInReg && UniArgReg == UniLRReg )
658 return;
659
660 // The LR is allocated to a register UniLRReg and must be copied
661 // to UniArgReg or to the stack slot.
662 //
663 if( isArgInReg ) {
664 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000665 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000666 }
667 else {
668 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000669 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000670 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000671 cpReg2MemMI(CallAI->InstrnsBefore,
672 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000673 }
674
675 } else { // LR is not colored (i.e., spilled)
676
677 if( isArgInReg ) {
678 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000679 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
680 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000681 // Now add the instruction
682 }
683
684 else {
685 // Now, we have to pass the arg on stack. Since LR also did NOT
686 // receive a register we have to move an argument in memory to
687 // outgoing parameter on stack.
688 // Use TReg to load and store the value.
689 // Use TmpOff to save TReg, since that may have a live value.
690 //
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000691 int TReg = PRA.getUniRegNotUsedByThisInst(LR->getRegClass(), CallMI);
Chris Lattnerd47aac92002-12-28 20:21:29 +0000692 int TmpOff = PRA.MF.getInfo()->
693 pushTempValue(getSpilledRegSize(getRegType(LR)));
694 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000695 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000696
697 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
698
699 // Sequence:
700 // (1) Save TReg on stack
701 // (2) Load LR value into TReg from stack pos of LR
702 // (3) Store Treg on outgoing Arg pos on stack
703 // (4) Load the old value of TReg from stack to TReg (restore it)
704 //
705 // OPTIMIZE THIS:
706 // When reverse pointers in MahineInstr are introduced:
707 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
708 // needed only if this fails. Currently, we cannot call the
709 // above method since we cannot find LVSetBefore without the BB
710 //
711 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
712 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000713 cpReg2MemMI(CallAI->InstrnsBefore,
714 TReg, getFramePointer(), TmpOff, regType);
715 cpMem2RegMI(CallAI->InstrnsBefore,
716 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
717 cpReg2MemMI(CallAI->InstrnsBefore,
718 TReg, getStackPointer(), argOffset, regType);
719 cpMem2RegMI(CallAI->InstrnsBefore,
720 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000721 }
722 }
723}
724
725//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000726// After graph coloring, we have call this method to see whehter the return
727// value and the call args received the correct colors. If not, we have
728// to instert copy instructions.
729//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000730
Vikram S. Adveaee67012002-07-08 23:23:12 +0000731void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000732 LiveRangeInfo &LRI,
733 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000734 PhyRegAlloc &PRA,
735 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000736
Vikram S. Adve879eac92002-10-13 00:05:30 +0000737 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000738
Vikram S. Advee9327f02002-05-19 15:25:51 +0000739 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
740
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000741 // First color the return value of the call.
742 // If there is a LR for the return value, it means this
743 // method returns a value
744
745 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000746
Vikram S. Advee9327f02002-05-19 15:25:51 +0000747 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000748
Chris Lattner30e8fb62002-02-05 01:43:49 +0000749 if (RetVal) {
750 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000751
Chris Lattner30e8fb62002-02-05 01:43:49 +0000752 if (!RetValLR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000753 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000754 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000755 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000756
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000757 unsigned RegClassID = RetValLR->getRegClassID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000758 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000759 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000760 unsigned UniRetReg; // unified number for CorrectCol
761
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000762 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000763 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000764 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000765 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000766 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000767 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000768 return;
769 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000770
771 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000772 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000773
Vikram S. Adveaee67012002-07-08 23:23:12 +0000774 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000775 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000776
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000777 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000778 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
779 : false;
780
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000781 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000782 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000783 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000784
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000785 unsigned regType = getRegType(RetValLR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000786
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000787 if( RetValLR->hasColor() ) {
788
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000789 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000790
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000791 // the return value is coming in UniRetReg but has to go into
792 // the UniRetLRReg
793
Vikram S. Adveaee67012002-07-08 23:23:12 +0000794 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000795
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000796 } // if LR has color
797 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000798
799 // if the LR did NOT receive a color, we have to move the return
800 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000801
Vikram S. Adveaee67012002-07-08 23:23:12 +0000802 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
803 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000804 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000805
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000806 } // the LR didn't receive the suggested color
807
808 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000809
810
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000811 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000812 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000813 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000814
Misha Brukman352f7ac2003-05-21 17:59:06 +0000815 std::vector<MachineInstr*> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000816
817 unsigned NumOfCallArgs = argDesc->getNumArgs();
818
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000819 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
820 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000821
Vikram S. Advee9327f02002-05-19 15:25:51 +0000822 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
823
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000824 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000825 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000826
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000827 unsigned RegClassID = getRegClassIDOfType(CallArg->getType());
828 unsigned regType = getRegType(CallArg->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000829
Vikram S. Advee9327f02002-05-19 15:25:51 +0000830 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000831 // Also find the correct register the argument must use (UniArgReg)
832 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000833 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000834 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000835 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000836
Vikram S. Advee9327f02002-05-19 15:25:51 +0000837 // Find the register that must be used for this arg, depending on
838 // whether it is an INT or FP value. Here we ignore whether or not it
839 // is a varargs calls, because FP arguments will be explicitly copied
840 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000841 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000842 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
843 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
844 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
845 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000846
847 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000848 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000849 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000850 assert(regClassIDOfArgReg == RegClassID &&
851 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000852 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000853
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000854 // not possible to have a null LR since all args (even consts)
855 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000856 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000857 std::cerr <<" ERROR: In call instr, no LR for arg: " <<RAV(CallArg)<<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000858 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000859 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000860
861 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
862 UniArgReg, argNo, AddedInstrnsBefore);
863
864 // Repeat for the second copy of the argument, which would be
865 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000866 // It may either be passed as a copy in an integer register
867 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000868 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
869 if (argCopy != NULL)
870 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000871 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000872 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000873
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000874 unsigned copyRegClassID = getRegClassIDOfType(argCopy->getType());
875 unsigned copyRegType = getRegType(argCopy->getType());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000876
877 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
878 argNo, intArgNo, fpArgNo-1,
879 regClassIDOfArgReg);
880 assert(copyRegNum != InvalidRegNum);
881 assert(regClassIDOfArgReg == copyRegClassID &&
882 "Moving values between reg classes must happen during selection");
883
884 InitializeOutgoingArg(CallMI, CallAI, PRA,
885 LRI.getLiveRangeForValue(argCopy), copyRegType,
886 copyRegClassID, copyRegNum, argNo,
887 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000888 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000889
890 if (regNum != InvalidRegNum &&
891 argDesc->getArgInfo(i).usesStackSlot())
892 {
893 // Pass the argument via the stack in addition to regNum
894 assert(regType != IntRegType && "Passing an integer arg. twice?");
895 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
896 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
897 InvalidRegNum, argNo, AddedInstrnsBefore);
898 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000899 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000900
Vikram S. Advee9327f02002-05-19 15:25:51 +0000901 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000902 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000903 //
Misha Brukman352f7ac2003-05-21 17:59:06 +0000904 std::vector<MachineInstr*> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000905 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000906
Chris Lattner5216cc52002-02-04 05:59:25 +0000907 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000908 std::cerr << "\nCalling reorder with instrns: \n";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000909 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000910 std::cerr << *(AddedInstrnsBefore[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000911 }
912
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000913 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
914 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
915 && "Dropped some instructions when reordering!");
916
Chris Lattner5216cc52002-02-04 05:59:25 +0000917 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000918 std::cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000919 for(unsigned i = 0; i < ReorderedVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000920 std::cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000921 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000922 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000923
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000924 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000925 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000926 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
927 CallMI, BB, PRA);
928
929 // Then insert the final reordered code for the call arguments.
930 //
931 for(unsigned i=0; i < ReorderedVec.size(); i++)
932 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000933}
934
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000935//---------------------------------------------------------------------------
936// This method is called for an LLVM return instruction to identify which
937// values will be returned from this method and to suggest colors.
938//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000939void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000940 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000941
Vikram S. Adve879eac92002-10-13 00:05:30 +0000942 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000943
Vikram S. Adveaee67012002-07-08 23:23:12 +0000944 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000945
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000946 // if there is an implicit ref, that has to be the ret value
947 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000948
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000949 // The first implicit operand is the return value of a return instr
950 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000951
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000952 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000953
Chris Lattner30e8fb62002-02-05 01:43:49 +0000954 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000955 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Chris Lattner30e8fb62002-02-05 01:43:49 +0000956 assert(0 && "No LR for return value of non-void method");
957 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000958
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000959 unsigned RegClassID = LR->getRegClassID();
Chris Lattner5216cc52002-02-04 05:59:25 +0000960 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000961 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000962 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000963 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000964 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000965}
966
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000968
969//---------------------------------------------------------------------------
970// Colors the return value of a method to %i0 or %f0, if possible. If it is
971// not possilbe to directly color the LR, insert a copy instruction to move
972// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
973// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000974//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000975void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000976 LiveRangeInfo &LRI,
977 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000978
Vikram S. Adve879eac92002-10-13 00:05:30 +0000979 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000981 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000982 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000983
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000984 // The first implicit operand is the return value of a return instr
985 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000986
Chris Lattner5216cc52002-02-04 05:59:25 +0000987 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000988
Chris Lattner30e8fb62002-02-05 01:43:49 +0000989 if (!LR) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000990 std::cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Chris Lattner30e8fb62002-02-05 01:43:49 +0000991 // assert( LR && "No LR for return value of non-void method");
992 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000993 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000994
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000995 unsigned RegClassID = getRegClassIDOfType(RetVal->getType());
996 unsigned regType = getRegType(RetVal->getType());
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000997
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000998 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000999 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001000 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001001 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001002 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001003 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001004 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001005 return;
1006 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001007
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001008 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001009 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001010
Vikram S. Adveaee67012002-07-08 23:23:12 +00001011 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +00001012 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001013
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001014 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001015
Chris Lattner5216cc52002-02-04 05:59:25 +00001016 if (LR->hasColor() && LR->getColor() == CorrectCol)
1017 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001018
Chris Lattner5216cc52002-02-04 05:59:25 +00001019 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001021 // We are here because the LR was allocted a regiter
1022 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001023
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001024 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001025
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001026 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001027
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001028 // the LR received UniLRReg but must be colored with UniRetReg
1029 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001030 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001031 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001032 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001033 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1034 LR->getSpillOffFromFP(), UniRetReg, regType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001035 //std::cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001036 }
1037
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001038 } // if there is a return value
1039
1040}
1041
Vikram S. Adveaee67012002-07-08 23:23:12 +00001042//---------------------------------------------------------------------------
1043// Check if a specified register type needs a scratch register to be
1044// copied to/from memory. If it does, the reg. type that must be used
1045// for scratch registers is returned in scratchRegType.
1046//
1047// Only the int CC register needs such a scratch register.
1048// The FP CC registers can (and must) be copied directly to/from memory.
1049//---------------------------------------------------------------------------
1050
1051bool
1052UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1053 int& scratchRegType) const
1054{
1055 if (RegType == IntCCRegType)
1056 {
1057 scratchRegType = IntRegType;
1058 return true;
1059 }
1060 return false;
1061}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001062
1063//---------------------------------------------------------------------------
1064// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001065// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001066//---------------------------------------------------------------------------
1067
Vikram S. Advee9327f02002-05-19 15:25:51 +00001068void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001069UltraSparcRegInfo::cpReg2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001070 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001071 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001072 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001073 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001074 "Invalid Register");
1075
1076 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001077
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001078 switch( RegType ) {
1079
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001080 case IntCCRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001081 if (getRegType(DestReg) == IntRegType) {
1082 // copy intCC reg to int reg
1083 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1084 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg,MOTy::Def);
1085 } else {
1086 // copy int reg to intCC reg
1087 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1088 assert(getRegType(SrcReg) == IntRegType
1089 && "Can only copy CC reg to/from integer reg");
1090 MI = BuildMI(V9::WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
1091 }
Vikram S. Adveaee67012002-07-08 23:23:12 +00001092 break;
1093
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001094 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001095 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001096 break;
1097
1098 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001099 MI = BuildMI(V9::ADD, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
1100 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001101 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001102
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001103 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001104 MI = BuildMI(V9::FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001105 break;
1106
1107 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001108 MI = BuildMI(V9::FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001109 break;
1110
1111 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001112 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001113 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001114 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001115
1116 if (MI)
1117 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001118}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001119
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001120//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001121// Copy from a register to memory (i.e., Store). Register number must
1122// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001123//---------------------------------------------------------------------------
1124
1125
Vikram S. Advee9327f02002-05-19 15:25:51 +00001126void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001127UltraSparcRegInfo::cpReg2MemMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001128 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001129 unsigned DestPtrReg,
1130 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001131 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001132 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001133 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001134 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001135 assert(target.getInstrInfo().constantFitsInImmedField(V9::STX, Offset));
1136 MI = BuildMI(V9::STX,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001137 break;
1138
1139 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001140 assert(target.getInstrInfo().constantFitsInImmedField(V9::ST, Offset));
1141 MI = BuildMI(V9::ST, 3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001142 break;
1143
1144 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001145 assert(target.getInstrInfo().constantFitsInImmedField(V9::STD, Offset));
1146 MI = BuildMI(V9::STD,3).addMReg(SrcReg).addMReg(DestPtrReg).addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001147 break;
1148
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001149 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001150 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001151 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001152
1153 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001154 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001155 mvec.push_back(MI);
1156
Chris Lattner56e91662002-08-12 21:25:05 +00001157 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001158 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001159
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001160 case FloatCCRegType: {
Misha Brukman56f4fa12003-05-20 20:32:24 +00001161 assert(target.getInstrInfo().constantFitsInImmedField(V9::STXFSR, Offset));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001162 unsigned fsrRegNum = getUnifiedRegNum(UltraSparcRegInfo::SpecialRegClassID,
1163 SparcSpecialRegClass::fsr);
1164 MI = BuildMI(V9::STXFSR, 3)
1165 .addMReg(fsrRegNum).addMReg(DestPtrReg).addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001166 break;
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001167 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001168 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001169 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001170 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001171 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001172}
1173
1174
1175//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001176// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001177// register number
1178//---------------------------------------------------------------------------
1179
1180
Vikram S. Advee9327f02002-05-19 15:25:51 +00001181void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001182UltraSparcRegInfo::cpMem2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001183 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001184 int Offset,
1185 unsigned DestReg,
1186 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001187 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001188 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001189 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001190 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001191 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDX, Offset));
1192 MI = BuildMI(V9::LDX, 3).addMReg(SrcPtrReg).addSImm(Offset)
1193 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001194 break;
1195
1196 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001197 assert(target.getInstrInfo().constantFitsInImmedField(V9::LD, Offset));
1198 MI = BuildMI(V9::LD, 3).addMReg(SrcPtrReg).addSImm(Offset)
1199 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001200 break;
1201
1202 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001203 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDD, Offset));
1204 MI = BuildMI(V9::LDD, 3).addMReg(SrcPtrReg).addSImm(Offset).addMReg(DestReg,
Chris Lattner1ebaa902003-01-15 17:47:49 +00001205 MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001206 break;
1207
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001208 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001209 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001210 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1211 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001212
1213 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001214 MI = BuildMI(V9::WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1,MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001215 break;
1216
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001217 case FloatCCRegType: {
Misha Brukman56f4fa12003-05-20 20:32:24 +00001218 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDXFSR, Offset));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001219 unsigned fsrRegNum = getUnifiedRegNum(UltraSparcRegInfo::SpecialRegClassID,
1220 SparcSpecialRegClass::fsr);
Misha Brukman56f4fa12003-05-20 20:32:24 +00001221 MI = BuildMI(V9::LDXFSR, 3).addMReg(SrcPtrReg).addSImm(Offset)
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001222 .addMReg(fsrRegNum, MOTy::UseAndDef);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001223 break;
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001224 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001225 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001226 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001227 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001228 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001229}
1230
1231
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001232//---------------------------------------------------------------------------
1233// Generate a copy instruction to copy a value to another. Temporarily
1234// used by PhiElimination code.
1235//---------------------------------------------------------------------------
1236
1237
Vikram S. Advee9327f02002-05-19 15:25:51 +00001238void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001239UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Misha Brukman352f7ac2003-05-21 17:59:06 +00001240 std::vector<MachineInstr*>& mvec) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001241 int RegType = getRegType(Src->getType());
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001242 MachineInstr * MI = NULL;
1243
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001244 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001245 case IntRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001246 MI = BuildMI(V9::ADD, 3).addReg(Src).addMReg(getZeroRegNum())
1247 .addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001248 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001249 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001250 MI = BuildMI(V9::FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001251 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001252 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001253 MI = BuildMI(V9::FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001254 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001255 default:
1256 assert(0 && "Unknow RegType in CpValu2Value");
1257 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001258
Chris Lattner9bebf832002-10-28 20:10:56 +00001259 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001260}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001261
1262
1263
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001264
1265
1266
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001267//----------------------------------------------------------------------------
1268// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001269// a call machine instruction. The caller saving/restoring instructions are
1270// inserted like:
1271//
1272// ** caller saving instructions
1273// other instructions inserted for the call by ColorCallArg
1274// CALL instruction
1275// other instructions inserted for the call ColorCallArg
1276// ** caller restoring instructions
1277//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001278//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001279
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001280
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001281void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001282UltraSparcRegInfo::insertCallerSavingCode
1283(std::vector<MachineInstr*> &instrnsBefore,
1284 std::vector<MachineInstr*> &instrnsAfter,
1285 MachineInstr *CallMI,
1286 const BasicBlock *BB,
1287 PhyRegAlloc &PRA) const
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001288{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001289 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001290
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001291 // has set to record which registers were saved/restored
1292 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001293 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001294
Vikram S. Advee9327f02002-05-19 15:25:51 +00001295 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1296
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001297 // Now find the LR of the return value of the call
1298 // The last *implicit operand* is the return value of a call
1299 // Insert it to to he PushedRegSet since we must not save that register
1300 // and restore it after the call.
1301 // We do this because, we look at the LV set *after* the instruction
1302 // to determine, which LRs must be saved across calls. The return value
1303 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001304
Vikram S. Advee9327f02002-05-19 15:25:51 +00001305 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001306
Chris Lattner5216cc52002-02-04 05:59:25 +00001307 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001308 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001309 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001310
Chris Lattner5216cc52002-02-04 05:59:25 +00001311 if (RetValLR->hasColor())
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001312 PushedRegSet.insert(getUnifiedRegNum(RetValLR->getRegClassID(),
1313 RetValLR->getColor()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001314 }
1315
Vikram S. Advee9327f02002-05-19 15:25:51 +00001316 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001317 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001318
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001319 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001320 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001321
1322 // get the live range corresponding to live var
1323 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1324
1325 // LR can be null if it is a const since a const
1326 // doesn't have a dominating def - see Assumptions above
1327 if( LR ) {
1328
1329 if( LR->hasColor() ) {
1330
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001331 unsigned RCID = LR->getRegClassID();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001332 unsigned Color = LR->getColor();
1333
1334 if ( isRegVolatile(RCID, Color) ) {
1335
1336 // if the value is in both LV sets (i.e., live before and after
1337 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001338
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001339 unsigned Reg = getUnifiedRegNum(RCID, Color);
1340
1341 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1342
1343 // if we haven't already pushed that register
1344
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001345 unsigned RegType = getRegType(LR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001346
1347 // Now get two instructions - to push on stack and pop from stack
1348 // and add them to InstrnsBefore and InstrnsAfter of the
1349 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001350 //
Chris Lattnerd47aac92002-12-28 20:21:29 +00001351 int StackOff =
1352 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001353
Misha Brukman352f7ac2003-05-21 17:59:06 +00001354 std::vector<MachineInstr*> AdIBef, AdIAft;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001355
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001356 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001357
1358 // We may need a scratch register to copy the saved value
1359 // to/from memory. This may itself have to insert code to
1360 // free up a scratch register. Any such code should go before
1361 // the save code.
1362 int scratchRegType = -1;
1363 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001364 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001365 { // Find a register not live in the LVSet before CallMI
1366 const ValueSet &LVSetBef =
1367 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1368 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1369 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001370 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001371 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001372 }
1373
1374 if (AdIBef.size() > 0)
1375 instrnsBefore.insert(instrnsBefore.end(),
1376 AdIBef.begin(), AdIBef.end());
1377
1378 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1379 scratchReg);
1380
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001381 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001382 instrnsBefore.insert(instrnsBefore.end(),
1383 AdIAft.begin(), AdIAft.end());
1384
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001385 //---- Insert code for popping the reg from the stack ----------
1386
Vikram S. Adveaee67012002-07-08 23:23:12 +00001387 // We may need a scratch register to copy the saved value
1388 // from memory. This may itself have to insert code to
1389 // free up a scratch register. Any such code should go
1390 // after the save code.
1391 //
1392 scratchRegType = -1;
1393 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001394 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001395 { // Find a register not live in the LVSet after CallMI
1396 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1397 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001398 assert(scratchReg != getInvalidRegNum());
Chris Lattnerce64edd2002-10-22 23:16:21 +00001399 CallMI->insertUsedReg(scratchReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001400 }
1401
1402 if (AdIBef.size() > 0)
1403 instrnsAfter.insert(instrnsAfter.end(),
1404 AdIBef.begin(), AdIBef.end());
1405
1406 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1407 scratchReg);
1408
1409 if (AdIAft.size() > 0)
1410 instrnsAfter.insert(instrnsAfter.end(),
1411 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001412
Chris Lattner7e5ee422002-02-05 04:20:12 +00001413 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001414
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001415 if(DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001416 std::cerr << "\nFor call inst:" << *CallMI;
1417 std::cerr << " -inserted caller saving instrs: Before:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001418 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001419 std::mem_fun(&MachineInstr::dump));
Misha Brukman352f7ac2003-05-21 17:59:06 +00001420 std::cerr << " -and After:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001421 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001422 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001423 }
1424 } // if not already pushed
1425
1426 } // if LR has a volatile color
1427
1428 } // if LR has color
1429
1430 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001431
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001432 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001433}
1434
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001435
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001436//---------------------------------------------------------------------------
1437// Print the register assigned to a LR
1438//---------------------------------------------------------------------------
1439
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001440void UltraSparcRegInfo::printReg(const LiveRange *LR) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001441 unsigned RegClassID = LR->getRegClassID();
Misha Brukman352f7ac2003-05-21 17:59:06 +00001442 std::cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001443
Chris Lattner5216cc52002-02-04 05:59:25 +00001444 if (!LR->hasColor()) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001445 std::cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001446 return;
1447 }
1448
1449 // if a color is found
1450
Misha Brukman352f7ac2003-05-21 17:59:06 +00001451 std::cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001452
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001453 unsigned uRegName = getUnifiedRegNum(RegClassID, LR->getColor());
1454
1455 std::cerr << "[";
1456 std::cerr<< getUnifiedRegName(uRegName);
1457 if (RegClassID == FloatRegClassID && LR->getType() == Type::DoubleTy)
1458 std::cerr << "+" << getUnifiedRegName(uRegName+1);
1459 std::cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001460}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001461
1462//---------------------------------------------------------------------------
1463// This method examines instructions inserted by RegAlloc code before a
1464// machine instruction to detect invalid orders that destroy values before
1465// they are used. If it detects such conditions, it reorders the instructions.
1466//
1467// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001468// instructions inserted by RegAlloc. All such instruction MUST have
1469// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001470//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001471// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1472// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001473//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001474// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001475//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001476// Since instructions are inserted in RegAlloc, this assumes that the
1477// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001478// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001479//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001480// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001481//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001482
1483void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1484 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001485 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001486
1487 /*
1488 Problem: We can have instructions inserted by RegAlloc like
1489 1. add %ox %g0 %oy
1490 2. add %oy %g0 %oz, where z!=x or z==x
1491
1492 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001493
1494 Solution:
1495 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001496
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001497 Algorithm:
1498
1499 do
1500 for each instruction 'DefInst' in the UnOrdVec
1501 for each instruction 'UseInst' that follows the DefInst
1502 if the reg defined by DefInst is used by UseInst
1503 mark DefInst as not movable in this iteration
1504 If DefInst is not marked as not-movable, move DefInst to OrdVec
1505 while all instructions in DefInst are moved to OrdVec
1506
1507 For moving, we call the move2OrdVec(). It checks whether there is a def
1508 in it for the uses in the instruction to be added to OrdVec. If there
1509 are no preceding defs, it just appends the instruction. If there is a
1510 preceding def, it puts two instructions to save the reg on stack before
1511 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001512
1513 */
1514
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001515 bool CouldMoveAll;
1516 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001517
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001518 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001519 CouldMoveAll = true;
Misha Brukman352f7ac2003-05-21 17:59:06 +00001520 std::vector<MachineInstr*>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001521
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001522 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001523
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001524 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001525
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001526 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001527
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001528 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001529
Misha Brukman352f7ac2003-05-21 17:59:06 +00001530 //std::cerr << "\nInst in UnordVec = " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001531
1532 // last operand is the def (unless for a store which has no def reg)
1533 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1534
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001535 if ((DefOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001536 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001537
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540
Misha Brukman352f7ac2003-05-21 17:59:06 +00001541 std::vector<MachineInstr*>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001542 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001543
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001544 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1545
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001546 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547 if( UseInst == NULL) continue;
1548
1549 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001550 MachineOperand& UseOp = UseInst->getOperand(0);
1551
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001552 if (!UseOp.opIsDefOnly() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001553 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001554
1555 // if use is a register ...
1556
1557 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1558
1559 // if Def and this use are the same, it means that this use
1560 // is destroyed by a def before it is used
1561
Misha Brukman352f7ac2003-05-21 17:59:06 +00001562 // std::cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001563
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001564 DefEqUse = true;
1565 CouldMoveAll = false;
1566 DebugPrint = true;
1567 break;
1568 } // if two registers are equal
1569
1570 } // if use is a register
1571
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001572 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001573
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001574 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001575
1576 // after examining all the instructions that follow the DefInst
1577 // if there are no dependencies, we can move it to the OrdVec
1578
Misha Brukman352f7ac2003-05-21 17:59:06 +00001579 // std::cerr << "Moved to Ord: " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001580
1581 moveInst2OrdVec(OrdVec, DefInst, PRA);
1582
1583 //OrdVec.push_back(DefInst);
1584
1585 // mark the pos of DefInst with NULL to indicate that it is
1586 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001587 *DefIt = NULL;
1588 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001589
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001590 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001591
1592 } // for all instructions in the UnordVec
1593
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594
Chris Lattner5216cc52002-02-04 05:59:25 +00001595 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001596
Chris Lattner070cf772002-06-04 03:09:57 +00001597 if (DebugPrint && DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001598 std::cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001599 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001600 std::cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001601 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001602}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001603
1604
1605
1606
1607
Misha Brukman352f7ac2003-05-21 17:59:06 +00001608void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr*> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001609 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001610 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001611 MachineOperand& UseOp = UnordInst->getOperand(0);
1612
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001613 if (!UseOp.opIsDefOnly() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001614 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001615
1616 // for the use of UnordInst, see whether there is a defining instr
1617 // before in the OrdVec
1618 bool DefEqUse = false;
1619
Misha Brukman352f7ac2003-05-21 17:59:06 +00001620 std::vector<MachineInstr*>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001621
1622 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1623
1624 MachineInstr *OrdInst = *OrdIt ;
1625
1626 MachineOperand& DefOp =
1627 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1628
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001629 if( (DefOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001630 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001631
Misha Brukman352f7ac2003-05-21 17:59:06 +00001632 //std::cerr << "\nDefining Ord Inst: " << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001633
1634 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1635
1636 // we are here because there is a preceding def in the OrdVec
1637 // for the use in this intr we are going to insert. This
1638 // happened because the original code was like:
1639 // 1. add %ox %g0 %oy
1640 // 2. add %oy %g0 %ox
1641 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1642 // Now we are processing %ox of 1.
1643 // We have to
1644
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001645 int UReg = DefOp.getMachineRegNum();
1646 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001647 MachineInstr *AdIBef, *AdIAft;
1648
Chris Lattnerd47aac92002-12-28 20:21:29 +00001649 int StackOff =
1650 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001651
1652 // Save the UReg (%ox) on stack before it's destroyed
Misha Brukman352f7ac2003-05-21 17:59:06 +00001653 std::vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001654 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001655 for (std::vector<MachineInstr*>::iterator MI=mvec.begin();
Chris Lattnerd47aac92002-12-28 20:21:29 +00001656 MI != mvec.end(); ++MI)
1657 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001658
1659 // Load directly into DReg (%oy)
1660 MachineOperand& DOp=
1661 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001662 assert((DOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
1663 "Last operand is not the def");
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001664 const int DReg = DOp.getMachineRegNum();
1665
Vikram S. Adveaee67012002-07-08 23:23:12 +00001666 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001667
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001668 if( DEBUG_RA ) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001669 std::cerr << "\nFixed CIRCULAR references by reordering:";
1670 std::cerr << "\nBefore CIRCULAR Reordering:\n";
1671 std::cerr << *UnordInst;
1672 std::cerr << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001673
Misha Brukman352f7ac2003-05-21 17:59:06 +00001674 std::cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001675 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001676 std::cerr << *(OrdVec[i]);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001677 }
1678
1679 // Do not copy the UseInst to OrdVec
1680 DefEqUse = true;
1681 break;
1682
1683 }// if two registers are equal
1684
1685 } // if Def is a register
1686
1687 } // for each instr in OrdVec
1688
Chris Lattner5216cc52002-02-04 05:59:25 +00001689 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001690
1691 // We didn't find a def in the OrdVec, so just append this inst
1692 OrdVec.push_back( UnordInst );
Misha Brukman352f7ac2003-05-21 17:59:06 +00001693 //std::cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001694 }
1695
1696 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001697}