blob: e7889d2d5093b913747197d0637a2da42434a076 [file] [log] [blame]
Chris Lattnered5171e2002-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 Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
Misha Brukmanfce11432002-10-28 00:28:31 +000010#include "llvm/CodeGen/MachineFunction.h"
Chris Lattner1b849be2002-12-28 20:21:29 +000011#include "llvm/CodeGen/MachineFunctionInfo.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner699683c2002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Vikram S. Adve31f78c42002-04-25 04:42:21 +000023#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000024using std::cerr;
Anand Shuklacfb22d32002-06-25 20:55:50 +000025using std::vector;
Chris Lattner20b1ea02001-09-14 03:47:57 +000026
Chris Lattner699683c2002-02-04 05:59:25 +000027UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
Chris Lattnerd0f166a2002-12-29 03:13:05 +000028 : TargetRegInfo(tgt), NumOfIntArgRegs(6),
Chris Lattner699683c2002-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. Adve76ee6f72002-07-08 23:23:12 +000035
Chris Lattner95685682002-08-12 21:25:05 +000036 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner699683c2002-02-04 05:59:25 +000037 "32 Float regs are used for float arg passing");
38}
39
40
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000041// getZeroRegNum - returns the register that contains always zero.
42// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000043//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000044int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner95685682002-08-12 21:25:05 +000045 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
46 SparcIntRegClass::g0);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000047}
Chris Lattner699683c2002-02-04 05:59:25 +000048
49// getCallAddressReg - returns the reg used for pushing the address when a
50// method is called. This can be used for other purposes between calls
51//
52unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner95685682002-08-12 21:25:05 +000053 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
54 SparcIntRegClass::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000055}
56
57// Returns the register containing the return address.
58// It should be made sure that this register contains the return
59// value when a return instruction is reached.
60//
61unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner95685682002-08-12 21:25:05 +000062 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
63 SparcIntRegClass::i7);
64}
65
66// Register get name implementations...
67
68// Int register names in same order as enum in class SparcIntRegClass
69static const char * const IntRegNames[] = {
70 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
71 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
72 "i0", "i1", "i2", "i3", "i4", "i5",
73 "i6", "i7",
74 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
75 "o6"
76};
77
78const char * const SparcIntRegClass::getRegName(unsigned reg) {
79 assert(reg < NumOfAllRegs);
80 return IntRegNames[reg];
81}
82
83static const char * const FloatRegNames[] = {
84 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
85 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
86 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
87 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
88 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
89 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
90 "f60", "f61", "f62", "f63"
91};
92
93const char * const SparcFloatRegClass::getRegName(unsigned reg) {
94 assert (reg < NumOfAllRegs);
95 return FloatRegNames[reg];
96}
97
98
99static const char * const IntCCRegNames[] = {
100 "xcc", "ccr"
101};
102
103const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
104 assert(reg < 2);
105 return IntCCRegNames[reg];
106}
107
108static const char * const FloatCCRegNames[] = {
109 "fcc0", "fcc1", "fcc2", "fcc3"
110};
111
112const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
113 assert (reg < 4);
114 return FloatCCRegNames[reg];
Chris Lattner699683c2002-02-04 05:59:25 +0000115}
116
117// given the unified register number, this gives the name
118// for generating assembly code or debugging.
119//
Chris Lattner95685682002-08-12 21:25:05 +0000120const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner699683c2002-02-04 05:59:25 +0000121 if( reg < 32 )
Chris Lattner95685682002-08-12 21:25:05 +0000122 return SparcIntRegClass::getRegName(reg);
Chris Lattner699683c2002-02-04 05:59:25 +0000123 else if ( reg < (64 + 32) )
Chris Lattner95685682002-08-12 21:25:05 +0000124 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner699683c2002-02-04 05:59:25 +0000125 else if( reg < (64+32+4) )
Chris Lattner95685682002-08-12 21:25:05 +0000126 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner699683c2002-02-04 05:59:25 +0000127 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner95685682002-08-12 21:25:05 +0000128 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner699683c2002-02-04 05:59:25 +0000129 else if (reg== InvalidRegNum) //****** TODO: Remove */
130 return "<*NoReg*>";
131 else
132 assert(0 && "Invalid register number");
133 return "";
134}
135
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000136// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +0000137unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner95685682002-08-12 21:25:05 +0000138 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
139 SparcIntRegClass::i6);
Chris Lattner699683c2002-02-04 05:59:25 +0000140}
141
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000142// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +0000143unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner95685682002-08-12 21:25:05 +0000144 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
145 SparcIntRegClass::o6);
Chris Lattner699683c2002-02-04 05:59:25 +0000146}
147
148
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000149//---------------------------------------------------------------------------
150// Finds whether a call is an indirect call
151//---------------------------------------------------------------------------
152
153inline bool
154isVarArgsFunction(const Type *funcType) {
155 return cast<FunctionType>(cast<PointerType>(funcType)
156 ->getElementType())->isVarArg();
157}
158
159inline bool
160isVarArgsCall(const MachineInstr *CallMI) {
161 Value* callee = CallMI->getOperand(0).getVRegValue();
162 // const Type* funcType = isa<Function>(callee)? callee->getType()
163 // : cast<PointerType>(callee->getType())->getElementType();
164 const Type* funcType = callee->getType();
165 return isVarArgsFunction(funcType);
166}
167
168
169// Get the register number for the specified integer arg#,
170// assuming there are argNum total args, intArgNum int args,
171// and fpArgNum FP args preceding (and not including) this one.
172// Use INT regs for FP args if this is a varargs call.
173//
174// Return value:
175// InvalidRegNum, if there is no int register available for the arg.
176// regNum, otherwise (this is NOT the unified reg. num).
177//
178inline int
179UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
180 unsigned argNo,
181 unsigned intArgNo, unsigned fpArgNo,
182 unsigned& regClassId) const
183{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000184 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000185 if (argNo >= NumOfIntArgRegs)
186 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000187 else
Chris Lattner95685682002-08-12 21:25:05 +0000188 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000189}
190
191// Get the register number for the specified FP arg#,
192// assuming there are argNum total args, intArgNum int args,
193// and fpArgNum FP args preceding (and not including) this one.
194// Use INT regs for FP args if this is a varargs call.
195//
196// Return value:
197// InvalidRegNum, if there is no int register available for the arg.
198// regNum, otherwise (this is NOT the unified reg. num).
199//
200inline int
201UltraSparcRegInfo::regNumForFPArg(unsigned regType,
202 bool inCallee, bool isVarArgsCall,
203 unsigned argNo,
204 unsigned intArgNo, unsigned fpArgNo,
205 unsigned& regClassId) const
206{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000207 if (isVarArgsCall)
208 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
209 regClassId);
210 else
211 {
212 regClassId = FloatRegClassID;
213 if (regType == FPSingleRegType)
214 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner95685682002-08-12 21:25:05 +0000215 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000216 else if (regType == FPDoubleRegType)
217 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner95685682002-08-12 21:25:05 +0000218 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000219 else
220 assert(0 && "Illegal FP register type");
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000221 return 0;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000222 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000223}
224
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000225
226//---------------------------------------------------------------------------
227// Finds the return address of a call sparc specific call instruction
228//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000229
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000230// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000231// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000232//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000233int UltraSparcRegInfo::getRegType(unsigned regClassID,
234 const Type* type) const {
235 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000236 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000237 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000238 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000239 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000240 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000241 return FPDoubleRegType;
242 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000243 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000244 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000245 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000246 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000247 }
248}
249
Vikram S. Adve242a8082002-05-19 15:25:51 +0000250int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
251 return getRegType(LR->getRegClass()->getID(), LR->getType());
252}
253
Chris Lattner699683c2002-02-04 05:59:25 +0000254int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000255 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000256}
257
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000258int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
259 if (unifiedRegNum < 32)
Chris Lattner699683c2002-02-04 05:59:25 +0000260 return IntRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000261 else if (unifiedRegNum < (32 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000262 return FPSingleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000263 else if (unifiedRegNum < (64 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000264 return FPDoubleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000265 else if (unifiedRegNum < (64+32+4))
Chris Lattner699683c2002-02-04 05:59:25 +0000266 return FloatCCRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000267 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner699683c2002-02-04 05:59:25 +0000268 return IntCCRegType;
269 else
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000270 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000271 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000272}
273
274
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000275// To find the register class used for a specified Type
276//
277unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000278 bool isCCReg) const {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000279 Type::PrimitiveID ty = type->getPrimitiveID();
280 unsigned res;
281
282 // FIXME: Comparing types like this isn't very safe...
283 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
284 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
285 res = IntRegClassID; // sparc int reg (ty=0: void)
286 else if (ty <= Type::DoubleTyID)
287 res = FloatRegClassID; // sparc float reg class
288 else {
289 //std::cerr << "TypeID: " << ty << "\n";
290 assert(0 && "Cannot resolve register class for type");
291 return 0;
292 }
293
294 if(isCCReg)
295 return res + 2; // corresponidng condition code regiser
296 else
297 return res;
298}
299
300// To find the register class to which a specified register belongs
301//
302unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
303 unsigned classId = 0;
304 (void) getClassRegNum(unifiedRegNum, classId);
305 return classId;
306}
307
308unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
309 switch(regType) {
310 case IntRegType: return IntRegClassID;
311 case FPSingleRegType:
312 case FPDoubleRegType: return FloatRegClassID;
313 case IntCCRegType: return IntCCRegClassID;
314 case FloatCCRegType: return FloatCCRegClassID;
315 default:
316 assert(0 && "Invalid register type in getRegClassIDOfRegType");
317 return 0;
318 }
319}
320
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000321//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000322// Suggests a register for the ret address in the RET machine instruction.
323// We always suggest %i7 by convention.
324//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000325void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000326 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000327
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000328 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000329
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000330 // return address is always mapped to i7 so set it immediately
331 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner95685682002-08-12 21:25:05 +0000332 SparcIntRegClass::i7));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000333
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000334 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000335 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000336 // we have to test later whether it received the suggested color.
337 // In that case, a LR has to be created at the start of method.
338 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000339
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000340 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000341 // const Value *RetAddrVal = MO.getVRegValue();
342 // assert( RetAddrVal && "LR for ret address must be created at start");
343 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
344 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000345 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000346}
347
348
349//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000350// Suggests a register for the ret address in the JMPL/CALL machine instr.
351// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000352//---------------------------------------------------------------------------
Vikram S. Adve87817652002-09-28 16:59:05 +0000353void
354UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
355 LiveRangeInfo& LRI) const
356{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000357 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
358 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve87817652002-09-28 16:59:05 +0000359 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000360
Vikram S. Adve87817652002-09-28 16:59:05 +0000361 // A LR must already exist for the return address.
362 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
363 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
364
365 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
366 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
367}
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000368
369
Ruchira Sasanka91442282001-09-30 23:16:47 +0000370
371//---------------------------------------------------------------------------
372// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000373// According to the Sparc ABI, the first 6 incoming args are in
374// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000375// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000376// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000377//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000378void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000379 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000380{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000381 // check if this is a varArgs function. needed for choosing regs.
382 bool isVarArgs = isVarArgsFunction(Meth->getType());
383
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000384 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000385 unsigned argNo=0, intArgNo=0, fpArgNo=0;
386 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
387 I != E; ++I, ++argNo) {
388 // get the LR of arg
389 LiveRange *LR = LRI.getLiveRangeForValue(I);
390 assert(LR && "No live range found for method arg");
391
392 unsigned regType = getRegType(LR);
393 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
394
395 int regNum = (regType == IntRegType)
396 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
397 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
398 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
399 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
400
401 if(regNum != InvalidRegNum)
402 LR->setSuggestedColor(regNum);
403 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000404}
405
Ruchira Sasanka91442282001-09-30 23:16:47 +0000406
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000407//---------------------------------------------------------------------------
408// This method is called after graph coloring to move incoming args to
409// the correct hardware registers if they did not receive the correct
410// (suggested) color through graph coloring.
411//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000412void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000413 LiveRangeInfo &LRI,
414 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000415
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000416 // check if this is a varArgs function. needed for choosing regs.
417 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000418 MachineInstr *AdMI;
419
Ruchira Sasanka91442282001-09-30 23:16:47 +0000420 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000421 // for each argument. count INT and FP arguments separately.
422 unsigned argNo=0, intArgNo=0, fpArgNo=0;
423 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
424 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000425 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000426 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000427 assert( LR && "No live range found for method arg");
428
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000429 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000430 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000431
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000432 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000433 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000434 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000435 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000436 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000437 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
438
439 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000440 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
441 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
442 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
443 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000444
445 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000446 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000447 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000448 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000449
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000450 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000452 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
453
454 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000455 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000456 if( UniLRReg == UniArgReg )
457 continue;
458
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000459 // We are here because the LR did not receive the suggested
460 // but LR received another register.
461 // Now we have to copy the %i reg (or stack pos of arg)
462 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000463
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000464 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000465 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000466 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000467 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000468 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000469 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000470
471 // It is a variable argument call: the float reg must go in a %o reg.
472 // We have to move an int reg to a float reg via memory.
473 //
474 assert(isVarArgs &&
475 RegClassID == FloatRegClassID &&
476 regClassIDOfArgReg == IntRegClassID &&
477 "This should only be an Int register for an FP argument");
478
Chris Lattner1b849be2002-12-28 20:21:29 +0000479 int TmpOff = MachineFunction::get(Meth).getInfo()->pushTempValue(
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000480 getSpilledRegSize(regType));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000481 cpReg2MemMI(FirstAI->InstrnsBefore,
482 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000483
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000484 cpMem2RegMI(FirstAI->InstrnsBefore,
485 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000486 }
487 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000488 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000489 }
490 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000491 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000492
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000493 // Now the arg is coming on stack. Since the LR recieved a register,
494 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000495 //
Chris Lattner1b849be2002-12-28 20:21:29 +0000496 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000497 int offsetFromFP =
Misha Brukmanfce11432002-10-28 00:28:31 +0000498 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000499 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000500
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000501 cpMem2RegMI(FirstAI->InstrnsBefore,
502 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000503 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000504
505 } // if LR received a color
506
507 else {
508
509 // Now, the LR did not receive a color. But it has a stack offset for
510 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000511 // So, if the arg is coming in UniArgReg register, we can just move
512 // that on to the stack pos of LR
513
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000514 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000515
516 if( regClassIDOfArgReg != RegClassID ) {
517 assert(0 &&
518 "FP arguments to a varargs function should be explicitly "
519 "copied to/from int registers by instruction selection!");
520
521 // It must be a float arg for a variable argument call, which
522 // must come in a %o reg. Move the int reg to the stack.
523 //
524 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
525 "This should only be an Int register for an FP argument");
526
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000527 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
528 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000529 }
530 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000531 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
532 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000533 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000534 }
535
536 else {
537
538 // Now the arg is coming on stack. Since the LR did NOT
539 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000540 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000541 // since this method is called before any other method that makes
542 // uses of the stack pos of the LR (e.g., updateMachineInstr)
543
Chris Lattner1b849be2002-12-28 20:21:29 +0000544 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000545 int offsetFromFP =
Misha Brukmanfce11432002-10-28 00:28:31 +0000546 frameInfo.getIncomingArgOffset(MachineFunction::get(Meth),
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000547 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000548
549 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000550 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000551
552 }
553
Ruchira Sasanka91442282001-09-30 23:16:47 +0000554 } // for each incoming argument
555
556}
557
Chris Lattner20b1ea02001-09-14 03:47:57 +0000558
559
Ruchira Sasanka91442282001-09-30 23:16:47 +0000560//---------------------------------------------------------------------------
561// This method is called before graph coloring to suggest colors to the
562// outgoing call args and the return value of the call.
563//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000564void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve87817652002-09-28 16:59:05 +0000565 LiveRangeInfo& LRI) const {
Vikram S. Advec654c782002-10-13 00:05:30 +0000566 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000567
Vikram S. Adve242a8082002-05-19 15:25:51 +0000568 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000569
Vikram S. Adve87817652002-09-28 16:59:05 +0000570 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000571
Vikram S. Adve87817652002-09-28 16:59:05 +0000572 // First color the return value of the call instruction, if any.
573 // The return value will be in %o0 if the value is an integer type,
574 // or in %f0 if the value is a float type.
575 //
576 if (const Value *RetVal = argDesc->getReturnValue()) {
577 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
578 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000579
Vikram S. Adve87817652002-09-28 16:59:05 +0000580 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000581
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000582 // now suggest a register depending on the register class of ret arg
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000583 if( RegClassID == IntRegClassID )
Chris Lattner95685682002-08-12 21:25:05 +0000584 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000585 else if (RegClassID == FloatRegClassID )
Chris Lattner95685682002-08-12 21:25:05 +0000586 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000587 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000588 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000589
Ruchira Sasanka91442282001-09-30 23:16:47 +0000590 // Now suggest colors for arguments (operands) of the call instruction.
591 // Colors are suggested only if the arg number is smaller than the
592 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000593 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000594
Vikram S. Adve242a8082002-05-19 15:25:51 +0000595 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000597 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
598 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000599
Vikram S. Adve242a8082002-05-19 15:25:51 +0000600 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000601
602 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000603 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve87817652002-09-28 16:59:05 +0000604 assert (LR && "Must have a LR for all arguments since "
605 "all args (even consts) must be defined before");
606
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000607 unsigned regType = getRegType( LR );
608 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve87817652002-09-28 16:59:05 +0000609
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000610 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000611 // an INT or FP value. Here we ignore whether or not it is a
612 // varargs calls, because FP arguments will be explicitly copied
613 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000614 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000615 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
616 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
617 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
618 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000619
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000620 // If a register could be allocated, use it.
621 // If not, do NOTHING as this will be colored as a normal value.
622 if(regNum != InvalidRegNum)
623 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000624
Vikram S. Adve242a8082002-05-19 15:25:51 +0000625 // Repeat for the second copy of the argument, which would be
626 // an FP argument being passed to a function with no prototype
627 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
628 if (argCopy != NULL)
629 {
Chris Lattner0c4e8862002-09-03 01:08:28 +0000630 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Adve242a8082002-05-19 15:25:51 +0000631 && "Must be passing copy of FP argument in int register");
632 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
633 argNo, intArgNo, fpArgNo-1,
634 regClassIDOfArgReg);
635 assert(copyRegNum != InvalidRegNum);
636 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
637 copyLR->setSuggestedColor(copyRegNum);
638 }
639
Ruchira Sasanka91442282001-09-30 23:16:47 +0000640 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000641
Chris Lattner20b1ea02001-09-14 03:47:57 +0000642}
643
644
Ruchira Sasanka91442282001-09-30 23:16:47 +0000645//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000646// Helper method for UltraSparcRegInfo::colorCallArgs().
647//---------------------------------------------------------------------------
648
649void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000650UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000651 AddedInstrns *CallAI,
652 PhyRegAlloc &PRA, LiveRange* LR,
653 unsigned regType, unsigned RegClassID,
Chris Lattner1b849be2002-12-28 20:21:29 +0000654 int UniArgRegOrNone, unsigned argNo,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000655 std::vector<MachineInstr *>& AddedInstrnsBefore)
656 const
657{
658 MachineInstr *AdMI;
659 bool isArgInReg = false;
660 unsigned UniArgReg = MAXINT; // unused unless initialized below
661 if (UniArgRegOrNone != InvalidRegNum)
662 {
663 isArgInReg = true;
664 UniArgReg = (unsigned) UniArgRegOrNone;
Chris Lattner27a08932002-10-22 23:16:21 +0000665 CallMI->insertUsedReg(UniArgReg); // mark the reg as used
Vikram S. Adve242a8082002-05-19 15:25:51 +0000666 }
667
668 if (LR->hasColor()) {
669 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
670
671 // if LR received the correct color, nothing to do
672 if( isArgInReg && UniArgReg == UniLRReg )
673 return;
674
675 // The LR is allocated to a register UniLRReg and must be copied
676 // to UniArgReg or to the stack slot.
677 //
678 if( isArgInReg ) {
679 // Copy UniLRReg to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000680 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000681 }
682 else {
683 // Copy UniLRReg to the stack to pass the arg on stack.
Chris Lattner1b849be2002-12-28 20:21:29 +0000684 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattner4e3be2f2002-10-28 19:32:07 +0000685 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000686 cpReg2MemMI(CallAI->InstrnsBefore,
687 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000688 }
689
690 } else { // LR is not colored (i.e., spilled)
691
692 if( isArgInReg ) {
693 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000694 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
695 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000696 // Now add the instruction
697 }
698
699 else {
700 // Now, we have to pass the arg on stack. Since LR also did NOT
701 // receive a register we have to move an argument in memory to
702 // outgoing parameter on stack.
703 // Use TReg to load and store the value.
704 // Use TmpOff to save TReg, since that may have a live value.
705 //
706 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Chris Lattner1b849be2002-12-28 20:21:29 +0000707 int TmpOff = PRA.MF.getInfo()->
708 pushTempValue(getSpilledRegSize(getRegType(LR)));
709 const TargetFrameInfo& frameInfo = target.getFrameInfo();
Chris Lattner4e3be2f2002-10-28 19:32:07 +0000710 int argOffset = frameInfo.getOutgoingArgOffset(PRA.MF, argNo);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000711
712 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
713
714 // Sequence:
715 // (1) Save TReg on stack
716 // (2) Load LR value into TReg from stack pos of LR
717 // (3) Store Treg on outgoing Arg pos on stack
718 // (4) Load the old value of TReg from stack to TReg (restore it)
719 //
720 // OPTIMIZE THIS:
721 // When reverse pointers in MahineInstr are introduced:
722 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
723 // needed only if this fails. Currently, we cannot call the
724 // above method since we cannot find LVSetBefore without the BB
725 //
726 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
727 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000728 cpReg2MemMI(CallAI->InstrnsBefore,
729 TReg, getFramePointer(), TmpOff, regType);
730 cpMem2RegMI(CallAI->InstrnsBefore,
731 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
732 cpReg2MemMI(CallAI->InstrnsBefore,
733 TReg, getStackPointer(), argOffset, regType);
734 cpMem2RegMI(CallAI->InstrnsBefore,
735 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000736 }
737 }
738}
739
740//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000741// After graph coloring, we have call this method to see whehter the return
742// value and the call args received the correct colors. If not, we have
743// to instert copy instructions.
744//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000745
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000746void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000747 LiveRangeInfo &LRI,
748 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000749 PhyRegAlloc &PRA,
750 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000751
Vikram S. Advec654c782002-10-13 00:05:30 +0000752 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000753
Vikram S. Adve242a8082002-05-19 15:25:51 +0000754 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
755
Ruchira Sasanka91442282001-09-30 23:16:47 +0000756 // First color the return value of the call.
757 // If there is a LR for the return value, it means this
758 // method returns a value
759
760 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000761
Vikram S. Adve242a8082002-05-19 15:25:51 +0000762 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000763
Chris Lattner0665a5f2002-02-05 01:43:49 +0000764 if (RetVal) {
765 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000766
Chris Lattner0665a5f2002-02-05 01:43:49 +0000767 if (!RetValLR) {
768 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000769 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000770 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000771
772 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000773 bool recvCorrectColor;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000774 unsigned CorrectCol; // correct color for ret value
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000775 unsigned UniRetReg; // unified number for CorrectCol
776
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000777 if(RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000778 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000779 else if(RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000780 CorrectCol = SparcFloatRegClass::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000781 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000782 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000783 return;
784 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000785
786 // convert to unified number
Chris Lattner95685682002-08-12 21:25:05 +0000787 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000788
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000789 // Mark the register as used by this instruction
Chris Lattner27a08932002-10-22 23:16:21 +0000790 CallMI->insertUsedReg(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000791
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000792 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000793 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
794 : false;
795
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000796 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000797 // put copy instruction
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000798 if( !recvCorrectColor ) {
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000799
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000800 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000801
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000802 if( RetValLR->hasColor() ) {
803
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000804 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000805
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000806 // the return value is coming in UniRetReg but has to go into
807 // the UniRetLRReg
808
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000809 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000810
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000811 } // if LR has color
812 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000813
814 // if the LR did NOT receive a color, we have to move the return
815 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000816
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000817 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
818 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000819 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000820
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000821 } // the LR didn't receive the suggested color
822
823 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000824
825
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000826 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000827 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000828 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000829
Chris Lattner697954c2002-01-20 22:54:45 +0000830 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000831
832 unsigned NumOfCallArgs = argDesc->getNumArgs();
833
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000834 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
835 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000836
Vikram S. Adve242a8082002-05-19 15:25:51 +0000837 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
838
Ruchira Sasanka91442282001-09-30 23:16:47 +0000839 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000840 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000841
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000842 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000843 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000844
Vikram S. Adve242a8082002-05-19 15:25:51 +0000845 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000846 // Also find the correct register the argument must use (UniArgReg)
847 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000848 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000849 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000850 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
851
Vikram S. Adve242a8082002-05-19 15:25:51 +0000852 // Find the register that must be used for this arg, depending on
853 // whether it is an INT or FP value. Here we ignore whether or not it
854 // is a varargs calls, because FP arguments will be explicitly copied
855 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000856 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000857 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
858 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
859 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
860 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000861
862 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000863 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000864 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000865 assert(regClassIDOfArgReg == RegClassID &&
866 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000867 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000868
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000869 // not possible to have a null LR since all args (even consts)
870 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000871 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000872 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000873 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000874 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000875
876 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
877 UniArgReg, argNo, AddedInstrnsBefore);
878
879 // Repeat for the second copy of the argument, which would be
880 // an FP argument being passed to a function with no prototype.
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000881 // It may either be passed as a copy in an integer register
882 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Adve242a8082002-05-19 15:25:51 +0000883 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
884 if (argCopy != NULL)
885 {
Chris Lattner0c4e8862002-09-03 01:08:28 +0000886 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Adve242a8082002-05-19 15:25:51 +0000887 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000888
Vikram S. Adve242a8082002-05-19 15:25:51 +0000889 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
890 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
891
892 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
893 argNo, intArgNo, fpArgNo-1,
894 regClassIDOfArgReg);
895 assert(copyRegNum != InvalidRegNum);
896 assert(regClassIDOfArgReg == copyRegClassID &&
897 "Moving values between reg classes must happen during selection");
898
899 InitializeOutgoingArg(CallMI, CallAI, PRA,
900 LRI.getLiveRangeForValue(argCopy), copyRegType,
901 copyRegClassID, copyRegNum, argNo,
902 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000903 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000904
905 if (regNum != InvalidRegNum &&
906 argDesc->getArgInfo(i).usesStackSlot())
907 {
908 // Pass the argument via the stack in addition to regNum
909 assert(regType != IntRegType && "Passing an integer arg. twice?");
910 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
911 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
912 InvalidRegNum, argNo, AddedInstrnsBefore);
913 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000914 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000915
Vikram S. Adve242a8082002-05-19 15:25:51 +0000916 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000917 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000918 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000919 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner699683c2002-02-04 05:59:25 +0000920 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000921
Chris Lattner699683c2002-02-04 05:59:25 +0000922 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000923 cerr << "\nCalling reorder with instrns: \n";
924 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
925 cerr << *(AddedInstrnsBefore[i]);
926 }
927
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000928 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
929 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
930 && "Dropped some instructions when reordering!");
931
Chris Lattner699683c2002-02-04 05:59:25 +0000932 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000933 cerr << "\nAfter reordering instrns: \n";
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000934 for(unsigned i = 0; i < ReorderedVec.size(); i++)
935 cerr << *ReorderedVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000936 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000937 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000938
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000939 // Now insert caller saving code for this call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000940 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000941 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
942 CallMI, BB, PRA);
943
944 // Then insert the final reordered code for the call arguments.
945 //
946 for(unsigned i=0; i < ReorderedVec.size(); i++)
947 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000948}
949
Ruchira Sasanka91442282001-09-30 23:16:47 +0000950//---------------------------------------------------------------------------
951// This method is called for an LLVM return instruction to identify which
952// values will be returned from this method and to suggest colors.
953//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000954void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000955 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000956
Vikram S. Advec654c782002-10-13 00:05:30 +0000957 assert( (target.getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000958
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000959 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000960
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000961 // if there is an implicit ref, that has to be the ret value
962 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000963
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000964 // The first implicit operand is the return value of a return instr
965 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000966
Ruchira Sasanka91442282001-09-30 23:16:47 +0000967 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000968
Chris Lattner0665a5f2002-02-05 01:43:49 +0000969 if (!LR) {
970 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
971 assert(0 && "No LR for return value of non-void method");
972 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000973
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000974 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000975
Chris Lattner699683c2002-02-04 05:59:25 +0000976 if (RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000977 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000978 else if (RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000979 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000980 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000981}
982
Ruchira Sasanka91442282001-09-30 23:16:47 +0000983
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000984
985//---------------------------------------------------------------------------
986// Colors the return value of a method to %i0 or %f0, if possible. If it is
987// not possilbe to directly color the LR, insert a copy instruction to move
988// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
989// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000990//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000991void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000992 LiveRangeInfo &LRI,
993 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000994
Vikram S. Advec654c782002-10-13 00:05:30 +0000995 assert((target.getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000996
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000997 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000998 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000999
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001000 // The first implicit operand is the return value of a return instr
1001 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001002
Chris Lattner699683c2002-02-04 05:59:25 +00001003 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004
Chris Lattner0665a5f2002-02-05 01:43:49 +00001005 if (!LR) {
1006 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1007 // assert( LR && "No LR for return value of non-void method");
1008 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001009 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001010
Ruchira Sasanka91442282001-09-30 23:16:47 +00001011 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001012 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001013
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001014 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001015 if(RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001016 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001017 else if(RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001018 CorrectCol = SparcFloatRegClass::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001019 else {
Chris Lattner699683c2002-02-04 05:59:25 +00001020 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001021 return;
1022 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001023
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001024 // convert to unified number
Chris Lattner95685682002-08-12 21:25:05 +00001025 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001026
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001027 // Mark the register as used by this instruction
Chris Lattner27a08932002-10-22 23:16:21 +00001028 RetMI->insertUsedReg(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001029
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001030 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001031
Chris Lattner699683c2002-02-04 05:59:25 +00001032 if (LR->hasColor() && LR->getColor() == CorrectCol)
1033 return;
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001034
Chris Lattner699683c2002-02-04 05:59:25 +00001035 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001036
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001037 // We are here because the LR was allocted a regiter
1038 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001039
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001040 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001041
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001042 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001043
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001044 // the LR received UniLRReg but must be colored with UniRetReg
1045 // to pass as the return value
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001046 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001047 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001048 else { // if the LR is spilled
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001049 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1050 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001051 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001052 }
1053
Ruchira Sasanka91442282001-09-30 23:16:47 +00001054 } // if there is a return value
1055
1056}
1057
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001058//---------------------------------------------------------------------------
1059// Check if a specified register type needs a scratch register to be
1060// copied to/from memory. If it does, the reg. type that must be used
1061// for scratch registers is returned in scratchRegType.
1062//
1063// Only the int CC register needs such a scratch register.
1064// The FP CC registers can (and must) be copied directly to/from memory.
1065//---------------------------------------------------------------------------
1066
1067bool
1068UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1069 int& scratchRegType) const
1070{
1071 if (RegType == IntCCRegType)
1072 {
1073 scratchRegType = IntRegType;
1074 return true;
1075 }
1076 return false;
1077}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001078
1079//---------------------------------------------------------------------------
1080// Copy from a register to register. Register number must be the unified
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001081// register number.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001082//---------------------------------------------------------------------------
1083
Vikram S. Adve242a8082002-05-19 15:25:51 +00001084void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001085UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1086 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001087 unsigned DestReg,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001088 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001089 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001090 "Invalid Register");
1091
1092 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001093
Ruchira Sasanka91442282001-09-30 23:16:47 +00001094 switch( RegType ) {
1095
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001096 case IntCCRegType:
Chris Lattner95685682002-08-12 21:25:05 +00001097 if (getRegType(DestReg) == IntRegType)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001098 { // copy intCC reg to int reg
1099 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1100 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1101 }
1102 else
1103 { // copy int reg to intCC reg
1104 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner95685682002-08-12 21:25:05 +00001105 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001106 && "Can only copy CC reg to/from integer reg");
1107 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1108 }
1109 break;
1110
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001111 case FloatCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001112 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Adve242a8082002-05-19 15:25:51 +00001113 break;
1114
1115 case IntRegType:
Chris Lattner95685682002-08-12 21:25:05 +00001116 MI = Create3OperandInstr_Reg(ADD, SrcReg, getZeroRegNum(), DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001117 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001118
Ruchira Sasanka91442282001-09-30 23:16:47 +00001119 case FPSingleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001120 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001121 break;
1122
1123 case FPDoubleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001124 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001125 break;
1126
1127 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001128 assert(0 && "Unknown RegType");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001129 break;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001130 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001131
1132 if (MI)
1133 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001134}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001135
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001136//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001137// Copy from a register to memory (i.e., Store). Register number must
1138// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001139//---------------------------------------------------------------------------
1140
1141
Vikram S. Adve242a8082002-05-19 15:25:51 +00001142void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001143UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1144 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001145 unsigned DestPtrReg,
1146 int Offset, int RegType,
Chris Lattnerb82d97e2002-07-25 06:08:32 +00001147 int scratchReg) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001148 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001149 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001150 case IntRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001151 assert(target.getInstrInfo().constantFitsInImmedField(STX, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001152 MI = new MachineInstr(STX, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001153 MI->SetMachineOperandReg(0, SrcReg);
1154 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001155 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1156 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001157 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001158 break;
1159
1160 case FPSingleRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001161 assert(target.getInstrInfo().constantFitsInImmedField(ST, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001162 MI = new MachineInstr(ST, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001163 MI->SetMachineOperandReg(0, SrcReg);
1164 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001165 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1166 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001167 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001168 break;
1169
1170 case FPDoubleRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001171 assert(target.getInstrInfo().constantFitsInImmedField(STD, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001172 MI = new MachineInstr(STD, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001173 MI->SetMachineOperandReg(0, SrcReg);
1174 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001175 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1176 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001177 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001178 break;
1179
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001180 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001181 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner95685682002-08-12 21:25:05 +00001182 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001183
1184 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1185 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1186 mvec.push_back(MI);
1187
Chris Lattner95685682002-08-12 21:25:05 +00001188 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001189 break;
1190
1191 case FloatCCRegType:
1192 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Advec654c782002-10-13 00:05:30 +00001193 assert(target.getInstrInfo().constantFitsInImmedField(STXFSR, Offset));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001194 MI = new MachineInstr(STXFSR, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001195 MI->SetMachineOperandReg(0, SrcReg);
1196 MI->SetMachineOperandReg(1, DestPtrReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001197 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1198 (int64_t) Offset);
1199 mvec.push_back(MI);
1200 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001201
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001202 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001203 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001204 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001205}
1206
1207
1208//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001209// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001210// register number
1211//---------------------------------------------------------------------------
1212
1213
Vikram S. Adve242a8082002-05-19 15:25:51 +00001214void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001215UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1216 unsigned SrcPtrReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001217 int Offset,
1218 unsigned DestReg,
1219 int RegType,
Chris Lattnerb82d97e2002-07-25 06:08:32 +00001220 int scratchReg) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001221 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001222 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001223 case IntRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001224 assert(target.getInstrInfo().constantFitsInImmedField(LDX, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001225 MI = new MachineInstr(LDX, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001226 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001227 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1228 (int64_t) Offset);
1229 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001230 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001231 break;
1232
1233 case FPSingleRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001234 assert(target.getInstrInfo().constantFitsInImmedField(LD, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001235 MI = new MachineInstr(LD, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001236 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001237 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1238 (int64_t) Offset);
1239 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001240 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001241 break;
1242
1243 case FPDoubleRegType:
Vikram S. Advec654c782002-10-13 00:05:30 +00001244 assert(target.getInstrInfo().constantFitsInImmedField(LDD, Offset));
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001245 MI = new MachineInstr(LDD, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001246 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001247 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1248 (int64_t) Offset);
1249 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001250 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001251 break;
1252
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001253 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001254 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner95685682002-08-12 21:25:05 +00001255 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1256 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001257
1258 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1259 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1260 mvec.push_back(MI);
1261
1262 break;
1263
1264 case FloatCCRegType:
1265 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
Vikram S. Advec654c782002-10-13 00:05:30 +00001266 assert(target.getInstrInfo().constantFitsInImmedField(LDXFSR, Offset));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001267 MI = new MachineInstr(LDXFSR, 3);
Chris Lattner5638bf92002-10-28 19:46:25 +00001268 MI->SetMachineOperandReg(0, SrcPtrReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001269 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1270 (int64_t) Offset);
1271 MI->SetMachineOperandReg(2, DestReg, true);
1272 mvec.push_back(MI);
1273 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001274
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001275 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001276 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001277 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001278}
1279
1280
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001281//---------------------------------------------------------------------------
1282// Generate a copy instruction to copy a value to another. Temporarily
1283// used by PhiElimination code.
1284//---------------------------------------------------------------------------
1285
1286
Vikram S. Adve242a8082002-05-19 15:25:51 +00001287void
1288UltraSparcRegInfo::cpValue2Value(Value *Src,
1289 Value *Dest,
1290 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001291 int RegType = getRegType( Src );
1292
1293 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001294
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001295 MachineInstr * MI = NULL;
1296
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001297 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001298 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001299 MI = new MachineInstr(ADD, 3);
Chris Lattner0fa600d2002-10-28 20:10:56 +00001300 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
Chris Lattner5638bf92002-10-28 19:46:25 +00001301 MI->SetMachineOperandReg(1, getZeroRegNum());
Chris Lattner0fa600d2002-10-28 20:10:56 +00001302 MI->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001303 break;
1304
1305 case FPSingleRegType:
1306 MI = new MachineInstr(FMOVS, 2);
Chris Lattner0fa600d2002-10-28 20:10:56 +00001307 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1308 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001309 break;
1310
1311
1312 case FPDoubleRegType:
1313 MI = new MachineInstr(FMOVD, 2);
Chris Lattner0fa600d2002-10-28 20:10:56 +00001314 MI->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, Src);
1315 MI->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001316 break;
1317
1318 default:
1319 assert(0 && "Unknow RegType in CpValu2Value");
1320 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001321
Chris Lattner0fa600d2002-10-28 20:10:56 +00001322 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001323}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001324
1325
1326
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001327
1328
1329
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001330//----------------------------------------------------------------------------
1331// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001332// a call machine instruction. The caller saving/restoring instructions are
1333// inserted like:
1334//
1335// ** caller saving instructions
1336// other instructions inserted for the call by ColorCallArg
1337// CALL instruction
1338// other instructions inserted for the call ColorCallArg
1339// ** caller restoring instructions
1340//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001341//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001342
Ruchira Sasanka91442282001-09-30 23:16:47 +00001343
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001344void
1345UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1346 vector<MachineInstr*>& instrnsAfter,
1347 MachineInstr *CallMI,
1348 const BasicBlock *BB,
1349 PhyRegAlloc &PRA) const
1350{
Vikram S. Advec654c782002-10-13 00:05:30 +00001351 assert ( (target.getInstrInfo()).isCall(CallMI->getOpCode()) );
Vikram S. Adve242a8082002-05-19 15:25:51 +00001352
Ruchira Sasankabf915522002-01-07 21:03:42 +00001353 // has set to record which registers were saved/restored
1354 //
Chris Lattner09ff1122002-07-24 21:21:32 +00001355 hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001356
Vikram S. Adve242a8082002-05-19 15:25:51 +00001357 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1358
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001359 // Now find the LR of the return value of the call
1360 // The last *implicit operand* is the return value of a call
1361 // Insert it to to he PushedRegSet since we must not save that register
1362 // and restore it after the call.
1363 // We do this because, we look at the LV set *after* the instruction
1364 // to determine, which LRs must be saved across calls. The return value
1365 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001366
Vikram S. Adve242a8082002-05-19 15:25:51 +00001367 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001368
Chris Lattner699683c2002-02-04 05:59:25 +00001369 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001370 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001371 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001372
Chris Lattner699683c2002-02-04 05:59:25 +00001373 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001374 PushedRegSet.insert(
1375 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001376 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001377 }
1378
Vikram S. Adve242a8082002-05-19 15:25:51 +00001379 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001380 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001381
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001382 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001383 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001384
1385 // get the live range corresponding to live var
1386 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1387
1388 // LR can be null if it is a const since a const
1389 // doesn't have a dominating def - see Assumptions above
1390 if( LR ) {
1391
1392 if( LR->hasColor() ) {
1393
1394 unsigned RCID = (LR->getRegClass())->getID();
1395 unsigned Color = LR->getColor();
1396
1397 if ( isRegVolatile(RCID, Color) ) {
1398
1399 // if the value is in both LV sets (i.e., live before and after
1400 // the call machine instruction)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001401
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001402 unsigned Reg = getUnifiedRegNum(RCID, Color);
1403
1404 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1405
1406 // if we haven't already pushed that register
1407
1408 unsigned RegType = getRegType( LR );
1409
1410 // Now get two instructions - to push on stack and pop from stack
1411 // and add them to InstrnsBefore and InstrnsAfter of the
1412 // call instruction
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001413 //
Chris Lattner1b849be2002-12-28 20:21:29 +00001414 int StackOff =
1415 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001416
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001417 vector<MachineInstr*> AdIBef, AdIAft;
1418
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001419 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001420
1421 // We may need a scratch register to copy the saved value
1422 // to/from memory. This may itself have to insert code to
1423 // free up a scratch register. Any such code should go before
1424 // the save code.
1425 int scratchRegType = -1;
1426 int scratchReg = -1;
Chris Lattner95685682002-08-12 21:25:05 +00001427 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001428 { // Find a register not live in the LVSet before CallMI
1429 const ValueSet &LVSetBef =
1430 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1431 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1432 CallMI, AdIBef, AdIAft);
Chris Lattner95685682002-08-12 21:25:05 +00001433 assert(scratchReg != getInvalidRegNum());
Chris Lattner27a08932002-10-22 23:16:21 +00001434 CallMI->insertUsedReg(scratchReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001435 }
1436
1437 if (AdIBef.size() > 0)
1438 instrnsBefore.insert(instrnsBefore.end(),
1439 AdIBef.begin(), AdIBef.end());
1440
1441 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1442 scratchReg);
1443
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001444 if (AdIAft.size() > 0)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001445 instrnsBefore.insert(instrnsBefore.end(),
1446 AdIAft.begin(), AdIAft.end());
1447
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001448 //---- Insert code for popping the reg from the stack ----------
1449
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001450 // We may need a scratch register to copy the saved value
1451 // from memory. This may itself have to insert code to
1452 // free up a scratch register. Any such code should go
1453 // after the save code.
1454 //
1455 scratchRegType = -1;
1456 scratchReg = -1;
Chris Lattner95685682002-08-12 21:25:05 +00001457 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001458 { // Find a register not live in the LVSet after CallMI
1459 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1460 CallMI, AdIBef, AdIAft);
Chris Lattner95685682002-08-12 21:25:05 +00001461 assert(scratchReg != getInvalidRegNum());
Chris Lattner27a08932002-10-22 23:16:21 +00001462 CallMI->insertUsedReg(scratchReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001463 }
1464
1465 if (AdIBef.size() > 0)
1466 instrnsAfter.insert(instrnsAfter.end(),
1467 AdIBef.begin(), AdIBef.end());
1468
1469 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1470 scratchReg);
1471
1472 if (AdIAft.size() > 0)
1473 instrnsAfter.insert(instrnsAfter.end(),
1474 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001475
Chris Lattner748697d2002-02-05 04:20:12 +00001476 PushedRegSet.insert(Reg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001477
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001478 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001479 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001480 cerr << " -inserted caller saving instrs: Before:\n\t ";
1481 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001482 std::mem_fun(&MachineInstr::dump));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001483 cerr << " -and After:\n\t ";
1484 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001485 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001486 }
1487 } // if not already pushed
1488
1489 } // if LR has a volatile color
1490
1491 } // if LR has color
1492
1493 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001494
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001495 } // for each value in the LV set after instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +00001496}
1497
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001498
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001499//---------------------------------------------------------------------------
1500// Print the register assigned to a LR
1501//---------------------------------------------------------------------------
1502
Chris Lattner699683c2002-02-04 05:59:25 +00001503void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001504 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001505 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001506
Chris Lattner699683c2002-02-04 05:59:25 +00001507 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001508 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001509 return;
1510 }
1511
1512 // if a color is found
1513
Chris Lattner1e23ed72001-10-15 18:15:27 +00001514 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001515
Chris Lattner699683c2002-02-04 05:59:25 +00001516 if (RegClassID == IntRegClassID) {
Chris Lattner95685682002-08-12 21:25:05 +00001517 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001518
Chris Lattner699683c2002-02-04 05:59:25 +00001519 } else if (RegClassID == FloatRegClassID) {
Chris Lattner95685682002-08-12 21:25:05 +00001520 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001521 if( LR->getType() == Type::DoubleTy)
Chris Lattner95685682002-08-12 21:25:05 +00001522 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001523 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001524 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001525}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001526
1527//---------------------------------------------------------------------------
1528// This method examines instructions inserted by RegAlloc code before a
1529// machine instruction to detect invalid orders that destroy values before
1530// they are used. If it detects such conditions, it reorders the instructions.
1531//
1532// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001533// instructions inserted by RegAlloc. All such instruction MUST have
1534// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001535//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001536// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1537// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001538//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001539// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001540//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001541// Since instructions are inserted in RegAlloc, this assumes that the
1542// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001543// It also does not consider operands that are both use and def.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001544//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001545// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001546//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001547
1548void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1549 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001550 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001551
1552 /*
1553 Problem: We can have instructions inserted by RegAlloc like
1554 1. add %ox %g0 %oy
1555 2. add %oy %g0 %oz, where z!=x or z==x
1556
1557 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001558
1559 Solution:
1560 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001561
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001562 Algorithm:
1563
1564 do
1565 for each instruction 'DefInst' in the UnOrdVec
1566 for each instruction 'UseInst' that follows the DefInst
1567 if the reg defined by DefInst is used by UseInst
1568 mark DefInst as not movable in this iteration
1569 If DefInst is not marked as not-movable, move DefInst to OrdVec
1570 while all instructions in DefInst are moved to OrdVec
1571
1572 For moving, we call the move2OrdVec(). It checks whether there is a def
1573 in it for the uses in the instruction to be added to OrdVec. If there
1574 are no preceding defs, it just appends the instruction. If there is a
1575 preceding def, it puts two instructions to save the reg on stack before
1576 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001577
1578 */
1579
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001580 bool CouldMoveAll;
1581 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001582
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001583 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001584 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001585 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001586
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001587 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001588
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001589 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001590
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001591 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001592
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001593 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001594
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001595 //cerr << "\nInst in UnordVec = " << *DefInst;
1596
1597 // last operand is the def (unless for a store which has no def reg)
1598 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1599
Chris Lattner133f0792002-10-28 04:45:29 +00001600 if (DefOp.opIsDef() &&
1601 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001602
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001603 // If the operand in DefInst is a def ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001604 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001605
Chris Lattner697954c2002-01-20 22:54:45 +00001606 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001607 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001608
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001609 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1610
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001611 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001612 if( UseInst == NULL) continue;
1613
1614 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001615 MachineOperand& UseOp = UseInst->getOperand(0);
1616
Chris Lattner133f0792002-10-28 04:45:29 +00001617 if (!UseOp.opIsDef() &&
1618 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001619
1620 // if use is a register ...
1621
1622 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1623
1624 // if Def and this use are the same, it means that this use
1625 // is destroyed by a def before it is used
1626
1627 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001628
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001629 DefEqUse = true;
1630 CouldMoveAll = false;
1631 DebugPrint = true;
1632 break;
1633 } // if two registers are equal
1634
1635 } // if use is a register
1636
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001637 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001638
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001639 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001640
1641 // after examining all the instructions that follow the DefInst
1642 // if there are no dependencies, we can move it to the OrdVec
1643
1644 // cerr << "Moved to Ord: " << *DefInst;
1645
1646 moveInst2OrdVec(OrdVec, DefInst, PRA);
1647
1648 //OrdVec.push_back(DefInst);
1649
1650 // mark the pos of DefInst with NULL to indicate that it is
1651 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001652 *DefIt = NULL;
1653 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001654
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001655 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001656
1657 } // for all instructions in the UnordVec
1658
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001659
Chris Lattner699683c2002-02-04 05:59:25 +00001660 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001661
Chris Lattner44014412002-06-04 03:09:57 +00001662 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001663 cerr << "\nAdded instructions were reordered to:\n";
Chris Lattner1b849be2002-12-28 20:21:29 +00001664 for(unsigned i=0; i < OrdVec.size(); i++)
1665 cerr << *OrdVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001666 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001667}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001668
1669
1670
1671
1672
Chris Lattner697954c2002-01-20 22:54:45 +00001673void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001674 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001675 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001676 MachineOperand& UseOp = UnordInst->getOperand(0);
1677
Chris Lattner133f0792002-10-28 04:45:29 +00001678 if (!UseOp.opIsDef() &&
1679 UseOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001680
1681 // for the use of UnordInst, see whether there is a defining instr
1682 // before in the OrdVec
1683 bool DefEqUse = false;
1684
Chris Lattner697954c2002-01-20 22:54:45 +00001685 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001686
1687 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1688
1689 MachineInstr *OrdInst = *OrdIt ;
1690
1691 MachineOperand& DefOp =
1692 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1693
1694 if( DefOp.opIsDef() &&
Chris Lattner133f0792002-10-28 04:45:29 +00001695 DefOp.getType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001696
1697 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1698
1699 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1700
1701 // we are here because there is a preceding def in the OrdVec
1702 // for the use in this intr we are going to insert. This
1703 // happened because the original code was like:
1704 // 1. add %ox %g0 %oy
1705 // 2. add %oy %g0 %ox
1706 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1707 // Now we are processing %ox of 1.
1708 // We have to
1709
Chris Lattner4e3be2f2002-10-28 19:32:07 +00001710 int UReg = DefOp.getMachineRegNum();
1711 int RegType = getRegType(UReg);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001712 MachineInstr *AdIBef, *AdIAft;
1713
Chris Lattner1b849be2002-12-28 20:21:29 +00001714 int StackOff =
1715 PRA.MF.getInfo()->pushTempValue(getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001716
1717 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001718 vector<MachineInstr*> mvec;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001719 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Chris Lattner1b849be2002-12-28 20:21:29 +00001720 for (vector<MachineInstr*>::iterator MI=mvec.begin();
1721 MI != mvec.end(); ++MI)
1722 OrdIt = 1+OrdVec.insert(OrdIt, *MI);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001723
1724 // Load directly into DReg (%oy)
1725 MachineOperand& DOp=
1726 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1727 assert(DOp.opIsDef() && "Last operand is not the def");
1728 const int DReg = DOp.getMachineRegNum();
1729
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001730 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001731
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001732 if( DEBUG_RA ) {
Vikram S. Adveedf3a722002-10-14 16:32:49 +00001733 cerr << "\nFixed CIRCULAR references by reordering:";
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001734 cerr << "\nBefore CIRCULAR Reordering:\n";
1735 cerr << *UnordInst;
1736 cerr << *OrdInst;
1737
1738 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1739 for(unsigned i=0; i < OrdVec.size(); i++)
1740 cerr << *(OrdVec[i]);
1741 }
1742
1743 // Do not copy the UseInst to OrdVec
1744 DefEqUse = true;
1745 break;
1746
1747 }// if two registers are equal
1748
1749 } // if Def is a register
1750
1751 } // for each instr in OrdVec
1752
Chris Lattner699683c2002-02-04 05:59:25 +00001753 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001754
1755 // We didn't find a def in the OrdVec, so just append this inst
1756 OrdVec.push_back( UnordInst );
1757 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1758 }
1759
1760 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001761}