blob: 141f22667d69c94934e47265d4883836e74f22ce [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)
Vikram S. Advea83804a2003-05-31 07:32:01 +000028 : TargetRegInfo(tgt), NumOfIntArgRegs(6), NumOfFloatArgRegs(32)
29{
Chris Lattner5216cc52002-02-04 05:59:25 +000030 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
31 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
32 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adve8adb9942003-05-27 00:02:22 +000034 MachineRegClassArr.push_back(new SparcSpecialRegClass(SpecialRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000035
Chris Lattner56e91662002-08-12 21:25:05 +000036 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000037 "32 Float regs are used for float arg passing");
38}
39
40
Vikram S. Advedb1435f2002-03-18 03:12:16 +000041// getZeroRegNum - returns the register that contains always zero.
42// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000043//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000044int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000045 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
46 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000047}
Chris Lattner5216cc52002-02-04 05:59:25 +000048
49// getCallAddressReg - returns the reg used for pushing the address when a
50// method is called. This can be used for other purposes between calls
51//
52unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000053 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
54 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000055}
56
57// Returns the register containing the return address.
58// It should be made sure that this register contains the return
59// value when a return instruction is reached.
60//
61unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000062 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
63 SparcIntRegClass::i7);
64}
65
66// Register get name implementations...
67
68// Int register names in same order as enum in class SparcIntRegClass
69static const char * const IntRegNames[] = {
70 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
71 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
72 "i0", "i1", "i2", "i3", "i4", "i5",
73 "i6", "i7",
74 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
75 "o6"
76};
77
Vikram S. Adve8adb9942003-05-27 00:02:22 +000078const char * const SparcIntRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +000079 assert(reg < NumOfAllRegs);
80 return IntRegNames[reg];
81}
82
83static const char * const FloatRegNames[] = {
84 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
85 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
86 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
87 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
88 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
89 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
90 "f60", "f61", "f62", "f63"
91};
92
Vikram S. Adve8adb9942003-05-27 00:02:22 +000093const char * const SparcFloatRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +000094 assert (reg < NumOfAllRegs);
95 return FloatRegNames[reg];
96}
97
98
99static const char * const IntCCRegNames[] = {
100 "xcc", "ccr"
101};
102
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000103const char * const SparcIntCCRegClass::getRegName(unsigned reg) const {
Chris Lattner56e91662002-08-12 21:25:05 +0000104 assert(reg < 2);
105 return IntCCRegNames[reg];
106}
107
108static const char * const FloatCCRegNames[] = {
109 "fcc0", "fcc1", "fcc2", "fcc3"
110};
111
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000112const char * const SparcFloatCCRegClass::getRegName(unsigned reg) const {
113 assert (reg < 5);
Chris Lattner56e91662002-08-12 21:25:05 +0000114 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000115}
116
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000117static const char * const SpecialRegNames[] = {
118 "fsr"
119};
120
121const char * const SparcSpecialRegClass::getRegName(unsigned reg) const {
122 assert (reg < 1);
123 return SpecialRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000124}
125
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000126// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000127unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000128 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
129 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000130}
131
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000132// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000133unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000134 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
135 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000136}
137
138
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000139//---------------------------------------------------------------------------
140// Finds whether a call is an indirect call
141//---------------------------------------------------------------------------
142
143inline bool
144isVarArgsFunction(const Type *funcType) {
145 return cast<FunctionType>(cast<PointerType>(funcType)
146 ->getElementType())->isVarArg();
147}
148
149inline bool
150isVarArgsCall(const MachineInstr *CallMI) {
151 Value* callee = CallMI->getOperand(0).getVRegValue();
152 // const Type* funcType = isa<Function>(callee)? callee->getType()
153 // : cast<PointerType>(callee->getType())->getElementType();
154 const Type* funcType = callee->getType();
155 return isVarArgsFunction(funcType);
156}
157
158
Vikram S. Advea83804a2003-05-31 07:32:01 +0000159// Get the register number for the specified argument #argNo,
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000160//
161// Return value:
Vikram S. Advea83804a2003-05-31 07:32:01 +0000162// getInvalidRegNum(), if there is no int register available for the arg.
163// regNum, otherwise (this is NOT the unified reg. num).
164// regClassId is set to the register class ID.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000165//
Vikram S. Advea83804a2003-05-31 07:32:01 +0000166int
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000167UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000168 unsigned argNo, unsigned& regClassId) const
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000169{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000170 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000171 if (argNo >= NumOfIntArgRegs)
Vikram S. Advea83804a2003-05-31 07:32:01 +0000172 return getInvalidRegNum();
Vikram S. Advee9327f02002-05-19 15:25:51 +0000173 else
Chris Lattner56e91662002-08-12 21:25:05 +0000174 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000175}
176
Vikram S. Advea83804a2003-05-31 07:32:01 +0000177// Get the register number for the specified FP argument #argNo,
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000178// Use INT regs for FP args if this is a varargs call.
179//
180// Return value:
Vikram S. Advea83804a2003-05-31 07:32:01 +0000181// getInvalidRegNum(), if there is no int register available for the arg.
182// regNum, otherwise (this is NOT the unified reg. num).
183// regClassId is set to the register class ID.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000184//
Vikram S. Advea83804a2003-05-31 07:32:01 +0000185int
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000186UltraSparcRegInfo::regNumForFPArg(unsigned regType,
187 bool inCallee, bool isVarArgsCall,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000188 unsigned argNo, unsigned& regClassId) const
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000189{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000190 if (isVarArgsCall)
Vikram S. Advea83804a2003-05-31 07:32:01 +0000191 return regNumForIntArg(inCallee, isVarArgsCall, argNo, regClassId);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000192 else
193 {
194 regClassId = FloatRegClassID;
195 if (regType == FPSingleRegType)
196 return (argNo*2+1 >= NumOfFloatArgRegs)?
Vikram S. Advea83804a2003-05-31 07:32:01 +0000197 getInvalidRegNum() : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000198 else if (regType == FPDoubleRegType)
199 return (argNo*2 >= NumOfFloatArgRegs)?
Vikram S. Advea83804a2003-05-31 07:32:01 +0000200 getInvalidRegNum() : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000201 else
202 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000203 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000204 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000205}
206
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000207
208//---------------------------------------------------------------------------
209// Finds the return address of a call sparc specific call instruction
210//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000211
Vikram S. Adveaee67012002-07-08 23:23:12 +0000212// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000213// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000214//
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000215int UltraSparcRegInfo::getRegTypeForClassAndType(unsigned regClassID,
216 const Type* type) const
217{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000218 switch (regClassID) {
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000219 case IntRegClassID: return IntRegType;
220 case FloatRegClassID:
221 if (type == Type::FloatTy) return FPSingleRegType;
222 else if (type == Type::DoubleTy) return FPDoubleRegType;
223 assert(0 && "Unknown type in FloatRegClass"); return 0;
224 case IntCCRegClassID: return IntCCRegType;
225 case FloatCCRegClassID: return FloatCCRegType;
226 case SpecialRegClassID: return SpecialRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000227 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000228 }
229}
230
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000231int UltraSparcRegInfo::getRegType(const Type* type) const
232{
233 return getRegTypeForClassAndType(getRegClassIDOfType(type), type);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000234}
235
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000236int UltraSparcRegInfo::getRegType(const LiveRange *LR) const
237{
238 return getRegTypeForClassAndType(LR->getRegClassID(), LR->getType());
239}
Chris Lattner5216cc52002-02-04 05:59:25 +0000240
Vikram S. Adve8adb9942003-05-27 00:02:22 +0000241int UltraSparcRegInfo::getRegType(int unifiedRegNum) const
242{
Vikram S. Adveaee67012002-07-08 23:23:12 +0000243 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000244 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000245 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000246 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000247 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000249 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000250 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000251 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000252 return IntCCRegType;
253 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000254 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000255 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000256}
257
258
Vikram S. Adveaee67012002-07-08 23:23:12 +0000259// To find the register class used for a specified Type
260//
261unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000262 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000263 Type::PrimitiveID ty = type->getPrimitiveID();
264 unsigned res;
265
266 // FIXME: Comparing types like this isn't very safe...
267 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
268 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
269 res = IntRegClassID; // sparc int reg (ty=0: void)
270 else if (ty <= Type::DoubleTyID)
271 res = FloatRegClassID; // sparc float reg class
272 else {
273 //std::cerr << "TypeID: " << ty << "\n";
274 assert(0 && "Cannot resolve register class for type");
275 return 0;
276 }
277
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000278 if (isCCReg)
279 return res + 2; // corresponding condition code register
Vikram S. Adveaee67012002-07-08 23:23:12 +0000280 else
281 return res;
282}
283
Vikram S. Adveaee67012002-07-08 23:23:12 +0000284unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
285 switch(regType) {
286 case IntRegType: return IntRegClassID;
287 case FPSingleRegType:
288 case FPDoubleRegType: return FloatRegClassID;
289 case IntCCRegType: return IntCCRegClassID;
290 case FloatCCRegType: return FloatCCRegClassID;
291 default:
292 assert(0 && "Invalid register type in getRegClassIDOfRegType");
293 return 0;
294 }
295}
296
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000297//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000298// Suggests a register for the ret address in the RET machine instruction.
299// We always suggest %i7 by convention.
300//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000301void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000302 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000303
Vikram S. Adveaee67012002-07-08 23:23:12 +0000304 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000305
Vikram S. Adveaee67012002-07-08 23:23:12 +0000306 // return address is always mapped to i7 so set it immediately
307 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000308 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000309
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000310 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000311 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000312 // we have to test later whether it received the suggested color.
313 // In that case, a LR has to be created at the start of method.
314 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000315
Vikram S. Adveaee67012002-07-08 23:23:12 +0000316 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000317 // const Value *RetAddrVal = MO.getVRegValue();
318 // assert( RetAddrVal && "LR for ret address must be created at start");
319 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
320 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000321 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000322}
323
324
325//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000326// Suggests a register for the ret address in the JMPL/CALL machine instr.
327// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000328//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000329void
330UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
331 LiveRangeInfo& LRI) const
332{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000333 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
334 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000335 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000336
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000337 // A LR must already exist for the return address.
338 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
339 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
340
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000341 unsigned RegClassID = RetAddrLR->getRegClassID();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000342 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
343}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000344
345
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000346
347//---------------------------------------------------------------------------
348// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000349// According to the Sparc ABI, the first 6 incoming args are in
350// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000351// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000352// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000354void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000355 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000356{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000357 // check if this is a varArgs function. needed for choosing regs.
358 bool isVarArgs = isVarArgsFunction(Meth->getType());
359
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000360 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000361 unsigned argNo=0, intArgNo=0, fpArgNo=0;
362 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
363 I != E; ++I, ++argNo) {
364 // get the LR of arg
365 LiveRange *LR = LRI.getLiveRangeForValue(I);
366 assert(LR && "No live range found for method arg");
367
368 unsigned regType = getRegType(LR);
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000369 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg (unused)
Chris Lattner7076ff22002-06-25 16:13:21 +0000370
371 int regNum = (regType == IntRegType)
372 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000373 argNo, regClassIDOfArgReg)
Chris Lattner7076ff22002-06-25 16:13:21 +0000374 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000375 argNo, regClassIDOfArgReg);
Chris Lattner7076ff22002-06-25 16:13:21 +0000376
Vikram S. Advea83804a2003-05-31 07:32:01 +0000377 if(regNum != getInvalidRegNum())
Chris Lattner7076ff22002-06-25 16:13:21 +0000378 LR->setSuggestedColor(regNum);
379 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000380}
381
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000382
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000383//---------------------------------------------------------------------------
384// This method is called after graph coloring to move incoming args to
385// the correct hardware registers if they did not receive the correct
386// (suggested) color through graph coloring.
387//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000388void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000389 LiveRangeInfo &LRI,
390 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000391
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000392 // check if this is a varArgs function. needed for choosing regs.
393 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000394 MachineInstr *AdMI;
395
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000396 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000397 // for each argument. count INT and FP arguments separately.
398 unsigned argNo=0, intArgNo=0, fpArgNo=0;
399 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
400 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000401 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000402 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000403 assert( LR && "No live range found for method arg");
404
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000405 unsigned regType = getRegType(LR);
406 unsigned RegClassID = LR->getRegClassID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000407
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000408 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000409 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000410 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000411 bool isArgInReg = false;
Vikram S. Advea83804a2003-05-31 07:32:01 +0000412 unsigned UniArgReg = getInvalidRegNum(); // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000413 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000414
415 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000416 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000417 argNo, regClassIDOfArgReg)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000418 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000419 argNo, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000420
Vikram S. Advea83804a2003-05-31 07:32:01 +0000421 if(regNum != getInvalidRegNum()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000422 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000423 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000424 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000425
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000426 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000427
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000428 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
429
430 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000431 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000432 if( UniLRReg == UniArgReg )
433 continue;
434
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000435 // We are here because the LR did not receive the suggested
436 // but LR received another register.
437 // Now we have to copy the %i reg (or stack pos of arg)
438 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000439
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000440 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000441 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000442 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000443 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000444 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000445 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000446
447 // It is a variable argument call: the float reg must go in a %o reg.
448 // We have to move an int reg to a float reg via memory.
449 //
450 assert(isVarArgs &&
451 RegClassID == FloatRegClassID &&
452 regClassIDOfArgReg == IntRegClassID &&
453 "This should only be an Int register for an FP argument");
454
Chris Lattnerd47aac92002-12-28 20:21:29 +0000455 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000456 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000457 cpReg2MemMI(FirstAI->InstrnsBefore,
458 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000459
Vikram S. Adveaee67012002-07-08 23:23:12 +0000460 cpMem2RegMI(FirstAI->InstrnsBefore,
461 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000462 }
463 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000464 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000465 }
466 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000467 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000468
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000469 // Now the arg is coming on stack. Since the LR recieved a register,
470 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000471 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000472 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000473 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000474 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000475 argNo);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000476
477 // float arguments on stack are right justified so adjust the offset!
478 // int arguments are also right justified but they are always loaded as
479 // a full double-word so the offset does not need to be adjusted.
480 if (regType == FPSingleRegType) {
481 unsigned argSize = target.getTargetData().getTypeSize(LR->getType());
482 unsigned slotSize = frameInfo.getSizeOfEachArgOnStack();
483 assert(argSize <= slotSize && "Insufficient slot size!");
484 offsetFromFP += slotSize - argSize;
485 }
486
Vikram S. Adveaee67012002-07-08 23:23:12 +0000487 cpMem2RegMI(FirstAI->InstrnsBefore,
488 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000489 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000490
491 } // if LR received a color
492
493 else {
494
495 // Now, the LR did not receive a color. But it has a stack offset for
496 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000497 // So, if the arg is coming in UniArgReg register, we can just move
498 // that on to the stack pos of LR
499
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000500 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000501
502 if( regClassIDOfArgReg != RegClassID ) {
503 assert(0 &&
504 "FP arguments to a varargs function should be explicitly "
505 "copied to/from int registers by instruction selection!");
506
507 // It must be a float arg for a variable argument call, which
508 // must come in a %o reg. Move the int reg to the stack.
509 //
510 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
511 "This should only be an Int register for an FP argument");
512
Vikram S. Adveaee67012002-07-08 23:23:12 +0000513 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
514 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000515 }
516 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000517 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
518 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000519 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000520 }
521
522 else {
523
524 // Now the arg is coming on stack. Since the LR did NOT
525 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000526 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000527 // since this method is called before any other method that makes
528 // uses of the stack pos of the LR (e.g., updateMachineInstr)
Vikram S. Advea83804a2003-05-31 07:32:01 +0000529 //
Chris Lattnerd47aac92002-12-28 20:21:29 +0000530 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000531 int offsetFromFP =
Misha Brukman7ae7f842002-10-28 00:28:31 +0000532 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000533 argNo);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000534
535 // FP arguments on stack are right justified so adjust offset!
536 // int arguments are also right justified but they are always loaded as
537 // a full double-word so the offset does not need to be adjusted.
538 if (regType == FPSingleRegType) {
539 unsigned argSize = target.getTargetData().getTypeSize(LR->getType());
540 unsigned slotSize = frameInfo.getSizeOfEachArgOnStack();
541 assert(argSize <= slotSize && "Insufficient slot size!");
542 offsetFromFP += slotSize - argSize;
543 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000544
545 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000546 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000547
548 }
549
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000550 } // for each incoming argument
551
552}
553
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000554
555
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000556//---------------------------------------------------------------------------
557// This method is called before graph coloring to suggest colors to the
558// outgoing call args and the return value of the call.
559//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000560void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000561 LiveRangeInfo& LRI) const {
Vikram S. Adve879eac92002-10-13 00:05:30 +0000562 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000563
Vikram S. Advee9327f02002-05-19 15:25:51 +0000564 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000565
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000566 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000567
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000568 // First color the return value of the call instruction, if any.
569 // The return value will be in %o0 if the value is an integer type,
570 // or in %f0 if the value is a float type.
571 //
572 if (const Value *RetVal = argDesc->getReturnValue()) {
573 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
574 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000575
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000576 unsigned RegClassID = RetValLR->getRegClassID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000577
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000578 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000579 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000580 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000581 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000582 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000583 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000584 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000585
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000586 // Now suggest colors for arguments (operands) of the call instruction.
587 // Colors are suggested only if the arg number is smaller than the
588 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000589 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000590
Vikram S. Advee9327f02002-05-19 15:25:51 +0000591 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000592
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000593 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
594 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000595
Vikram S. Advee9327f02002-05-19 15:25:51 +0000596 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000597
598 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000599 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000600 if (!LR)
601 continue; // no live ranges for constants and labels
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000602
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000603 unsigned regType = getRegType(LR);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000604 unsigned regClassIDOfArgReg = BadRegClass; // chosen reg class (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000605
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000606 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000607 // an INT or FP value. Here we ignore whether or not it is a
608 // varargs calls, because FP arguments will be explicitly copied
609 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000610 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000611 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000612 argNo, regClassIDOfArgReg)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000613 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000614 argNo, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000615
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000616 // If a register could be allocated, use it.
617 // If not, do NOTHING as this will be colored as a normal value.
Vikram S. Advea83804a2003-05-31 07:32:01 +0000618 if(regNum != getInvalidRegNum())
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000619 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000620
Vikram S. Advea83804a2003-05-31 07:32:01 +0000621#ifdef CANNOT_PRECOPY_CALLARGS
Vikram S. Advee9327f02002-05-19 15:25:51 +0000622 // Repeat for the second copy of the argument, which would be
623 // an FP argument being passed to a function with no prototype
624 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
625 if (argCopy != NULL)
626 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000627 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000628 && "Must be passing copy of FP argument in int register");
629 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000630 argNo, regClassIDOfArgReg);
631 assert(copyRegNum != getInvalidRegNum());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000632 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
633 copyLR->setSuggestedColor(copyRegNum);
634 }
Vikram S. Advea83804a2003-05-31 07:32:01 +0000635#endif
Vikram S. Advee9327f02002-05-19 15:25:51 +0000636
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000637 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000638
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000639}
640
641
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000642//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000643// Helper method for UltraSparcRegInfo::colorCallArgs().
644//---------------------------------------------------------------------------
645
646void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000647UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000648 AddedInstrns *CallAI,
649 PhyRegAlloc &PRA, LiveRange* LR,
650 unsigned regType, unsigned RegClassID,
Chris Lattnerd47aac92002-12-28 20:21:29 +0000651 int UniArgRegOrNone, unsigned argNo,
Misha Brukman352f7ac2003-05-21 17:59:06 +0000652 std::vector<MachineInstr*> &AddedInstrnsBefore)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000653 const
654{
Vikram S. Advea83804a2003-05-31 07:32:01 +0000655 assert(0 && "Should never get here because we are now using precopying!");
656
Vikram S. Advee9327f02002-05-19 15:25:51 +0000657 MachineInstr *AdMI;
658 bool isArgInReg = false;
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000659 unsigned UniArgReg = BadRegClass; // unused unless initialized below
Vikram S. Advea83804a2003-05-31 07:32:01 +0000660 if (UniArgRegOrNone != getInvalidRegNum())
Vikram S. Advee9327f02002-05-19 15:25:51 +0000661 {
662 isArgInReg = true;
663 UniArgReg = (unsigned) UniArgRegOrNone;
664 }
665
666 if (LR->hasColor()) {
667 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
668
669 // if LR received the correct color, nothing to do
670 if( isArgInReg && UniArgReg == UniLRReg )
671 return;
672
673 // The LR is allocated to a register UniLRReg and must be copied
674 // to UniArgReg or to the stack slot.
675 //
676 if( isArgInReg ) {
677 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000678 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000679 }
680 else {
681 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattnerd47aac92002-12-28 20:21:29 +0000682 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000683 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000684 cpReg2MemMI(CallAI->InstrnsBefore,
685 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000686 }
687
688 } else { // LR is not colored (i.e., spilled)
689
690 if( isArgInReg ) {
691 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000692 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
693 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000694 // Now add the instruction
695 }
696
697 else {
698 // Now, we have to pass the arg on stack. Since LR also did NOT
699 // receive a register we have to move an argument in memory to
700 // outgoing parameter on stack.
701 // Use TReg to load and store the value.
702 // Use TmpOff to save TReg, since that may have a live value.
703 //
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000704 int TReg = PRA.getUniRegNotUsedByThisInst(LR->getRegClass(), CallMI);
Chris Lattnerd47aac92002-12-28 20:21:29 +0000705 int TmpOff = PRA.MF.getInfo()->
706 pushTempValue(getSpilledRegSize(getRegType(LR)));
707 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattnere3aa50d2002-10-28 19:32:07 +0000708 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000709
710 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
711
712 // Sequence:
713 // (1) Save TReg on stack
714 // (2) Load LR value into TReg from stack pos of LR
715 // (3) Store Treg on outgoing Arg pos on stack
716 // (4) Load the old value of TReg from stack to TReg (restore it)
717 //
718 // OPTIMIZE THIS:
719 // When reverse pointers in MahineInstr are introduced:
720 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
721 // needed only if this fails. Currently, we cannot call the
722 // above method since we cannot find LVSetBefore without the BB
723 //
724 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
725 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000726 cpReg2MemMI(CallAI->InstrnsBefore,
727 TReg, getFramePointer(), TmpOff, regType);
728 cpMem2RegMI(CallAI->InstrnsBefore,
729 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
730 cpReg2MemMI(CallAI->InstrnsBefore,
731 TReg, getStackPointer(), argOffset, regType);
732 cpMem2RegMI(CallAI->InstrnsBefore,
733 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000734 }
735 }
736}
737
738//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000739// After graph coloring, we have call this method to see whehter the return
740// value and the call args received the correct colors. If not, we have
741// to instert copy instructions.
742//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000743
Vikram S. Adveaee67012002-07-08 23:23:12 +0000744void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000745 LiveRangeInfo &LRI,
746 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000747 PhyRegAlloc &PRA,
748 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000749
Vikram S. Adve879eac92002-10-13 00:05:30 +0000750 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000751
Vikram S. Advee9327f02002-05-19 15:25:51 +0000752 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
753
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000754 // First color the return value of the call.
755 // If there is a LR for the return value, it means this
756 // method returns a value
757
758 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000759
Vikram S. Advee9327f02002-05-19 15:25:51 +0000760 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000761
Chris Lattner30e8fb62002-02-05 01:43:49 +0000762 if (RetVal) {
763 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Vikram S. Advea83804a2003-05-31 07:32:01 +0000764 assert(RetValLR && "ERROR: No LR for non-void return value");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000765
Vikram S. Advea83804a2003-05-31 07:32:01 +0000766 // Mark the return value register as used by this instruction
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000767 unsigned RegClassID = RetValLR->getRegClassID();
Vikram S. Advea83804a2003-05-31 07:32:01 +0000768 unsigned CorrectCol = (RegClassID == IntRegClassID
769 ? (unsigned) SparcIntRegClass::o0
770 : (unsigned) SparcFloatRegClass::f0);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000771
Vikram S. Advea83804a2003-05-31 07:32:01 +0000772 CallMI->insertUsedReg(getUnifiedRegNum(RegClassID, CorrectCol));
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000773
Vikram S. Advea83804a2003-05-31 07:32:01 +0000774#ifdef CANNOT_PRECOPY_CALLARGS
775 // unified number for CorrectCol
776 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
777 recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000778
779 // if the LR received the correct color, NOTHING to do
Vikram S. Advea83804a2003-05-31 07:32:01 +0000780 bool recvCorrectColor = (RetValLR->hasColor()
781 ? RetValLR->getColor() == CorrectCol : false);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000782
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000783 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000784 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000785 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000786
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000787 unsigned regType = getRegType(RetValLR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000788
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000789 if( RetValLR->hasColor() ) {
790
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000791 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000792
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000793 // the return value is coming in UniRetReg but has to go into
794 // the UniRetLRReg
795
Vikram S. Adveaee67012002-07-08 23:23:12 +0000796 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000797
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000798 } // if LR has color
799 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000800
801 // if the LR did NOT receive a color, we have to move the return
802 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000803
Vikram S. Adveaee67012002-07-08 23:23:12 +0000804 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
805 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000806 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000807 } // the LR didn't receive the suggested color
Vikram S. Advea83804a2003-05-31 07:32:01 +0000808#endif
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000809
810 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000811
812
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000813 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000814 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000815 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000816
Misha Brukman352f7ac2003-05-21 17:59:06 +0000817 std::vector<MachineInstr*> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000818
819 unsigned NumOfCallArgs = argDesc->getNumArgs();
820
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000821 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
822 i < NumOfCallArgs; ++i, ++argNo) {
Vikram S. Advea83804a2003-05-31 07:32:01 +0000823
Vikram S. Advee9327f02002-05-19 15:25:51 +0000824 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000825 unsigned regType = getRegType(CallArg->getType());
Vikram S. Advea83804a2003-05-31 07:32:01 +0000826
Vikram S. Advee9327f02002-05-19 15:25:51 +0000827 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000828 // Also find the correct register the argument must use (UniArgReg)
829 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000830 bool isArgInReg = false;
Vikram S. Advea83804a2003-05-31 07:32:01 +0000831 int UniArgReg = getInvalidRegNum(); // reg that LR MUST be colored with
Chris Lattner24c1d5e2003-01-14 23:05:08 +0000832 unsigned regClassIDOfArgReg = BadRegClass; // reg class of chosen reg
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000833
Vikram S. Advee9327f02002-05-19 15:25:51 +0000834 // Find the register that must be used for this arg, depending on
835 // whether it is an INT or FP value. Here we ignore whether or not it
836 // is a varargs calls, because FP arguments will be explicitly copied
837 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea83804a2003-05-31 07:32:01 +0000838 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000839 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000840 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000841 argNo, regClassIDOfArgReg)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000842 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000843 argNo, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000844
Vikram S. Advea83804a2003-05-31 07:32:01 +0000845 if (regNum != getInvalidRegNum()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000846 isArgInReg = true;
Vikram S. Advea83804a2003-05-31 07:32:01 +0000847 UniArgReg = getUnifiedRegNum(regClassIDOfArgReg, regNum);
848 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
849 }
850
851#ifdef CANNOT_PRECOPY_CALLARGS
852
853 // Get the LR of call operand (parameter). There must be one because
854 // all args (even constants) must be defined before.
855 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
856 assert(LR && "NO LR for call arg");
857
858 unsigned RegClassID = getRegClassIDOfType(CallArg->getType());
859
860 if (regNum != getInvalidRegNum()) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000861 assert(regClassIDOfArgReg == RegClassID &&
862 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000863 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000864
Vikram S. Advee9327f02002-05-19 15:25:51 +0000865 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
866 UniArgReg, argNo, AddedInstrnsBefore);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000867#endif
Vikram S. Advee9327f02002-05-19 15:25:51 +0000868
869 // Repeat for the second copy of the argument, which would be
870 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000871 // It may either be passed as a copy in an integer register
872 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advea83804a2003-05-31 07:32:01 +0000873 int argCopyReg = argDesc->getArgInfo(i).getArgCopy();
874 if (argCopyReg != TargetRegInfo::getInvalidRegNum())
Vikram S. Advee9327f02002-05-19 15:25:51 +0000875 {
Vikram S. Advea83804a2003-05-31 07:32:01 +0000876 CallMI->insertUsedReg(argCopyReg); // mark the reg as used
877
878#ifdef CANNOT_PRECOPY_CALLARGS
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000879 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000880 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000881
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000882 unsigned copyRegClassID = getRegClassIDOfType(argCopy->getType());
883 unsigned copyRegType = getRegType(argCopy->getType());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000884
885 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000886 argNo, regClassIDOfArgReg);
887 assert(copyRegNum != getInvalidRegNum());
Vikram S. Advee9327f02002-05-19 15:25:51 +0000888 assert(regClassIDOfArgReg == copyRegClassID &&
889 "Moving values between reg classes must happen during selection");
890
891 InitializeOutgoingArg(CallMI, CallAI, PRA,
892 LRI.getLiveRangeForValue(argCopy), copyRegType,
893 copyRegClassID, copyRegNum, argNo,
894 AddedInstrnsBefore);
Vikram S. Advea83804a2003-05-31 07:32:01 +0000895#endif
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000896 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000897
Vikram S. Advea83804a2003-05-31 07:32:01 +0000898#ifdef CANNOT_PRECOPY_CALLARGS
899 if (regNum != getInvalidRegNum() &&
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000900 argDesc->getArgInfo(i).usesStackSlot())
901 {
902 // Pass the argument via the stack in addition to regNum
903 assert(regType != IntRegType && "Passing an integer arg. twice?");
904 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
905 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
Vikram S. Advea83804a2003-05-31 07:32:01 +0000906 getInvalidRegNum(), argNo, AddedInstrnsBefore);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000907 }
Vikram S. Advea83804a2003-05-31 07:32:01 +0000908#endif
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000909 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000910
Vikram S. Advee9327f02002-05-19 15:25:51 +0000911 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000912 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000913 //
Misha Brukman352f7ac2003-05-21 17:59:06 +0000914 std::vector<MachineInstr*> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000915 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000916
Chris Lattner5216cc52002-02-04 05:59:25 +0000917 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000918 std::cerr << "\nCalling reorder with instrns: \n";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000919 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000920 std::cerr << *(AddedInstrnsBefore[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000921 }
922
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000923 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
924 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
925 && "Dropped some instructions when reordering!");
926
Chris Lattner5216cc52002-02-04 05:59:25 +0000927 if (DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +0000928 std::cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000929 for(unsigned i = 0; i < ReorderedVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +0000930 std::cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000931 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000932 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000933
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000934 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000935 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000936 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
937 CallMI, BB, PRA);
938
939 // Then insert the final reordered code for the call arguments.
940 //
941 for(unsigned i=0; i < ReorderedVec.size(); i++)
942 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000943}
944
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000945//---------------------------------------------------------------------------
946// This method is called for an LLVM return instruction to identify which
947// values will be returned from this method and to suggest colors.
948//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000949void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000950 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000951
Vikram S. Adve879eac92002-10-13 00:05:30 +0000952 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000953
Vikram S. Adveaee67012002-07-08 23:23:12 +0000954 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000955
Vikram S. Advea83804a2003-05-31 07:32:01 +0000956 // To find the return value (if any), we can get the LLVM return instr.
957 // from the return address register, which is the first operand
958 Value* tmpI = RetMI->getOperand(0).getVRegValue();
959 ReturnInst* retI=cast<ReturnInst>(cast<TmpInstruction>(tmpI)->getOperand(0));
960 if (const Value *RetVal = retI->getReturnValue())
961 if (LiveRange *const LR = LRI.getLiveRangeForValue(RetVal))
962 LR->setSuggestedColor(LR->getRegClassID() == IntRegClassID
963 ? (unsigned) SparcIntRegClass::i0
964 : (unsigned) SparcFloatRegClass::f0);
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
Vikram S. Advea83804a2003-05-31 07:32:01 +0000981 // To find the return value (if any), we can get the LLVM return instr.
982 // from the return address register, which is the first operand
983 Value* tmpI = RetMI->getOperand(0).getVRegValue();
984 ReturnInst* retI=cast<ReturnInst>(cast<TmpInstruction>(tmpI)->getOperand(0));
985 if (const Value *RetVal = retI->getReturnValue()) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000986
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000987 unsigned RegClassID = getRegClassIDOfType(RetVal->getType());
988 unsigned regType = getRegType(RetVal->getType());
Vikram S. Advea83804a2003-05-31 07:32:01 +0000989 unsigned CorrectCol = (RegClassID == IntRegClassID
990 ? (unsigned) SparcIntRegClass::i0
991 : (unsigned) SparcFloatRegClass::f0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000992
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000993 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000994 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000995
Vikram S. Adveaee67012002-07-08 23:23:12 +0000996 // Mark the register as used by this instruction
Chris Lattnerce64edd2002-10-22 23:16:21 +0000997 RetMI->insertUsedReg(UniRetReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000998
Vikram S. Advea83804a2003-05-31 07:32:01 +0000999#ifdef CANNOT_PRECOPY_CALLARGS
1000 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
1001 assert(LR && "No LR for return value of non-void method?");
1002
1003 if (LR->hasColor()) {
1004 // if the LR received the correct color, NOTHING to do
1005 if (LR->getColor() == CorrectCol)
1006 return;
1007
1008 // We are here because the LR was allocated a register
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001009 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001010
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001011 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001015 // the LR received UniLRReg but must be colored with UniRetReg
1016 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001017 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001019 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001020 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1021 LR->getSpillOffFromFP(), UniRetReg, regType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001022 //std::cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001023 }
Vikram S. Advea83804a2003-05-31 07:32:01 +00001024#endif
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001025
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001026 } // if there is a return value
1027
1028}
1029
Vikram S. Adveaee67012002-07-08 23:23:12 +00001030//---------------------------------------------------------------------------
1031// Check if a specified register type needs a scratch register to be
1032// copied to/from memory. If it does, the reg. type that must be used
1033// for scratch registers is returned in scratchRegType.
1034//
1035// Only the int CC register needs such a scratch register.
1036// The FP CC registers can (and must) be copied directly to/from memory.
1037//---------------------------------------------------------------------------
1038
1039bool
1040UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1041 int& scratchRegType) const
1042{
1043 if (RegType == IntCCRegType)
1044 {
1045 scratchRegType = IntRegType;
1046 return true;
1047 }
1048 return false;
1049}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001050
1051//---------------------------------------------------------------------------
1052// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001053// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001054//---------------------------------------------------------------------------
1055
Vikram S. Advee9327f02002-05-19 15:25:51 +00001056void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001057UltraSparcRegInfo::cpReg2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001058 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001059 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001060 int RegType) const {
Vikram S. Advea83804a2003-05-31 07:32:01 +00001061 assert( ((int)SrcReg != getInvalidRegNum()) && ((int)DestReg != getInvalidRegNum()) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001062 "Invalid Register");
1063
1064 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001065
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001066 switch( RegType ) {
1067
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001068 case IntCCRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001069 if (getRegType(DestReg) == IntRegType) {
1070 // copy intCC reg to int reg
1071 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1072 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(DestReg,MOTy::Def);
1073 } else {
1074 // copy int reg to intCC reg
1075 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1076 assert(getRegType(SrcReg) == IntRegType
1077 && "Can only copy CC reg to/from integer reg");
1078 MI = BuildMI(V9::WRCCR, 2).addMReg(SrcReg).addMReg(DestReg+1, MOTy::Def);
1079 }
Vikram S. Adveaee67012002-07-08 23:23:12 +00001080 break;
1081
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001082 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001083 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001084 break;
1085
1086 case IntRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001087 MI = BuildMI(V9::ADDr, 3).addMReg(SrcReg).addMReg(getZeroRegNum())
Misha Brukman56f4fa12003-05-20 20:32:24 +00001088 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001089 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001090
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001091 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001092 MI = BuildMI(V9::FMOVS, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001093 break;
1094
1095 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001096 MI = BuildMI(V9::FMOVD, 2).addMReg(SrcReg).addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001097 break;
1098
1099 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001100 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001101 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001102 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001103
1104 if (MI)
1105 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001106}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001107
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001108//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001109// Copy from a register to memory (i.e., Store). Register number must
1110// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001111//---------------------------------------------------------------------------
1112
1113
Vikram S. Advee9327f02002-05-19 15:25:51 +00001114void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001115UltraSparcRegInfo::cpReg2MemMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001116 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001117 unsigned DestPtrReg,
1118 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001119 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001120 MachineInstr * MI = NULL;
Chris Lattner1ebaa902003-01-15 17:47:49 +00001121 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001122 case IntRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001123 assert(target.getInstrInfo().constantFitsInImmedField(V9::STXi, Offset));
1124 MI = BuildMI(V9::STXi,3).addMReg(SrcReg).addMReg(DestPtrReg)
1125 .addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001126 break;
1127
1128 case FPSingleRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001129 assert(target.getInstrInfo().constantFitsInImmedField(V9::STFi, Offset));
1130 MI = BuildMI(V9::STFi, 3).addMReg(SrcReg).addMReg(DestPtrReg)
1131 .addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001132 break;
1133
1134 case FPDoubleRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001135 assert(target.getInstrInfo().constantFitsInImmedField(V9::STDFi, Offset));
1136 MI = BuildMI(V9::STDFi,3).addMReg(SrcReg).addMReg(DestPtrReg)
1137 .addSImm(Offset);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001138 break;
1139
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001140 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001141 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001142 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001143
1144 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001145 MI = BuildMI(V9::RDCCR, 2).addMReg(SrcReg+1).addMReg(scratchReg, MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001146 mvec.push_back(MI);
1147
Chris Lattner56e91662002-08-12 21:25:05 +00001148 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Chris Lattner1ebaa902003-01-15 17:47:49 +00001149 return;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001150
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001151 case FloatCCRegType: {
Misha Brukmanaf96d392003-05-27 22:40:34 +00001152 assert(target.getInstrInfo().constantFitsInImmedField(V9::STXFSRi, Offset));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001153 unsigned fsrRegNum = getUnifiedRegNum(UltraSparcRegInfo::SpecialRegClassID,
1154 SparcSpecialRegClass::fsr);
Misha Brukmanaf96d392003-05-27 22:40:34 +00001155 MI = BuildMI(V9::STXFSRi, 3)
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001156 .addMReg(fsrRegNum).addMReg(DestPtrReg).addSImm(Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001157 break;
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001158 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001159 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001160 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001161 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001162 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001163}
1164
1165
1166//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001167// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001168// register number
1169//---------------------------------------------------------------------------
1170
1171
Vikram S. Advee9327f02002-05-19 15:25:51 +00001172void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001173UltraSparcRegInfo::cpMem2RegMI(std::vector<MachineInstr*>& mvec,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001174 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001175 int Offset,
1176 unsigned DestReg,
1177 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001178 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001179 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001180 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001181 case IntRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001182 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDXi, Offset));
1183 MI = BuildMI(V9::LDXi, 3).addMReg(SrcPtrReg).addSImm(Offset)
Misha Brukman56f4fa12003-05-20 20:32:24 +00001184 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001185 break;
1186
1187 case FPSingleRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001188 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDFi, Offset));
1189 MI = BuildMI(V9::LDFi, 3).addMReg(SrcPtrReg).addSImm(Offset)
Misha Brukman56f4fa12003-05-20 20:32:24 +00001190 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001191 break;
1192
1193 case FPDoubleRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001194 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDDFi, Offset));
1195 MI = BuildMI(V9::LDDFi, 3).addMReg(SrcPtrReg).addSImm(Offset)
1196 .addMReg(DestReg, MOTy::Def);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001197 break;
1198
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001199 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001200 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001201 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1202 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001203
1204 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Misha Brukman56f4fa12003-05-20 20:32:24 +00001205 MI = BuildMI(V9::WRCCR, 2).addMReg(scratchReg).addMReg(DestReg+1,MOTy::Def);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001206 break;
1207
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001208 case FloatCCRegType: {
Misha Brukmanaf96d392003-05-27 22:40:34 +00001209 assert(target.getInstrInfo().constantFitsInImmedField(V9::LDXFSRi, Offset));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001210 unsigned fsrRegNum = getUnifiedRegNum(UltraSparcRegInfo::SpecialRegClassID,
1211 SparcSpecialRegClass::fsr);
Misha Brukmanaf96d392003-05-27 22:40:34 +00001212 MI = BuildMI(V9::LDXFSRi, 3).addMReg(SrcPtrReg).addSImm(Offset)
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001213 .addMReg(fsrRegNum, MOTy::UseAndDef);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001214 break;
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001215 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001216 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001217 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001218 }
Chris Lattner1ebaa902003-01-15 17:47:49 +00001219 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001220}
1221
1222
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001223//---------------------------------------------------------------------------
1224// Generate a copy instruction to copy a value to another. Temporarily
1225// used by PhiElimination code.
1226//---------------------------------------------------------------------------
1227
1228
Vikram S. Advee9327f02002-05-19 15:25:51 +00001229void
Chris Lattner1ebaa902003-01-15 17:47:49 +00001230UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest,
Misha Brukman352f7ac2003-05-21 17:59:06 +00001231 std::vector<MachineInstr*>& mvec) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001232 int RegType = getRegType(Src->getType());
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001233 MachineInstr * MI = NULL;
1234
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001235 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001236 case IntRegType:
Misha Brukmanaf96d392003-05-27 22:40:34 +00001237 MI = BuildMI(V9::ADDr, 3).addReg(Src).addMReg(getZeroRegNum())
Misha Brukman56f4fa12003-05-20 20:32:24 +00001238 .addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001239 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001240 case FPSingleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001241 MI = BuildMI(V9::FMOVS, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001242 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001243 case FPDoubleRegType:
Misha Brukman56f4fa12003-05-20 20:32:24 +00001244 MI = BuildMI(V9::FMOVD, 2).addReg(Src).addRegDef(Dest);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001245 break;
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001246 default:
1247 assert(0 && "Unknow RegType in CpValu2Value");
1248 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001249
Chris Lattner9bebf832002-10-28 20:10:56 +00001250 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001251}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001252
1253
1254
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001255
1256
1257
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001258//----------------------------------------------------------------------------
1259// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001260// a call machine instruction. The caller saving/restoring instructions are
1261// inserted like:
1262//
1263// ** caller saving instructions
1264// other instructions inserted for the call by ColorCallArg
1265// CALL instruction
1266// other instructions inserted for the call ColorCallArg
1267// ** caller restoring instructions
1268//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001269//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001270
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001271
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001272void
Misha Brukman352f7ac2003-05-21 17:59:06 +00001273UltraSparcRegInfo::insertCallerSavingCode
1274(std::vector<MachineInstr*> &instrnsBefore,
1275 std::vector<MachineInstr*> &instrnsAfter,
1276 MachineInstr *CallMI,
1277 const BasicBlock *BB,
1278 PhyRegAlloc &PRA) const
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001279{
Vikram S. Adve879eac92002-10-13 00:05:30 +00001280 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Advee9327f02002-05-19 15:25:51 +00001281
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001282 // has set to record which registers were saved/restored
1283 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001284 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001285
Vikram S. Advee9327f02002-05-19 15:25:51 +00001286 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1287
Vikram S. Advea83804a2003-05-31 07:32:01 +00001288 // Now check if the call has a return value (using argDesc) and if so,
1289 // find the LR of the TmpInstruction representing the return value register.
1290 // (using the last or second-last *implicit operand* of the call MI).
1291 // Insert it to to the PushedRegSet since we must not save that register
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001292 // and restore it after the call.
1293 // We do this because, we look at the LV set *after* the instruction
1294 // to determine, which LRs must be saved across calls. The return value
1295 // of the call is live in this set - but we must not save/restore it.
Vikram S. Advea83804a2003-05-31 07:32:01 +00001296 //
1297 if (const Value *origRetVal = argDesc->getReturnValue()) {
1298 unsigned retValRefNum = (CallMI->getNumImplicitRefs() -
1299 (argDesc->getIndirectFuncPtr()? 1 : 2));
1300 const TmpInstruction* tmpRetVal =
1301 cast<TmpInstruction>(CallMI->getImplicitRef(retValRefNum));
1302 assert(tmpRetVal->getOperand(0) == origRetVal &&
1303 tmpRetVal->getType() == origRetVal->getType() &&
1304 "Wrong implicit ref?");
1305 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( tmpRetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001306 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001307
Chris Lattner5216cc52002-02-04 05:59:25 +00001308 if (RetValLR->hasColor())
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001309 PushedRegSet.insert(getUnifiedRegNum(RetValLR->getRegClassID(),
1310 RetValLR->getColor()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001311 }
1312
Vikram S. Advee9327f02002-05-19 15:25:51 +00001313 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001314 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001315
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001316 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001317 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001318
1319 // get the live range corresponding to live var
1320 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1321
1322 // LR can be null if it is a const since a const
1323 // doesn't have a dominating def - see Assumptions above
1324 if( LR ) {
1325
1326 if( LR->hasColor() ) {
1327
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001328 unsigned RCID = LR->getRegClassID();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001329 unsigned Color = LR->getColor();
1330
1331 if ( isRegVolatile(RCID, Color) ) {
1332
1333 // if the value is in both LV sets (i.e., live before and after
1334 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001335
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001336 unsigned Reg = getUnifiedRegNum(RCID, Color);
1337
1338 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1339
1340 // if we haven't already pushed that register
1341
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001342 unsigned RegType = getRegType(LR);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001343
1344 // Now get two instructions - to push on stack and pop from stack
1345 // and add them to InstrnsBefore and InstrnsAfter of the
1346 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001347 //
Vikram S. Advea83804a2003-05-31 07:32:01 +00001348 int StackOff =
1349 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001350
Misha Brukman352f7ac2003-05-21 17:59:06 +00001351 std::vector<MachineInstr*> AdIBef, AdIAft;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001352
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001353 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001354
1355 // We may need a scratch register to copy the saved value
1356 // to/from memory. This may itself have to insert code to
1357 // free up a scratch register. Any such code should go before
Vikram S. Advea83804a2003-05-31 07:32:01 +00001358 // the save code. The scratch register, if any, is by default
1359 // temporary and not "used" by the instruction unless the
1360 // copy code itself decides to keep the value in the scratch reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001361 int scratchRegType = -1;
1362 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001363 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001364 { // Find a register not live in the LVSet before CallMI
1365 const ValueSet &LVSetBef =
1366 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1367 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1368 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001369 assert(scratchReg != getInvalidRegNum());
Vikram S. Adveaee67012002-07-08 23:23:12 +00001370 }
1371
1372 if (AdIBef.size() > 0)
1373 instrnsBefore.insert(instrnsBefore.end(),
1374 AdIBef.begin(), AdIBef.end());
1375
1376 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1377 scratchReg);
1378
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001379 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001380 instrnsBefore.insert(instrnsBefore.end(),
1381 AdIAft.begin(), AdIAft.end());
1382
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001383 //---- Insert code for popping the reg from the stack ----------
1384
Vikram S. Adveaee67012002-07-08 23:23:12 +00001385 // We may need a scratch register to copy the saved value
1386 // from memory. This may itself have to insert code to
1387 // free up a scratch register. Any such code should go
Vikram S. Advea83804a2003-05-31 07:32:01 +00001388 // after the save code. As above, scratch is not marked "used".
Vikram S. Adveaee67012002-07-08 23:23:12 +00001389 //
1390 scratchRegType = -1;
1391 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001392 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001393 { // Find a register not live in the LVSet after CallMI
1394 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1395 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001396 assert(scratchReg != getInvalidRegNum());
Vikram S. Adveaee67012002-07-08 23:23:12 +00001397 }
1398
1399 if (AdIBef.size() > 0)
1400 instrnsAfter.insert(instrnsAfter.end(),
1401 AdIBef.begin(), AdIBef.end());
1402
1403 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1404 scratchReg);
1405
1406 if (AdIAft.size() > 0)
1407 instrnsAfter.insert(instrnsAfter.end(),
1408 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001409
Chris Lattner7e5ee422002-02-05 04:20:12 +00001410 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001411
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001412 if(DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001413 std::cerr << "\nFor call inst:" << *CallMI;
1414 std::cerr << " -inserted caller saving instrs: Before:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001415 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001416 std::mem_fun(&MachineInstr::dump));
Misha Brukman352f7ac2003-05-21 17:59:06 +00001417 std::cerr << " -and After:\n\t ";
Vikram S. Adveaee67012002-07-08 23:23:12 +00001418 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001419 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001420 }
1421 } // if not already pushed
1422
1423 } // if LR has a volatile color
1424
1425 } // if LR has color
1426
1427 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001428
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001429 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001430}
1431
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001432
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001433//---------------------------------------------------------------------------
1434// Print the register assigned to a LR
1435//---------------------------------------------------------------------------
1436
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001437void UltraSparcRegInfo::printReg(const LiveRange *LR) const {
Chris Lattnerf9fd5912003-01-15 21:14:32 +00001438 unsigned RegClassID = LR->getRegClassID();
Misha Brukman352f7ac2003-05-21 17:59:06 +00001439 std::cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001440
Chris Lattner5216cc52002-02-04 05:59:25 +00001441 if (!LR->hasColor()) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001442 std::cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001443 return;
1444 }
1445
1446 // if a color is found
1447
Misha Brukman352f7ac2003-05-21 17:59:06 +00001448 std::cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001449
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001450 unsigned uRegName = getUnifiedRegNum(RegClassID, LR->getColor());
1451
1452 std::cerr << "[";
1453 std::cerr<< getUnifiedRegName(uRegName);
1454 if (RegClassID == FloatRegClassID && LR->getType() == Type::DoubleTy)
1455 std::cerr << "+" << getUnifiedRegName(uRegName+1);
1456 std::cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001457}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001458
1459//---------------------------------------------------------------------------
1460// This method examines instructions inserted by RegAlloc code before a
1461// machine instruction to detect invalid orders that destroy values before
1462// they are used. If it detects such conditions, it reorders the instructions.
1463//
1464// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001465// instructions inserted by RegAlloc. All such instruction MUST have
1466// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001467//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001468// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1469// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001470//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001471// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001472//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001473// Since instructions are inserted in RegAlloc, this assumes that the
1474// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001475// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001476//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001477// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001478//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001479
1480void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1481 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001482 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001483
1484 /*
1485 Problem: We can have instructions inserted by RegAlloc like
1486 1. add %ox %g0 %oy
1487 2. add %oy %g0 %oz, where z!=x or z==x
1488
1489 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001490
1491 Solution:
1492 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001493
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001494 Algorithm:
1495
1496 do
1497 for each instruction 'DefInst' in the UnOrdVec
1498 for each instruction 'UseInst' that follows the DefInst
1499 if the reg defined by DefInst is used by UseInst
1500 mark DefInst as not movable in this iteration
1501 If DefInst is not marked as not-movable, move DefInst to OrdVec
1502 while all instructions in DefInst are moved to OrdVec
1503
1504 For moving, we call the move2OrdVec(). It checks whether there is a def
1505 in it for the uses in the instruction to be added to OrdVec. If there
1506 are no preceding defs, it just appends the instruction. If there is a
1507 preceding def, it puts two instructions to save the reg on stack before
1508 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001509
1510 */
1511
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001512 bool CouldMoveAll;
1513 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001514
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001515 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001516 CouldMoveAll = true;
Misha Brukman352f7ac2003-05-21 17:59:06 +00001517 std::vector<MachineInstr*>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001518
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001519 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001520
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001521 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001522
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001523 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001524
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001525 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001526
Misha Brukman352f7ac2003-05-21 17:59:06 +00001527 //std::cerr << "\nInst in UnordVec = " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001528
1529 // last operand is the def (unless for a store which has no def reg)
1530 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1531
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001532 if ((DefOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001533 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001534
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001535 // If the operand in DefInst is a def ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001536 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001537
Misha Brukman352f7ac2003-05-21 17:59:06 +00001538 std::vector<MachineInstr*>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001539 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001540
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001541 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1542
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001543 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001544 if( UseInst == NULL) continue;
1545
1546 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001547 MachineOperand& UseOp = UseInst->getOperand(0);
1548
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001549 if (!UseOp.opIsDefOnly() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001550 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001551
1552 // if use is a register ...
1553
1554 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1555
1556 // if Def and this use are the same, it means that this use
1557 // is destroyed by a def before it is used
1558
Misha Brukman352f7ac2003-05-21 17:59:06 +00001559 // std::cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561 DefEqUse = true;
1562 CouldMoveAll = false;
1563 DebugPrint = true;
1564 break;
1565 } // if two registers are equal
1566
1567 } // if use is a register
1568
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001569 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001570
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001571 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001572
1573 // after examining all the instructions that follow the DefInst
1574 // if there are no dependencies, we can move it to the OrdVec
1575
Misha Brukman352f7ac2003-05-21 17:59:06 +00001576 // std::cerr << "Moved to Ord: " << *DefInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001577
1578 moveInst2OrdVec(OrdVec, DefInst, PRA);
1579
1580 //OrdVec.push_back(DefInst);
1581
1582 // mark the pos of DefInst with NULL to indicate that it is
1583 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001584 *DefIt = NULL;
1585 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001586
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001587 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001588
1589 } // for all instructions in the UnordVec
1590
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001591
Chris Lattner5216cc52002-02-04 05:59:25 +00001592 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001593
Chris Lattner070cf772002-06-04 03:09:57 +00001594 if (DebugPrint && DEBUG_RA) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001595 std::cerr << "\nAdded instructions were reordered to:\n";
Chris Lattnerd47aac92002-12-28 20:21:29 +00001596 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001597 std::cerr << *OrdVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001598 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001599}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001600
1601
1602
1603
1604
Misha Brukman352f7ac2003-05-21 17:59:06 +00001605void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr*> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001606 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001607 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001608 MachineOperand& UseOp = UnordInst->getOperand(0);
1609
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001610 if (!UseOp.opIsDefOnly() &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001611 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001612
1613 // for the use of UnordInst, see whether there is a defining instr
1614 // before in the OrdVec
1615 bool DefEqUse = false;
1616
Misha Brukman352f7ac2003-05-21 17:59:06 +00001617 std::vector<MachineInstr*>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001618
1619 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1620
1621 MachineInstr *OrdInst = *OrdIt ;
1622
1623 MachineOperand& DefOp =
1624 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1625
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001626 if( (DefOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
Chris Lattner6a30b022002-10-28 04:45:29 +00001627 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001628
Misha Brukman352f7ac2003-05-21 17:59:06 +00001629 //std::cerr << "\nDefining Ord Inst: " << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001630
1631 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1632
1633 // we are here because there is a preceding def in the OrdVec
1634 // for the use in this intr we are going to insert. This
1635 // happened because the original code was like:
1636 // 1. add %ox %g0 %oy
1637 // 2. add %oy %g0 %ox
1638 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1639 // Now we are processing %ox of 1.
1640 // We have to
1641
Chris Lattnere3aa50d2002-10-28 19:32:07 +00001642 int UReg = DefOp.getMachineRegNum();
1643 int RegType = getRegType(UReg);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001644 MachineInstr *AdIBef, *AdIAft;
1645
Chris Lattnerd47aac92002-12-28 20:21:29 +00001646 int StackOff =
1647 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001648
1649 // Save the UReg (%ox) on stack before it's destroyed
Misha Brukman352f7ac2003-05-21 17:59:06 +00001650 std::vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001651 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Misha Brukman352f7ac2003-05-21 17:59:06 +00001652 for (std::vector<MachineInstr*>::iterator MI=mvec.begin();
Chris Lattnerd47aac92002-12-28 20:21:29 +00001653 MI != mvec.end(); ++MI)
1654 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001655
1656 // Load directly into DReg (%oy)
1657 MachineOperand& DOp=
1658 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
Vikram S. Adve8adb9942003-05-27 00:02:22 +00001659 assert((DOp.opIsDefOnly() || DefOp.opIsDefAndUse()) &&
1660 "Last operand is not the def");
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001661 const int DReg = DOp.getMachineRegNum();
1662
Vikram S. Adveaee67012002-07-08 23:23:12 +00001663 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001664
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001665 if( DEBUG_RA ) {
Misha Brukman352f7ac2003-05-21 17:59:06 +00001666 std::cerr << "\nFixed CIRCULAR references by reordering:";
1667 std::cerr << "\nBefore CIRCULAR Reordering:\n";
1668 std::cerr << *UnordInst;
1669 std::cerr << *OrdInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001670
Misha Brukman352f7ac2003-05-21 17:59:06 +00001671 std::cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001672 for(unsigned i=0; i < OrdVec.size(); i++)
Misha Brukman352f7ac2003-05-21 17:59:06 +00001673 std::cerr << *(OrdVec[i]);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001674 }
1675
1676 // Do not copy the UseInst to OrdVec
1677 DefEqUse = true;
1678 break;
1679
1680 }// if two registers are equal
1681
1682 } // if Def is a register
1683
1684 } // for each instr in OrdVec
1685
Chris Lattner5216cc52002-02-04 05:59:25 +00001686 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001687
1688 // We didn't find a def in the OrdVec, so just append this inst
1689 OrdVec.push_back( UnordInst );
Misha Brukman352f7ac2003-05-21 17:59:06 +00001690 //std::cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001691 }
1692
1693 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001694}