blob: d06bba6f3a9b032231dec53ce369402d05588b52 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adveaee67012002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000023#include <iostream>
Vikram S. Advea6d94c92002-04-25 04:42:21 +000024#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000025using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000026using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000027
Chris Lattner5216cc52002-02-04 05:59:25 +000028UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
29 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
30 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
31
32 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
34 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000036
Chris Lattner56e91662002-08-12 21:25:05 +000037 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner5216cc52002-02-04 05:59:25 +000038 "32 Float regs are used for float arg passing");
39}
40
41
Vikram S. Advedb1435f2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000044//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner56e91662002-08-12 21:25:05 +000046 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegClass::g0);
Vikram S. Advedb1435f2002-03-18 03:12:16 +000048}
Chris Lattner5216cc52002-02-04 05:59:25 +000049
50// getCallAddressReg - returns the reg used for pushing the address when a
51// method is called. This can be used for other purposes between calls
52//
53unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000054 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegClass::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000056}
57
58// Returns the register containing the return address.
59// It should be made sure that this register contains the return
60// value when a return instruction is reached.
61//
62unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner56e91662002-08-12 21:25:05 +000063 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegClass::i7);
65}
66
67// Register get name implementations...
68
69// Int register names in same order as enum in class SparcIntRegClass
70static const char * const IntRegNames[] = {
71 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
72 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
73 "i0", "i1", "i2", "i3", "i4", "i5",
74 "i6", "i7",
75 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
76 "o6"
77};
78
79const char * const SparcIntRegClass::getRegName(unsigned reg) {
80 assert(reg < NumOfAllRegs);
81 return IntRegNames[reg];
82}
83
84static const char * const FloatRegNames[] = {
85 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
86 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
87 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
88 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
89 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
90 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
91 "f60", "f61", "f62", "f63"
92};
93
94const char * const SparcFloatRegClass::getRegName(unsigned reg) {
95 assert (reg < NumOfAllRegs);
96 return FloatRegNames[reg];
97}
98
99
100static const char * const IntCCRegNames[] = {
101 "xcc", "ccr"
102};
103
104const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
105 assert(reg < 2);
106 return IntCCRegNames[reg];
107}
108
109static const char * const FloatCCRegNames[] = {
110 "fcc0", "fcc1", "fcc2", "fcc3"
111};
112
113const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
114 assert (reg < 4);
115 return FloatCCRegNames[reg];
Chris Lattner5216cc52002-02-04 05:59:25 +0000116}
117
118// given the unified register number, this gives the name
119// for generating assembly code or debugging.
120//
Chris Lattner56e91662002-08-12 21:25:05 +0000121const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner5216cc52002-02-04 05:59:25 +0000122 if( reg < 32 )
Chris Lattner56e91662002-08-12 21:25:05 +0000123 return SparcIntRegClass::getRegName(reg);
Chris Lattner5216cc52002-02-04 05:59:25 +0000124 else if ( reg < (64 + 32) )
Chris Lattner56e91662002-08-12 21:25:05 +0000125 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner5216cc52002-02-04 05:59:25 +0000126 else if( reg < (64+32+4) )
Chris Lattner56e91662002-08-12 21:25:05 +0000127 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner5216cc52002-02-04 05:59:25 +0000128 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner56e91662002-08-12 21:25:05 +0000129 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner5216cc52002-02-04 05:59:25 +0000130 else if (reg== InvalidRegNum) //****** TODO: Remove */
131 return "<*NoReg*>";
132 else
133 assert(0 && "Invalid register number");
134 return "";
135}
136
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000137// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000138unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000139 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
140 SparcIntRegClass::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000141}
142
Vikram S. Advedb1435f2002-03-18 03:12:16 +0000143// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +0000144unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner56e91662002-08-12 21:25:05 +0000145 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
146 SparcIntRegClass::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +0000147}
148
149
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000150//---------------------------------------------------------------------------
151// Finds whether a call is an indirect call
152//---------------------------------------------------------------------------
153
154inline bool
155isVarArgsFunction(const Type *funcType) {
156 return cast<FunctionType>(cast<PointerType>(funcType)
157 ->getElementType())->isVarArg();
158}
159
160inline bool
161isVarArgsCall(const MachineInstr *CallMI) {
162 Value* callee = CallMI->getOperand(0).getVRegValue();
163 // const Type* funcType = isa<Function>(callee)? callee->getType()
164 // : cast<PointerType>(callee->getType())->getElementType();
165 const Type* funcType = callee->getType();
166 return isVarArgsFunction(funcType);
167}
168
169
170// Get the register number for the specified integer arg#,
171// assuming there are argNum total args, intArgNum int args,
172// and fpArgNum FP args preceding (and not including) this one.
173// Use INT regs for FP args if this is a varargs call.
174//
175// Return value:
176// InvalidRegNum, if there is no int register available for the arg.
177// regNum, otherwise (this is NOT the unified reg. num).
178//
179inline int
180UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
181 unsigned argNo,
182 unsigned intArgNo, unsigned fpArgNo,
183 unsigned& regClassId) const
184{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000185 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000186 if (argNo >= NumOfIntArgRegs)
187 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000188 else
Chris Lattner56e91662002-08-12 21:25:05 +0000189 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000190}
191
192// Get the register number for the specified FP arg#,
193// assuming there are argNum total args, intArgNum int args,
194// and fpArgNum FP args preceding (and not including) this one.
195// Use INT regs for FP args if this is a varargs call.
196//
197// Return value:
198// InvalidRegNum, if there is no int register available for the arg.
199// regNum, otherwise (this is NOT the unified reg. num).
200//
201inline int
202UltraSparcRegInfo::regNumForFPArg(unsigned regType,
203 bool inCallee, bool isVarArgsCall,
204 unsigned argNo,
205 unsigned intArgNo, unsigned fpArgNo,
206 unsigned& regClassId) const
207{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000208 if (isVarArgsCall)
209 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
210 regClassId);
211 else
212 {
213 regClassId = FloatRegClassID;
214 if (regType == FPSingleRegType)
215 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000216 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000217 else if (regType == FPDoubleRegType)
218 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner56e91662002-08-12 21:25:05 +0000219 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000220 else
221 assert(0 && "Illegal FP register type");
Chris Lattner3091e112002-07-25 06:08:32 +0000222 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000223 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000224}
225
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000226
227//---------------------------------------------------------------------------
228// Finds the return address of a call sparc specific call instruction
229//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000230
Vikram S. Adveaee67012002-07-08 23:23:12 +0000231// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000232// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000233//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000234int UltraSparcRegInfo::getRegType(unsigned regClassID,
235 const Type* type) const {
236 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000237 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000238 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000239 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000240 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000241 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000242 return FPDoubleRegType;
243 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000244 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000245 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000246 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000247 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000248 }
249}
250
Vikram S. Advee9327f02002-05-19 15:25:51 +0000251int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
252 return getRegType(LR->getRegClass()->getID(), LR->getType());
253}
254
Chris Lattner5216cc52002-02-04 05:59:25 +0000255int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000256 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000257}
258
Vikram S. Adveaee67012002-07-08 23:23:12 +0000259int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
260 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000261 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000262 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000263 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000264 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000265 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000266 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000267 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000268 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000269 return IntCCRegType;
270 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000271 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000272 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000273}
274
275
Vikram S. Adveaee67012002-07-08 23:23:12 +0000276// To find the register class used for a specified Type
277//
278unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000279 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000280 Type::PrimitiveID ty = type->getPrimitiveID();
281 unsigned res;
282
283 // FIXME: Comparing types like this isn't very safe...
284 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
285 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
286 res = IntRegClassID; // sparc int reg (ty=0: void)
287 else if (ty <= Type::DoubleTyID)
288 res = FloatRegClassID; // sparc float reg class
289 else {
290 //std::cerr << "TypeID: " << ty << "\n";
291 assert(0 && "Cannot resolve register class for type");
292 return 0;
293 }
294
295 if(isCCReg)
296 return res + 2; // corresponidng condition code regiser
297 else
298 return res;
299}
300
301// To find the register class to which a specified register belongs
302//
303unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
304 unsigned classId = 0;
305 (void) getClassRegNum(unifiedRegNum, classId);
306 return classId;
307}
308
309unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
310 switch(regType) {
311 case IntRegType: return IntRegClassID;
312 case FPSingleRegType:
313 case FPDoubleRegType: return FloatRegClassID;
314 case IntCCRegType: return IntCCRegClassID;
315 case FloatCCRegType: return FloatCCRegClassID;
316 default:
317 assert(0 && "Invalid register type in getRegClassIDOfRegType");
318 return 0;
319 }
320}
321
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000322//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000323// Suggests a register for the ret address in the RET machine instruction.
324// We always suggest %i7 by convention.
325//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000326void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000327 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000328
Vikram S. Adveaee67012002-07-08 23:23:12 +0000329 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000330
Vikram S. Adveaee67012002-07-08 23:23:12 +0000331 // return address is always mapped to i7 so set it immediately
332 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner56e91662002-08-12 21:25:05 +0000333 SparcIntRegClass::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000334
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000335 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000336 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000337 // we have to test later whether it received the suggested color.
338 // In that case, a LR has to be created at the start of method.
339 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000340
Vikram S. Adveaee67012002-07-08 23:23:12 +0000341 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000342 // const Value *RetAddrVal = MO.getVRegValue();
343 // assert( RetAddrVal && "LR for ret address must be created at start");
344 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
345 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000346 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000347}
348
349
350//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000351// Suggests a register for the ret address in the JMPL/CALL machine instr.
352// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353//---------------------------------------------------------------------------
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000354void
355UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
356 LiveRangeInfo& LRI) const
357{
Vikram S. Advee9327f02002-05-19 15:25:51 +0000358 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
359 const Value *RetAddrVal = argDesc->getReturnAddrReg();
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000360 assert(RetAddrVal && "INTERNAL ERROR: Return address value is required");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000361
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000362 // A LR must already exist for the return address.
363 LiveRange *RetAddrLR = LRI.getLiveRangeForValue(RetAddrVal);
364 assert(RetAddrLR && "INTERNAL ERROR: No LR for return address of call!");
365
366 unsigned RegClassID = RetAddrLR->getRegClass()->getID();
367 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID, SparcIntRegClass::o7));
368}
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000369
370
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000371
372//---------------------------------------------------------------------------
373// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000374// According to the Sparc ABI, the first 6 incoming args are in
375// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000376// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000377// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000378//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000379void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000380 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000381{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000382 // check if this is a varArgs function. needed for choosing regs.
383 bool isVarArgs = isVarArgsFunction(Meth->getType());
384
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000385 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000386 unsigned argNo=0, intArgNo=0, fpArgNo=0;
387 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
388 I != E; ++I, ++argNo) {
389 // get the LR of arg
390 LiveRange *LR = LRI.getLiveRangeForValue(I);
391 assert(LR && "No live range found for method arg");
392
393 unsigned regType = getRegType(LR);
394 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
395
396 int regNum = (regType == IntRegType)
397 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
398 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
399 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
400 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
401
402 if(regNum != InvalidRegNum)
403 LR->setSuggestedColor(regNum);
404 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000405}
406
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000407
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000408//---------------------------------------------------------------------------
409// This method is called after graph coloring to move incoming args to
410// the correct hardware registers if they did not receive the correct
411// (suggested) color through graph coloring.
412//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000413void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000414 LiveRangeInfo &LRI,
415 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000416
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000417 // check if this is a varArgs function. needed for choosing regs.
418 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000419 MachineInstr *AdMI;
420
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000421 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000422 // for each argument. count INT and FP arguments separately.
423 unsigned argNo=0, intArgNo=0, fpArgNo=0;
424 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
425 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000426 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000427 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000428 assert( LR && "No live range found for method arg");
429
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000430 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000431 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000432
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000433 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000434 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000435 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000436 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000437 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000438 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
439
440 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000441 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
442 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
443 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
444 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000445
446 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000447 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000448 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000449 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000450
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000451 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000452
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000453 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
454
455 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000456 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000457 if( UniLRReg == UniArgReg )
458 continue;
459
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000460 // We are here because the LR did not receive the suggested
461 // but LR received another register.
462 // Now we have to copy the %i reg (or stack pos of arg)
463 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000464
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000465 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000466 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000467 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000468 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000469 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000470 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000471
472 // It is a variable argument call: the float reg must go in a %o reg.
473 // We have to move an int reg to a float reg via memory.
474 //
475 assert(isVarArgs &&
476 RegClassID == FloatRegClassID &&
477 regClassIDOfArgReg == IntRegClassID &&
478 "This should only be an Int register for an FP argument");
479
480 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
481 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000482 cpReg2MemMI(FirstAI->InstrnsBefore,
483 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000484
Vikram S. Adveaee67012002-07-08 23:23:12 +0000485 cpMem2RegMI(FirstAI->InstrnsBefore,
486 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000487 }
488 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000489 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000490 }
491 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000492 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000493
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000494 // Now the arg is coming on stack. Since the LR recieved a register,
495 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000496 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000497 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000498 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000499 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
500 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000501
Vikram S. Adveaee67012002-07-08 23:23:12 +0000502 cpMem2RegMI(FirstAI->InstrnsBefore,
503 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000504 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000505
506 } // if LR received a color
507
508 else {
509
510 // Now, the LR did not receive a color. But it has a stack offset for
511 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000512 // So, if the arg is coming in UniArgReg register, we can just move
513 // that on to the stack pos of LR
514
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000515 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000516
517 if( regClassIDOfArgReg != RegClassID ) {
518 assert(0 &&
519 "FP arguments to a varargs function should be explicitly "
520 "copied to/from int registers by instruction selection!");
521
522 // It must be a float arg for a variable argument call, which
523 // must come in a %o reg. Move the int reg to the stack.
524 //
525 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
526 "This should only be an Int register for an FP argument");
527
Vikram S. Adveaee67012002-07-08 23:23:12 +0000528 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
529 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000530 }
531 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000532 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
533 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000534 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000535 }
536
537 else {
538
539 // Now the arg is coming on stack. Since the LR did NOT
540 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000541 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000542 // since this method is called before any other method that makes
543 // uses of the stack pos of the LR (e.g., updateMachineInstr)
544
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000545 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000546 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000547 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
548 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000549
550 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000551 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000552
553 }
554
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000555 } // for each incoming argument
556
557}
558
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000559
560
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000561//---------------------------------------------------------------------------
562// This method is called before graph coloring to suggest colors to the
563// outgoing call args and the return value of the call.
564//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000565void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000566 LiveRangeInfo& LRI) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000567 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000568
Vikram S. Advee9327f02002-05-19 15:25:51 +0000569 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000570
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000571 suggestReg4CallAddr(CallMI, LRI);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000572
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000573 // First color the return value of the call instruction, if any.
574 // The return value will be in %o0 if the value is an integer type,
575 // or in %f0 if the value is a float type.
576 //
577 if (const Value *RetVal = argDesc->getReturnValue()) {
578 LiveRange *RetValLR = LRI.getLiveRangeForValue(RetVal);
579 assert(RetValLR && "No LR for return Value of call!");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000580
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000581 unsigned RegClassID = RetValLR->getRegClass()->getID();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000582
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000583 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000584 if( RegClassID == IntRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000585 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000586 else if (RegClassID == FloatRegClassID )
Chris Lattner56e91662002-08-12 21:25:05 +0000587 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000588 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000589 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000590
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000591 // Now suggest colors for arguments (operands) of the call instruction.
592 // Colors are suggested only if the arg number is smaller than the
593 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000594 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000595
Vikram S. Advee9327f02002-05-19 15:25:51 +0000596 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000597
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000598 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
599 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000600
Vikram S. Advee9327f02002-05-19 15:25:51 +0000601 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000602
603 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000604 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000605 assert (LR && "Must have a LR for all arguments since "
606 "all args (even consts) must be defined before");
607
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000608 unsigned regType = getRegType( LR );
609 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve6d1036d2002-09-28 16:59:05 +0000610
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000611 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000612 // an INT or FP value. Here we ignore whether or not it is a
613 // varargs calls, because FP arguments will be explicitly copied
614 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000615 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000616 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
617 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
618 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
619 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000620
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000621 // If a register could be allocated, use it.
622 // If not, do NOTHING as this will be colored as a normal value.
623 if(regNum != InvalidRegNum)
624 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000625
Vikram S. Advee9327f02002-05-19 15:25:51 +0000626 // Repeat for the second copy of the argument, which would be
627 // an FP argument being passed to a function with no prototype
628 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
629 if (argCopy != NULL)
630 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000631 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000632 && "Must be passing copy of FP argument in int register");
633 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
634 argNo, intArgNo, fpArgNo-1,
635 regClassIDOfArgReg);
636 assert(copyRegNum != InvalidRegNum);
637 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
638 copyLR->setSuggestedColor(copyRegNum);
639 }
640
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000641 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000642
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000643}
644
645
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000646//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000647// Helper method for UltraSparcRegInfo::colorCallArgs().
648//---------------------------------------------------------------------------
649
650void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000651UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000652 AddedInstrns *CallAI,
653 PhyRegAlloc &PRA, LiveRange* LR,
654 unsigned regType, unsigned RegClassID,
655 int UniArgRegOrNone, unsigned int argNo,
656 std::vector<MachineInstr *>& AddedInstrnsBefore)
657 const
658{
659 MachineInstr *AdMI;
660 bool isArgInReg = false;
661 unsigned UniArgReg = MAXINT; // unused unless initialized below
662 if (UniArgRegOrNone != InvalidRegNum)
663 {
664 isArgInReg = true;
665 UniArgReg = (unsigned) UniArgRegOrNone;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000666 CallMI->getRegsUsed().insert(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000667 }
668
669 if (LR->hasColor()) {
670 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
671
672 // if LR received the correct color, nothing to do
673 if( isArgInReg && UniArgReg == UniLRReg )
674 return;
675
676 // The LR is allocated to a register UniLRReg and must be copied
677 // to UniArgReg or to the stack slot.
678 //
679 if( isArgInReg ) {
680 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000681 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000682 }
683 else {
684 // Copy UniLRReg to the stack to pass the arg on stack.
685 const MachineFrameInfo& frameInfo = target.getFrameInfo();
686 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000687 cpReg2MemMI(CallAI->InstrnsBefore,
688 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000689 }
690
691 } else { // LR is not colored (i.e., spilled)
692
693 if( isArgInReg ) {
694 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000695 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
696 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000697 // Now add the instruction
698 }
699
700 else {
701 // Now, we have to pass the arg on stack. Since LR also did NOT
702 // receive a register we have to move an argument in memory to
703 // outgoing parameter on stack.
704 // Use TReg to load and store the value.
705 // Use TmpOff to save TReg, since that may have a live value.
706 //
707 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
708 int TmpOff = PRA.mcInfo.pushTempValue(target,
709 getSpilledRegSize(getRegType(LR)));
710 const MachineFrameInfo& frameInfo = target.getFrameInfo();
711 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
712
713 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
714
715 // Sequence:
716 // (1) Save TReg on stack
717 // (2) Load LR value into TReg from stack pos of LR
718 // (3) Store Treg on outgoing Arg pos on stack
719 // (4) Load the old value of TReg from stack to TReg (restore it)
720 //
721 // OPTIMIZE THIS:
722 // When reverse pointers in MahineInstr are introduced:
723 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
724 // needed only if this fails. Currently, we cannot call the
725 // above method since we cannot find LVSetBefore without the BB
726 //
727 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
728 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000729 cpReg2MemMI(CallAI->InstrnsBefore,
730 TReg, getFramePointer(), TmpOff, regType);
731 cpMem2RegMI(CallAI->InstrnsBefore,
732 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
733 cpReg2MemMI(CallAI->InstrnsBefore,
734 TReg, getStackPointer(), argOffset, regType);
735 cpMem2RegMI(CallAI->InstrnsBefore,
736 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000737 }
738 }
739}
740
741//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000742// After graph coloring, we have call this method to see whehter the return
743// value and the call args received the correct colors. If not, we have
744// to instert copy instructions.
745//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000746
Vikram S. Adveaee67012002-07-08 23:23:12 +0000747void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000748 LiveRangeInfo &LRI,
749 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000750 PhyRegAlloc &PRA,
751 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000752
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000753 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
754
Vikram S. Advee9327f02002-05-19 15:25:51 +0000755 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
756
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000757 // First color the return value of the call.
758 // If there is a LR for the return value, it means this
759 // method returns a value
760
761 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000762
Vikram S. Advee9327f02002-05-19 15:25:51 +0000763 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000764
Chris Lattner30e8fb62002-02-05 01:43:49 +0000765 if (RetVal) {
766 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000767
Chris Lattner30e8fb62002-02-05 01:43:49 +0000768 if (!RetValLR) {
769 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000770 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000771 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000772
773 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000774 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000775 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000776 unsigned UniRetReg; // unified number for CorrectCol
777
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000778 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000779 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000780 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000781 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000782 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000783 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000784 return;
785 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000786
787 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +0000788 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000789
Vikram S. Adveaee67012002-07-08 23:23:12 +0000790 // Mark the register as used by this instruction
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000791 CallMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000792
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000793 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000794 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
795 : false;
796
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000797 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000798 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000799 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000800
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000801 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000802
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000803 if( RetValLR->hasColor() ) {
804
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000805 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000806
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000807 // the return value is coming in UniRetReg but has to go into
808 // the UniRetLRReg
809
Vikram S. Adveaee67012002-07-08 23:23:12 +0000810 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000811
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000812 } // if LR has color
813 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000814
815 // if the LR did NOT receive a color, we have to move the return
816 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000817
Vikram S. Adveaee67012002-07-08 23:23:12 +0000818 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
819 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000820 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000821
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000822 } // the LR didn't receive the suggested color
823
824 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000825
826
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000827 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000828 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000829 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000830
Chris Lattner7f74a562002-01-20 22:54:45 +0000831 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000832
833 unsigned NumOfCallArgs = argDesc->getNumArgs();
834
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000835 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
836 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000837
Vikram S. Advee9327f02002-05-19 15:25:51 +0000838 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
839
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000840 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000841 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000842
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000843 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000844 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000845
Vikram S. Advee9327f02002-05-19 15:25:51 +0000846 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000847 // Also find the correct register the argument must use (UniArgReg)
848 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000849 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000850 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000851 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
852
Vikram S. Advee9327f02002-05-19 15:25:51 +0000853 // Find the register that must be used for this arg, depending on
854 // whether it is an INT or FP value. Here we ignore whether or not it
855 // is a varargs calls, because FP arguments will be explicitly copied
856 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000857 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000858 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
859 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
860 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
861 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000862
863 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000864 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000865 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000866 assert(regClassIDOfArgReg == RegClassID &&
867 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000868 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000869
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000870 // not possible to have a null LR since all args (even consts)
871 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000872 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000873 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000874 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000875 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000876
877 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
878 UniArgReg, argNo, AddedInstrnsBefore);
879
880 // Repeat for the second copy of the argument, which would be
881 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000882 // It may either be passed as a copy in an integer register
883 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000884 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
885 if (argCopy != NULL)
886 {
Chris Lattnerb0b412e2002-09-03 01:08:28 +0000887 assert(regType != IntRegType && argCopy->getType()->isInteger()
Vikram S. Advee9327f02002-05-19 15:25:51 +0000888 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000889
Vikram S. Advee9327f02002-05-19 15:25:51 +0000890 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
891 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
892
893 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
894 argNo, intArgNo, fpArgNo-1,
895 regClassIDOfArgReg);
896 assert(copyRegNum != InvalidRegNum);
897 assert(regClassIDOfArgReg == copyRegClassID &&
898 "Moving values between reg classes must happen during selection");
899
900 InitializeOutgoingArg(CallMI, CallAI, PRA,
901 LRI.getLiveRangeForValue(argCopy), copyRegType,
902 copyRegClassID, copyRegNum, argNo,
903 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000904 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000905
906 if (regNum != InvalidRegNum &&
907 argDesc->getArgInfo(i).usesStackSlot())
908 {
909 // Pass the argument via the stack in addition to regNum
910 assert(regType != IntRegType && "Passing an integer arg. twice?");
911 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
912 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
913 InvalidRegNum, argNo, AddedInstrnsBefore);
914 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000915 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000916
Vikram S. Advee9327f02002-05-19 15:25:51 +0000917 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000918 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000919 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000920 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000921 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000922
Chris Lattner5216cc52002-02-04 05:59:25 +0000923 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000924 cerr << "\nCalling reorder with instrns: \n";
925 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
926 cerr << *(AddedInstrnsBefore[i]);
927 }
928
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000929 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
930 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
931 && "Dropped some instructions when reordering!");
932
Chris Lattner5216cc52002-02-04 05:59:25 +0000933 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000934 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000935 for(unsigned i = 0; i < ReorderedVec.size(); i++)
936 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000937 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000938 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000939
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000940 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000941 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000942 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
943 CallMI, BB, PRA);
944
945 // Then insert the final reordered code for the call arguments.
946 //
947 for(unsigned i=0; i < ReorderedVec.size(); i++)
948 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000949}
950
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000951//---------------------------------------------------------------------------
952// This method is called for an LLVM return instruction to identify which
953// values will be returned from this method and to suggest colors.
954//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000955void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000956 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000957
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000958 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000959
Vikram S. Adveaee67012002-07-08 23:23:12 +0000960 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000961
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000962 // if there is an implicit ref, that has to be the ret value
963 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000965 // The first implicit operand is the return value of a return instr
966 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000968 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969
Chris Lattner30e8fb62002-02-05 01:43:49 +0000970 if (!LR) {
971 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
972 assert(0 && "No LR for return value of non-void method");
973 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000974
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000975 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976
Chris Lattner5216cc52002-02-04 05:59:25 +0000977 if (RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000978 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000979 else if (RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +0000980 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000981 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000982}
983
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000985
986//---------------------------------------------------------------------------
987// Colors the return value of a method to %i0 or %f0, if possible. If it is
988// not possilbe to directly color the LR, insert a copy instruction to move
989// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
990// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000991//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000992void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000993 LiveRangeInfo &LRI,
994 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000995
Chris Lattner5216cc52002-02-04 05:59:25 +0000996 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000997
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000998 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000999 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001000
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001001 // The first implicit operand is the return value of a return instr
1002 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001003
Chris Lattner5216cc52002-02-04 05:59:25 +00001004 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001005
Chris Lattner30e8fb62002-02-05 01:43:49 +00001006 if (!LR) {
1007 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1008 // assert( LR && "No LR for return value of non-void method");
1009 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001010 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001011
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +00001013 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001014
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001015 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001016 if(RegClassID == IntRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001017 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001018 else if(RegClassID == FloatRegClassID)
Chris Lattner56e91662002-08-12 21:25:05 +00001019 CorrectCol = SparcFloatRegClass::f0;
Chris Lattnere147d062001-11-07 14:01:59 +00001020 else {
Chris Lattner5216cc52002-02-04 05:59:25 +00001021 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +00001022 return;
1023 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001024
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001025 // convert to unified number
Chris Lattner56e91662002-08-12 21:25:05 +00001026 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001027
Vikram S. Adveaee67012002-07-08 23:23:12 +00001028 // Mark the register as used by this instruction
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001029 RetMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001030
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001031 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001032
Chris Lattner5216cc52002-02-04 05:59:25 +00001033 if (LR->hasColor() && LR->getColor() == CorrectCol)
1034 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001035
Chris Lattner5216cc52002-02-04 05:59:25 +00001036 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001037
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001038 // We are here because the LR was allocted a regiter
1039 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001040
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001041 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001042
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001043 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001044
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001045 // the LR received UniLRReg but must be colored with UniRetReg
1046 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001047 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001048 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001049 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001050 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1051 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001052 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001053 }
1054
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001055 } // if there is a return value
1056
1057}
1058
Vikram S. Adveaee67012002-07-08 23:23:12 +00001059//---------------------------------------------------------------------------
1060// Check if a specified register type needs a scratch register to be
1061// copied to/from memory. If it does, the reg. type that must be used
1062// for scratch registers is returned in scratchRegType.
1063//
1064// Only the int CC register needs such a scratch register.
1065// The FP CC registers can (and must) be copied directly to/from memory.
1066//---------------------------------------------------------------------------
1067
1068bool
1069UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1070 int& scratchRegType) const
1071{
1072 if (RegType == IntCCRegType)
1073 {
1074 scratchRegType = IntRegType;
1075 return true;
1076 }
1077 return false;
1078}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001079
1080//---------------------------------------------------------------------------
1081// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001082// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001083//---------------------------------------------------------------------------
1084
Vikram S. Advee9327f02002-05-19 15:25:51 +00001085void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001086UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1087 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001088 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001089 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001090 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001091 "Invalid Register");
1092
1093 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001094
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001095 switch( RegType ) {
1096
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001097 case IntCCRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001098 if (getRegType(DestReg) == IntRegType)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001099 { // copy intCC reg to int reg
1100 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1101 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1102 }
1103 else
1104 { // copy int reg to intCC reg
1105 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner56e91662002-08-12 21:25:05 +00001106 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adveaee67012002-07-08 23:23:12 +00001107 && "Can only copy CC reg to/from integer reg");
1108 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1109 }
1110 break;
1111
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001112 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001113 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001114 break;
1115
1116 case IntRegType:
Chris Lattner56e91662002-08-12 21:25:05 +00001117 MI = Create3OperandInstr_Reg(ADD, SrcReg, getZeroRegNum(), DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001118 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001119
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001120 case FPSingleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001121 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001122 break;
1123
1124 case FPDoubleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001125 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001126 break;
1127
1128 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001129 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001130 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001131 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001132
1133 if (MI)
1134 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001135}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001136
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001137//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001138// Copy from a register to memory (i.e., Store). Register number must
1139// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001140//---------------------------------------------------------------------------
1141
1142
Vikram S. Advee9327f02002-05-19 15:25:51 +00001143void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001144UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1145 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001146 unsigned DestPtrReg,
1147 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001148 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001150 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001151 case IntRegType:
1152 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001153 MI->SetMachineOperandReg(0, SrcReg, false);
1154 MI->SetMachineOperandReg(1, DestPtrReg, false);
1155 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1156 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001157 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001158 break;
1159
1160 case FPSingleRegType:
1161 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001162 MI->SetMachineOperandReg(0, SrcReg, false);
1163 MI->SetMachineOperandReg(1, DestPtrReg, false);
1164 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1165 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001166 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001167 break;
1168
1169 case FPDoubleRegType:
1170 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001171 MI->SetMachineOperandReg(0, SrcReg, false);
1172 MI->SetMachineOperandReg(1, DestPtrReg, false);
1173 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1174 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001175 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001176 break;
1177
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001178 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001179 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001180 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001181
1182 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1183 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1184 mvec.push_back(MI);
1185
Chris Lattner56e91662002-08-12 21:25:05 +00001186 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001187 break;
1188
1189 case FloatCCRegType:
1190 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1191 MI = new MachineInstr(STXFSR, 3);
1192 MI->SetMachineOperandReg(0, SrcReg, false);
1193 MI->SetMachineOperandReg(1, DestPtrReg, false);
1194 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1195 (int64_t) Offset);
1196 mvec.push_back(MI);
1197 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001198
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001199 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001200 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001201 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001202}
1203
1204
1205//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001206// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001207// register number
1208//---------------------------------------------------------------------------
1209
1210
Vikram S. Advee9327f02002-05-19 15:25:51 +00001211void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001212UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1213 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001214 int Offset,
1215 unsigned DestReg,
1216 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001217 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001218 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001219 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001220 case IntRegType:
1221 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001222 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1223 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1224 (int64_t) Offset);
1225 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001226 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001227 break;
1228
1229 case FPSingleRegType:
1230 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001231 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1232 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1233 (int64_t) Offset);
1234 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001235 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001236 break;
1237
1238 case FPDoubleRegType:
1239 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001240 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1241 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1242 (int64_t) Offset);
1243 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001244 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001245 break;
1246
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001247 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001248 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner56e91662002-08-12 21:25:05 +00001249 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1250 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001251
1252 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1253 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1254 mvec.push_back(MI);
1255
1256 break;
1257
1258 case FloatCCRegType:
1259 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1260 MI = new MachineInstr(LDXFSR, 3);
1261 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1262 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1263 (int64_t) Offset);
1264 MI->SetMachineOperandReg(2, DestReg, true);
1265 mvec.push_back(MI);
1266 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001267
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001268 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001269 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001270 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001271}
1272
1273
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001274//---------------------------------------------------------------------------
1275// Generate a copy instruction to copy a value to another. Temporarily
1276// used by PhiElimination code.
1277//---------------------------------------------------------------------------
1278
1279
Vikram S. Advee9327f02002-05-19 15:25:51 +00001280void
1281UltraSparcRegInfo::cpValue2Value(Value *Src,
1282 Value *Dest,
1283 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001284 int RegType = getRegType( Src );
1285
1286 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001287
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001288 MachineInstr * MI = NULL;
1289
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001290 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001291 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001292 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001293 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
Chris Lattner56e91662002-08-12 21:25:05 +00001294 MI->SetMachineOperandReg(1, getZeroRegNum(), false);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001295 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001296 break;
1297
1298 case FPSingleRegType:
1299 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001300 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1301 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001302 break;
1303
1304
1305 case FPDoubleRegType:
1306 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001307 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1308 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001309 break;
1310
1311 default:
1312 assert(0 && "Unknow RegType in CpValu2Value");
1313 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001314
Vikram S. Advee9327f02002-05-19 15:25:51 +00001315 if (MI)
1316 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001317}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001318
1319
1320
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001321
1322
1323
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001324//----------------------------------------------------------------------------
1325// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001326// a call machine instruction. The caller saving/restoring instructions are
1327// inserted like:
1328//
1329// ** caller saving instructions
1330// other instructions inserted for the call by ColorCallArg
1331// CALL instruction
1332// other instructions inserted for the call ColorCallArg
1333// ** caller restoring instructions
1334//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001335//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001336
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001337
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001338void
1339UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1340 vector<MachineInstr*>& instrnsAfter,
1341 MachineInstr *CallMI,
1342 const BasicBlock *BB,
1343 PhyRegAlloc &PRA) const
1344{
Vikram S. Advee9327f02002-05-19 15:25:51 +00001345 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1346
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001347 // has set to record which registers were saved/restored
1348 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001349 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001350
Vikram S. Advee9327f02002-05-19 15:25:51 +00001351 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1352
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001353 // Now find the LR of the return value of the call
1354 // The last *implicit operand* is the return value of a call
1355 // Insert it to to he PushedRegSet since we must not save that register
1356 // and restore it after the call.
1357 // We do this because, we look at the LV set *after* the instruction
1358 // to determine, which LRs must be saved across calls. The return value
1359 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001360
Vikram S. Advee9327f02002-05-19 15:25:51 +00001361 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001362
Chris Lattner5216cc52002-02-04 05:59:25 +00001363 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001364 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001365 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001366
Chris Lattner5216cc52002-02-04 05:59:25 +00001367 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001368 PushedRegSet.insert(
1369 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001370 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001371 }
1372
Vikram S. Advee9327f02002-05-19 15:25:51 +00001373 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001374 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001375
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001376 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001377 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001378
1379 // get the live range corresponding to live var
1380 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1381
1382 // LR can be null if it is a const since a const
1383 // doesn't have a dominating def - see Assumptions above
1384 if( LR ) {
1385
1386 if( LR->hasColor() ) {
1387
1388 unsigned RCID = (LR->getRegClass())->getID();
1389 unsigned Color = LR->getColor();
1390
1391 if ( isRegVolatile(RCID, Color) ) {
1392
1393 // if the value is in both LV sets (i.e., live before and after
1394 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001395
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001396 unsigned Reg = getUnifiedRegNum(RCID, Color);
1397
1398 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1399
1400 // if we haven't already pushed that register
1401
1402 unsigned RegType = getRegType( LR );
1403
1404 // Now get two instructions - to push on stack and pop from stack
1405 // and add them to InstrnsBefore and InstrnsAfter of the
1406 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001407 //
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001408 int StackOff = PRA.mcInfo.pushTempValue(target,
1409 getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001410
Vikram S. Adveaee67012002-07-08 23:23:12 +00001411 vector<MachineInstr*> AdIBef, AdIAft;
1412
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001413 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001414
1415 // We may need a scratch register to copy the saved value
1416 // to/from memory. This may itself have to insert code to
1417 // free up a scratch register. Any such code should go before
1418 // the save code.
1419 int scratchRegType = -1;
1420 int scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001421 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001422 { // Find a register not live in the LVSet before CallMI
1423 const ValueSet &LVSetBef =
1424 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1425 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1426 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001427 assert(scratchReg != getInvalidRegNum());
Vikram S. Adveaee67012002-07-08 23:23:12 +00001428 CallMI->getRegsUsed().insert(scratchReg);
1429 }
1430
1431 if (AdIBef.size() > 0)
1432 instrnsBefore.insert(instrnsBefore.end(),
1433 AdIBef.begin(), AdIBef.end());
1434
1435 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1436 scratchReg);
1437
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001438 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001439 instrnsBefore.insert(instrnsBefore.end(),
1440 AdIAft.begin(), AdIAft.end());
1441
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001442 //---- Insert code for popping the reg from the stack ----------
1443
Vikram S. Adveaee67012002-07-08 23:23:12 +00001444 // We may need a scratch register to copy the saved value
1445 // from memory. This may itself have to insert code to
1446 // free up a scratch register. Any such code should go
1447 // after the save code.
1448 //
1449 scratchRegType = -1;
1450 scratchReg = -1;
Chris Lattner56e91662002-08-12 21:25:05 +00001451 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adveaee67012002-07-08 23:23:12 +00001452 { // Find a register not live in the LVSet after CallMI
1453 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1454 CallMI, AdIBef, AdIAft);
Chris Lattner56e91662002-08-12 21:25:05 +00001455 assert(scratchReg != getInvalidRegNum());
Vikram S. Adveaee67012002-07-08 23:23:12 +00001456 CallMI->getRegsUsed().insert(scratchReg);
1457 }
1458
1459 if (AdIBef.size() > 0)
1460 instrnsAfter.insert(instrnsAfter.end(),
1461 AdIBef.begin(), AdIBef.end());
1462
1463 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1464 scratchReg);
1465
1466 if (AdIAft.size() > 0)
1467 instrnsAfter.insert(instrnsAfter.end(),
1468 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001469
Chris Lattner7e5ee422002-02-05 04:20:12 +00001470 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001471
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001472 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001473 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001474 cerr << " -inserted caller saving instrs: Before:\n\t ";
1475 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001476 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001477 cerr << " -and After:\n\t ";
1478 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001479 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001480 }
1481 } // if not already pushed
1482
1483 } // if LR has a volatile color
1484
1485 } // if LR has color
1486
1487 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001488
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001489 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001490}
1491
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001492
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001493//---------------------------------------------------------------------------
1494// Print the register assigned to a LR
1495//---------------------------------------------------------------------------
1496
Chris Lattner5216cc52002-02-04 05:59:25 +00001497void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001498 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001499 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001500
Chris Lattner5216cc52002-02-04 05:59:25 +00001501 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001502 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001503 return;
1504 }
1505
1506 // if a color is found
1507
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001508 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001509
Chris Lattner5216cc52002-02-04 05:59:25 +00001510 if (RegClassID == IntRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001511 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001512
Chris Lattner5216cc52002-02-04 05:59:25 +00001513 } else if (RegClassID == FloatRegClassID) {
Chris Lattner56e91662002-08-12 21:25:05 +00001514 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001515 if( LR->getType() == Type::DoubleTy)
Chris Lattner56e91662002-08-12 21:25:05 +00001516 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001517 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001518 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001519}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001520
1521//---------------------------------------------------------------------------
1522// This method examines instructions inserted by RegAlloc code before a
1523// machine instruction to detect invalid orders that destroy values before
1524// they are used. If it detects such conditions, it reorders the instructions.
1525//
1526// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001527// instructions inserted by RegAlloc. All such instruction MUST have
1528// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001529//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001530// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1531// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001532//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001533// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001534//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001535// Since instructions are inserted in RegAlloc, this assumes that the
1536// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001537// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001538//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001539// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001540//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001541
1542void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1543 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001544 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001545
1546 /*
1547 Problem: We can have instructions inserted by RegAlloc like
1548 1. add %ox %g0 %oy
1549 2. add %oy %g0 %oz, where z!=x or z==x
1550
1551 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001552
1553 Solution:
1554 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001555
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001556 Algorithm:
1557
1558 do
1559 for each instruction 'DefInst' in the UnOrdVec
1560 for each instruction 'UseInst' that follows the DefInst
1561 if the reg defined by DefInst is used by UseInst
1562 mark DefInst as not movable in this iteration
1563 If DefInst is not marked as not-movable, move DefInst to OrdVec
1564 while all instructions in DefInst are moved to OrdVec
1565
1566 For moving, we call the move2OrdVec(). It checks whether there is a def
1567 in it for the uses in the instruction to be added to OrdVec. If there
1568 are no preceding defs, it just appends the instruction. If there is a
1569 preceding def, it puts two instructions to save the reg on stack before
1570 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001571
1572 */
1573
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001574 bool CouldMoveAll;
1575 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001576
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001577 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001578 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001579 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001580
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001581 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001582
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001584
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001585 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001586
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001587 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001588
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001589 //cerr << "\nInst in UnordVec = " << *DefInst;
1590
1591 // last operand is the def (unless for a store which has no def reg)
1592 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1593
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594 if( DefOp.opIsDef() &&
1595 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001596
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001597 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001598
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001599 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001600
Chris Lattner7f74a562002-01-20 22:54:45 +00001601 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001602 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001603
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001604 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1605
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001606 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001607 if( UseInst == NULL) continue;
1608
1609 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001610 MachineOperand& UseOp = UseInst->getOperand(0);
1611
1612 if( ! UseOp.opIsDef() &&
1613 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1614
1615 // if use is a register ...
1616
1617 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1618
1619 // if Def and this use are the same, it means that this use
1620 // is destroyed by a def before it is used
1621
1622 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001623
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001624 DefEqUse = true;
1625 CouldMoveAll = false;
1626 DebugPrint = true;
1627 break;
1628 } // if two registers are equal
1629
1630 } // if use is a register
1631
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001632 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001633
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001634 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001635
1636 // after examining all the instructions that follow the DefInst
1637 // if there are no dependencies, we can move it to the OrdVec
1638
1639 // cerr << "Moved to Ord: " << *DefInst;
1640
1641 moveInst2OrdVec(OrdVec, DefInst, PRA);
1642
1643 //OrdVec.push_back(DefInst);
1644
1645 // mark the pos of DefInst with NULL to indicate that it is
1646 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001647 *DefIt = NULL;
1648 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001649
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001650 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001651
1652 } // for all instructions in the UnordVec
1653
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001654
Chris Lattner5216cc52002-02-04 05:59:25 +00001655 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001656
Chris Lattner070cf772002-06-04 03:09:57 +00001657 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001658 cerr << "\nAdded instructions were reordered to:\n";
1659 for(unsigned int i=0; i < OrdVec.size(); i++)
1660 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001661 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001662}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001663
1664
1665
1666
1667
Chris Lattner7f74a562002-01-20 22:54:45 +00001668void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001669 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001670 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001671 MachineOperand& UseOp = UnordInst->getOperand(0);
1672
1673 if( ! UseOp.opIsDef() &&
1674 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1675
1676 // for the use of UnordInst, see whether there is a defining instr
1677 // before in the OrdVec
1678 bool DefEqUse = false;
1679
Chris Lattner7f74a562002-01-20 22:54:45 +00001680 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001681
1682 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1683
1684 MachineInstr *OrdInst = *OrdIt ;
1685
1686 MachineOperand& DefOp =
1687 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1688
1689 if( DefOp.opIsDef() &&
1690 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1691
1692 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1693
1694 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1695
1696 // we are here because there is a preceding def in the OrdVec
1697 // for the use in this intr we are going to insert. This
1698 // happened because the original code was like:
1699 // 1. add %ox %g0 %oy
1700 // 2. add %oy %g0 %ox
1701 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1702 // Now we are processing %ox of 1.
1703 // We have to
1704
1705 const int UReg = DefOp.getMachineRegNum();
1706 const int RegType = getRegType(UReg);
1707 MachineInstr *AdIBef, *AdIAft;
1708
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001709 const int StackOff = PRA.mcInfo.pushTempValue(target,
1710 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001711
1712 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001713 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001714 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001715 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1716 OrdIt = OrdVec.insert(OrdIt, *MI);
1717 ++OrdIt; // OrdIt must still point to current instr we processed
1718 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001719
1720 // Load directly into DReg (%oy)
1721 MachineOperand& DOp=
1722 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1723 assert(DOp.opIsDef() && "Last operand is not the def");
1724 const int DReg = DOp.getMachineRegNum();
1725
Vikram S. Adveaee67012002-07-08 23:23:12 +00001726 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001727
1728 cerr << "\nFixed CIRCULAR references by reordering";
1729
1730 if( DEBUG_RA ) {
1731 cerr << "\nBefore CIRCULAR Reordering:\n";
1732 cerr << *UnordInst;
1733 cerr << *OrdInst;
1734
1735 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1736 for(unsigned i=0; i < OrdVec.size(); i++)
1737 cerr << *(OrdVec[i]);
1738 }
1739
1740 // Do not copy the UseInst to OrdVec
1741 DefEqUse = true;
1742 break;
1743
1744 }// if two registers are equal
1745
1746 } // if Def is a register
1747
1748 } // for each instr in OrdVec
1749
Chris Lattner5216cc52002-02-04 05:59:25 +00001750 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001751
1752 // We didn't find a def in the OrdVec, so just append this inst
1753 OrdVec.push_back( UnordInst );
1754 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1755 }
1756
1757 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001758}