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