blob: 11b65f8cab03c8b248cb2b8656d2660816483054 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner699683c2002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000023#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000024#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000025using std::cerr;
Anand Shuklacfb22d32002-06-25 20:55:50 +000026using std::vector;
Chris Lattner20b1ea02001-09-14 03:47:57 +000027
Chris Lattner699683c2002-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. Adve76ee6f72002-07-08 23:23:12 +000036
Chris Lattner699683c2002-02-04 05:59:25 +000037 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
38 "32 Float regs are used for float arg passing");
39}
40
41
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000044//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
46 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegOrder::g0);
48}
Chris Lattner699683c2002-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 {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000054 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegOrder::o7);
Chris Lattner699683c2002-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 {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000063 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000065}
66
67// given the unified register number, this gives the name
68// for generating assembly code or debugging.
69//
70const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
71 if( reg < 32 )
72 return SparcIntRegOrder::getRegName(reg);
73 else if ( reg < (64 + 32) )
74 return SparcFloatRegOrder::getRegName( reg - 32);
75 else if( reg < (64+32+4) )
76 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
77 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
78 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
79 else if (reg== InvalidRegNum) //****** TODO: Remove */
80 return "<*NoReg*>";
81 else
82 assert(0 && "Invalid register number");
83 return "";
84}
85
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000086// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000087unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000088 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
89 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000090}
91
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000092// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000093unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000094 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
95 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000096}
97
98
Vikram S. Adve31f78c42002-04-25 04:42:21 +000099//---------------------------------------------------------------------------
100// Finds whether a call is an indirect call
101//---------------------------------------------------------------------------
102
103inline bool
104isVarArgsFunction(const Type *funcType) {
105 return cast<FunctionType>(cast<PointerType>(funcType)
106 ->getElementType())->isVarArg();
107}
108
109inline bool
110isVarArgsCall(const MachineInstr *CallMI) {
111 Value* callee = CallMI->getOperand(0).getVRegValue();
112 // const Type* funcType = isa<Function>(callee)? callee->getType()
113 // : cast<PointerType>(callee->getType())->getElementType();
114 const Type* funcType = callee->getType();
115 return isVarArgsFunction(funcType);
116}
117
118
119// Get the register number for the specified integer arg#,
120// assuming there are argNum total args, intArgNum int args,
121// and fpArgNum FP args preceding (and not including) this one.
122// Use INT regs for FP args if this is a varargs call.
123//
124// Return value:
125// InvalidRegNum, if there is no int register available for the arg.
126// regNum, otherwise (this is NOT the unified reg. num).
127//
128inline int
129UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
130 unsigned argNo,
131 unsigned intArgNo, unsigned fpArgNo,
132 unsigned& regClassId) const
133{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000134 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000135 if (argNo >= NumOfIntArgRegs)
136 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000137 else
138 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000139}
140
141// Get the register number for the specified FP arg#,
142// assuming there are argNum total args, intArgNum int args,
143// and fpArgNum FP args preceding (and not including) this one.
144// Use INT regs for FP args if this is a varargs call.
145//
146// Return value:
147// InvalidRegNum, if there is no int register available for the arg.
148// regNum, otherwise (this is NOT the unified reg. num).
149//
150inline int
151UltraSparcRegInfo::regNumForFPArg(unsigned regType,
152 bool inCallee, bool isVarArgsCall,
153 unsigned argNo,
154 unsigned intArgNo, unsigned fpArgNo,
155 unsigned& regClassId) const
156{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000157 if (isVarArgsCall)
158 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
159 regClassId);
160 else
161 {
162 regClassId = FloatRegClassID;
163 if (regType == FPSingleRegType)
164 return (argNo*2+1 >= NumOfFloatArgRegs)?
165 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2 + 1);
166 else if (regType == FPDoubleRegType)
167 return (argNo*2 >= NumOfFloatArgRegs)?
168 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2);
169 else
170 assert(0 && "Illegal FP register type");
171 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000172}
173
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000174
175//---------------------------------------------------------------------------
176// Finds the return address of a call sparc specific call instruction
177//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000178
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000179// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000181//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000182int UltraSparcRegInfo::getRegType(unsigned regClassID,
183 const Type* type) const {
184 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000185 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000186 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000187 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000188 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000189 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000190 return FPDoubleRegType;
191 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000192 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000193 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000194 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000195 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000196 }
197}
198
Vikram S. Adve242a8082002-05-19 15:25:51 +0000199int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
200 return getRegType(LR->getRegClass()->getID(), LR->getType());
201}
202
Chris Lattner699683c2002-02-04 05:59:25 +0000203int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000204 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000205}
206
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000207int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
208 if (unifiedRegNum < 32)
Chris Lattner699683c2002-02-04 05:59:25 +0000209 return IntRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000210 else if (unifiedRegNum < (32 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000211 return FPSingleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000212 else if (unifiedRegNum < (64 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000213 return FPDoubleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000214 else if (unifiedRegNum < (64+32+4))
Chris Lattner699683c2002-02-04 05:59:25 +0000215 return FloatCCRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000216 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner699683c2002-02-04 05:59:25 +0000217 return IntCCRegType;
218 else
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000219 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000220 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000221}
222
223
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000224// To find the register class used for a specified Type
225//
226unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
227 bool isCCReg = false) const {
228 Type::PrimitiveID ty = type->getPrimitiveID();
229 unsigned res;
230
231 // FIXME: Comparing types like this isn't very safe...
232 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
233 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
234 res = IntRegClassID; // sparc int reg (ty=0: void)
235 else if (ty <= Type::DoubleTyID)
236 res = FloatRegClassID; // sparc float reg class
237 else {
238 //std::cerr << "TypeID: " << ty << "\n";
239 assert(0 && "Cannot resolve register class for type");
240 return 0;
241 }
242
243 if(isCCReg)
244 return res + 2; // corresponidng condition code regiser
245 else
246 return res;
247}
248
249// To find the register class to which a specified register belongs
250//
251unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
252 unsigned classId = 0;
253 (void) getClassRegNum(unifiedRegNum, classId);
254 return classId;
255}
256
257unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
258 switch(regType) {
259 case IntRegType: return IntRegClassID;
260 case FPSingleRegType:
261 case FPDoubleRegType: return FloatRegClassID;
262 case IntCCRegType: return IntCCRegClassID;
263 case FloatCCRegType: return FloatCCRegClassID;
264 default:
265 assert(0 && "Invalid register type in getRegClassIDOfRegType");
266 return 0;
267 }
268}
269
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000270//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000271// Suggests a register for the ret address in the RET machine instruction.
272// We always suggest %i7 by convention.
273//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000274void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000275 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000276
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000277 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000278
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000279 // return address is always mapped to i7 so set it immediately
280 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
281 SparcIntRegOrder::i7));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000282
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000283 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000284 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000285 // we have to test later whether it received the suggested color.
286 // In that case, a LR has to be created at the start of method.
287 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000288
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000289 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000290 // const Value *RetAddrVal = MO.getVRegValue();
291 // assert( RetAddrVal && "LR for ret address must be created at start");
292 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
293 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000294 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000295}
296
297
298//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000299// Suggests a register for the ret address in the JMPL/CALL machine instr.
300// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000301//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000302void UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000303 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000304 std::vector<RegClass *> RCList) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000305 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
306 const Value *RetAddrVal = argDesc->getReturnAddrReg();
307 assert(RetAddrVal && "Return address value is required");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000308
Vikram S. Adve242a8082002-05-19 15:25:51 +0000309 // create a new LR for the return address and color it
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000310 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000311 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000312 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
313 RetAddrLR->setRegClass( RCList[RegClassID] );
314 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
315 LRI.addLRToMap( RetAddrVal, RetAddrLR);
316
Ruchira Sasanka91442282001-09-30 23:16:47 +0000317}
318
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000319
320
Ruchira Sasanka91442282001-09-30 23:16:47 +0000321
322//---------------------------------------------------------------------------
323// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000324// According to the Sparc ABI, the first 6 incoming args are in
325// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000326// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000327// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000328//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000329void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000330 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000331{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000332 // check if this is a varArgs function. needed for choosing regs.
333 bool isVarArgs = isVarArgsFunction(Meth->getType());
334
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000335 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000336 unsigned argNo=0, intArgNo=0, fpArgNo=0;
337 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
338 I != E; ++I, ++argNo) {
339 // get the LR of arg
340 LiveRange *LR = LRI.getLiveRangeForValue(I);
341 assert(LR && "No live range found for method arg");
342
343 unsigned regType = getRegType(LR);
344 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
345
346 int regNum = (regType == IntRegType)
347 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
348 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
349 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
350 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
351
352 if(regNum != InvalidRegNum)
353 LR->setSuggestedColor(regNum);
354 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000355}
356
Ruchira Sasanka91442282001-09-30 23:16:47 +0000357
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000358//---------------------------------------------------------------------------
359// This method is called after graph coloring to move incoming args to
360// the correct hardware registers if they did not receive the correct
361// (suggested) color through graph coloring.
362//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000363void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000364 LiveRangeInfo &LRI,
365 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000366
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000367 // check if this is a varArgs function. needed for choosing regs.
368 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000369 MachineInstr *AdMI;
370
Ruchira Sasanka91442282001-09-30 23:16:47 +0000371 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000372 // for each argument. count INT and FP arguments separately.
373 unsigned argNo=0, intArgNo=0, fpArgNo=0;
374 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
375 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000376 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000377 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000378 assert( LR && "No live range found for method arg");
379
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000380 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000381 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000382
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000383 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000384 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000385 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000386 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000387 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000388 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
389
390 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000391 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
392 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
393 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
394 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000395
396 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000397 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000398 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000399 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000400
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000401 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000402
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000403 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
404
405 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000406 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000407 if( UniLRReg == UniArgReg )
408 continue;
409
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000410 // We are here because the LR did not receive the suggested
411 // but LR received another register.
412 // Now we have to copy the %i reg (or stack pos of arg)
413 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000414
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000415 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000416 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000417 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000418 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000419 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000420 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000421
422 // It is a variable argument call: the float reg must go in a %o reg.
423 // We have to move an int reg to a float reg via memory.
424 //
425 assert(isVarArgs &&
426 RegClassID == FloatRegClassID &&
427 regClassIDOfArgReg == IntRegClassID &&
428 "This should only be an Int register for an FP argument");
429
430 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
431 getSpilledRegSize(regType));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000432 cpReg2MemMI(FirstAI->InstrnsBefore,
433 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000434
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000435 cpMem2RegMI(FirstAI->InstrnsBefore,
436 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000437 }
438 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000439 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000440 }
441 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000442 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000443
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000444 // Now the arg is coming on stack. Since the LR recieved a register,
445 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000446 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000447 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000448 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000449 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
450 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000451
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000452 cpMem2RegMI(FirstAI->InstrnsBefore,
453 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000454 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000455
456 } // if LR received a color
457
458 else {
459
460 // Now, the LR did not receive a color. But it has a stack offset for
461 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000462 // So, if the arg is coming in UniArgReg register, we can just move
463 // that on to the stack pos of LR
464
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000465 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000466
467 if( regClassIDOfArgReg != RegClassID ) {
468 assert(0 &&
469 "FP arguments to a varargs function should be explicitly "
470 "copied to/from int registers by instruction selection!");
471
472 // It must be a float arg for a variable argument call, which
473 // must come in a %o reg. Move the int reg to the stack.
474 //
475 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
476 "This should only be an Int register for an FP argument");
477
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000478 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
479 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000480 }
481 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000482 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
483 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000484 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000485 }
486
487 else {
488
489 // Now the arg is coming on stack. Since the LR did NOT
490 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000491 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000492 // since this method is called before any other method that makes
493 // uses of the stack pos of the LR (e.g., updateMachineInstr)
494
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000495 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000496 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000497 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
498 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000499
500 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000501 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000502
503 }
504
Ruchira Sasanka91442282001-09-30 23:16:47 +0000505 } // for each incoming argument
506
507}
508
Chris Lattner20b1ea02001-09-14 03:47:57 +0000509
510
Ruchira Sasanka91442282001-09-30 23:16:47 +0000511//---------------------------------------------------------------------------
512// This method is called before graph coloring to suggest colors to the
513// outgoing call args and the return value of the call.
514//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000515void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000516 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000517 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000518 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000519
Vikram S. Adve242a8082002-05-19 15:25:51 +0000520 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000521
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000522 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000523
Ruchira Sasanka91442282001-09-30 23:16:47 +0000524 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000525 // will be in %o0 if the value is an integer type, or in %f0 if the
526 // value is a float type.
527
Ruchira Sasanka91442282001-09-30 23:16:47 +0000528 // the return value cannot have a LR in machine instruction since it is
529 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000530
Ruchira Sasanka91442282001-09-30 23:16:47 +0000531 // if type is not void, create a new live range and set its
532 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000533
Vikram S. Adve242a8082002-05-19 15:25:51 +0000534 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000535
Chris Lattner699683c2002-02-04 05:59:25 +0000536 if (RetVal) {
537 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000538 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000539
Chris Lattner699683c2002-02-04 05:59:25 +0000540 // create a new LR for the return value
541 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000542 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000543 unsigned RegClassID = getRegClassIDOfValue(RetVal);
544 RetValLR->setRegClass(RCList[RegClassID]);
545 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000546
547 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000548
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000549 if( RegClassID == IntRegClassID )
550 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
551 else if (RegClassID == FloatRegClassID )
552 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
553 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000554 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000555
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000556
Ruchira Sasanka91442282001-09-30 23:16:47 +0000557 // Now suggest colors for arguments (operands) of the call instruction.
558 // Colors are suggested only if the arg number is smaller than the
559 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000560 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000561
Vikram S. Adve242a8082002-05-19 15:25:51 +0000562 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000563
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000564 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
565 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000566
Vikram S. Adve242a8082002-05-19 15:25:51 +0000567 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000568
569 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000570 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000571
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000572 // not possible to have a null LR since all args (even consts)
573 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000574 if (!LR) {
575 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000576 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000577 }
578
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000579 unsigned regType = getRegType( LR );
580 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000581
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000582 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000583 // an INT or FP value. Here we ignore whether or not it is a
584 // varargs calls, because FP arguments will be explicitly copied
585 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000586 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000587 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
588 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
589 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
590 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000591
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000592 // If a register could be allocated, use it.
593 // If not, do NOTHING as this will be colored as a normal value.
594 if(regNum != InvalidRegNum)
595 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000596
Vikram S. Adve242a8082002-05-19 15:25:51 +0000597 // Repeat for the second copy of the argument, which would be
598 // an FP argument being passed to a function with no prototype
599 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
600 if (argCopy != NULL)
601 {
602 assert(regType != IntRegType && argCopy->getType()->isIntegral()
603 && "Must be passing copy of FP argument in int register");
604 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
605 argNo, intArgNo, fpArgNo-1,
606 regClassIDOfArgReg);
607 assert(copyRegNum != InvalidRegNum);
608 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
609 copyLR->setSuggestedColor(copyRegNum);
610 }
611
Ruchira Sasanka91442282001-09-30 23:16:47 +0000612 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000613
Chris Lattner20b1ea02001-09-14 03:47:57 +0000614}
615
616
Ruchira Sasanka91442282001-09-30 23:16:47 +0000617//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000618// Helper method for UltraSparcRegInfo::colorCallArgs().
619//---------------------------------------------------------------------------
620
621void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000622UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000623 AddedInstrns *CallAI,
624 PhyRegAlloc &PRA, LiveRange* LR,
625 unsigned regType, unsigned RegClassID,
626 int UniArgRegOrNone, unsigned int argNo,
627 std::vector<MachineInstr *>& AddedInstrnsBefore)
628 const
629{
630 MachineInstr *AdMI;
631 bool isArgInReg = false;
632 unsigned UniArgReg = MAXINT; // unused unless initialized below
633 if (UniArgRegOrNone != InvalidRegNum)
634 {
635 isArgInReg = true;
636 UniArgReg = (unsigned) UniArgRegOrNone;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000637 CallMI->getRegsUsed().insert(UniArgReg); // mark the reg as used
Vikram S. Adve242a8082002-05-19 15:25:51 +0000638 }
639
640 if (LR->hasColor()) {
641 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
642
643 // if LR received the correct color, nothing to do
644 if( isArgInReg && UniArgReg == UniLRReg )
645 return;
646
647 // The LR is allocated to a register UniLRReg and must be copied
648 // to UniArgReg or to the stack slot.
649 //
650 if( isArgInReg ) {
651 // Copy UniLRReg to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000652 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000653 }
654 else {
655 // Copy UniLRReg to the stack to pass the arg on stack.
656 const MachineFrameInfo& frameInfo = target.getFrameInfo();
657 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000658 cpReg2MemMI(CallAI->InstrnsBefore,
659 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000660 }
661
662 } else { // LR is not colored (i.e., spilled)
663
664 if( isArgInReg ) {
665 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000666 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
667 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000668 // Now add the instruction
669 }
670
671 else {
672 // Now, we have to pass the arg on stack. Since LR also did NOT
673 // receive a register we have to move an argument in memory to
674 // outgoing parameter on stack.
675 // Use TReg to load and store the value.
676 // Use TmpOff to save TReg, since that may have a live value.
677 //
678 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
679 int TmpOff = PRA.mcInfo.pushTempValue(target,
680 getSpilledRegSize(getRegType(LR)));
681 const MachineFrameInfo& frameInfo = target.getFrameInfo();
682 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
683
684 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
685
686 // Sequence:
687 // (1) Save TReg on stack
688 // (2) Load LR value into TReg from stack pos of LR
689 // (3) Store Treg on outgoing Arg pos on stack
690 // (4) Load the old value of TReg from stack to TReg (restore it)
691 //
692 // OPTIMIZE THIS:
693 // When reverse pointers in MahineInstr are introduced:
694 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
695 // needed only if this fails. Currently, we cannot call the
696 // above method since we cannot find LVSetBefore without the BB
697 //
698 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
699 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000700 cpReg2MemMI(CallAI->InstrnsBefore,
701 TReg, getFramePointer(), TmpOff, regType);
702 cpMem2RegMI(CallAI->InstrnsBefore,
703 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
704 cpReg2MemMI(CallAI->InstrnsBefore,
705 TReg, getStackPointer(), argOffset, regType);
706 cpMem2RegMI(CallAI->InstrnsBefore,
707 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000708 }
709 }
710}
711
712//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000713// After graph coloring, we have call this method to see whehter the return
714// value and the call args received the correct colors. If not, we have
715// to instert copy instructions.
716//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000717
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000718void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000719 LiveRangeInfo &LRI,
720 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000721 PhyRegAlloc &PRA,
722 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000723
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000724 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
725
Vikram S. Adve242a8082002-05-19 15:25:51 +0000726 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
727
Ruchira Sasanka91442282001-09-30 23:16:47 +0000728 // First color the return value of the call.
729 // If there is a LR for the return value, it means this
730 // method returns a value
731
732 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000733
Vikram S. Adve242a8082002-05-19 15:25:51 +0000734 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000735
Chris Lattner0665a5f2002-02-05 01:43:49 +0000736 if (RetVal) {
737 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000738
Chris Lattner0665a5f2002-02-05 01:43:49 +0000739 if (!RetValLR) {
740 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000741 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000742 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000743
744 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000745 bool recvCorrectColor;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000746 unsigned CorrectCol; // correct color for ret value
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000747 unsigned UniRetReg; // unified number for CorrectCol
748
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000749 if(RegClassID == IntRegClassID)
750 CorrectCol = SparcIntRegOrder::o0;
751 else if(RegClassID == FloatRegClassID)
752 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000753 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000754 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000755 return;
756 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000757
758 // convert to unified number
759 UniRetReg = this->getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000760
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000761 // Mark the register as used by this instruction
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000762 CallMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000763
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000764 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000765 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
766 : false;
767
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000768 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000769 // put copy instruction
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000770 if( !recvCorrectColor ) {
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000771
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000772 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000773
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000774 if( RetValLR->hasColor() ) {
775
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000776 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000777
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000778 // the return value is coming in UniRetReg but has to go into
779 // the UniRetLRReg
780
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000781 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000782
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000783 } // if LR has color
784 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000785
786 // if the LR did NOT receive a color, we have to move the return
787 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000788
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000789 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
790 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000791 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000792
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000793 } // the LR didn't receive the suggested color
794
795 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000796
797
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000798 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000799 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000800 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000801
Chris Lattner697954c2002-01-20 22:54:45 +0000802 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000803
804 unsigned NumOfCallArgs = argDesc->getNumArgs();
805
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000806 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
807 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000808
Vikram S. Adve242a8082002-05-19 15:25:51 +0000809 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
810
Ruchira Sasanka91442282001-09-30 23:16:47 +0000811 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000812 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000813
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000814 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000815 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000816
Vikram S. Adve242a8082002-05-19 15:25:51 +0000817 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000818 // Also find the correct register the argument must use (UniArgReg)
819 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000820 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000821 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000822 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
823
Vikram S. Adve242a8082002-05-19 15:25:51 +0000824 // Find the register that must be used for this arg, depending on
825 // whether it is an INT or FP value. Here we ignore whether or not it
826 // is a varargs calls, because FP arguments will be explicitly copied
827 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000828 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000829 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
830 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
831 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
832 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000833
834 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000835 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000836 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000837 assert(regClassIDOfArgReg == RegClassID &&
838 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000839 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000840
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000841 // not possible to have a null LR since all args (even consts)
842 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000843 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000844 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000845 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000846 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000847
848 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
849 UniArgReg, argNo, AddedInstrnsBefore);
850
851 // Repeat for the second copy of the argument, which would be
852 // an FP argument being passed to a function with no prototype.
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000853 // It may either be passed as a copy in an integer register
854 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Adve242a8082002-05-19 15:25:51 +0000855 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
856 if (argCopy != NULL)
857 {
858 assert(regType != IntRegType && argCopy->getType()->isIntegral()
859 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000860
Vikram S. Adve242a8082002-05-19 15:25:51 +0000861 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
862 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
863
864 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
865 argNo, intArgNo, fpArgNo-1,
866 regClassIDOfArgReg);
867 assert(copyRegNum != InvalidRegNum);
868 assert(regClassIDOfArgReg == copyRegClassID &&
869 "Moving values between reg classes must happen during selection");
870
871 InitializeOutgoingArg(CallMI, CallAI, PRA,
872 LRI.getLiveRangeForValue(argCopy), copyRegType,
873 copyRegClassID, copyRegNum, argNo,
874 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000875 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000876
877 if (regNum != InvalidRegNum &&
878 argDesc->getArgInfo(i).usesStackSlot())
879 {
880 // Pass the argument via the stack in addition to regNum
881 assert(regType != IntRegType && "Passing an integer arg. twice?");
882 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
883 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
884 InvalidRegNum, argNo, AddedInstrnsBefore);
885 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000886 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000887
Vikram S. Adve242a8082002-05-19 15:25:51 +0000888 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000889 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000890 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000891 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner699683c2002-02-04 05:59:25 +0000892 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000893
Chris Lattner699683c2002-02-04 05:59:25 +0000894 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000895 cerr << "\nCalling reorder with instrns: \n";
896 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
897 cerr << *(AddedInstrnsBefore[i]);
898 }
899
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000900 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
901 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
902 && "Dropped some instructions when reordering!");
903
Chris Lattner699683c2002-02-04 05:59:25 +0000904 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000905 cerr << "\nAfter reordering instrns: \n";
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000906 for(unsigned i = 0; i < ReorderedVec.size(); i++)
907 cerr << *ReorderedVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000908 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000909 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000910
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000911 // Now insert caller saving code for this call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000912 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000913 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
914 CallMI, BB, PRA);
915
916 // Then insert the final reordered code for the call arguments.
917 //
918 for(unsigned i=0; i < ReorderedVec.size(); i++)
919 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000920}
921
Ruchira Sasanka91442282001-09-30 23:16:47 +0000922//---------------------------------------------------------------------------
923// This method is called for an LLVM return instruction to identify which
924// values will be returned from this method and to suggest colors.
925//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000926void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000927 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000928
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000929 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000930
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000931 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000932
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000933 // if there is an implicit ref, that has to be the ret value
934 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000935
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000936 // The first implicit operand is the return value of a return instr
937 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000938
Ruchira Sasanka91442282001-09-30 23:16:47 +0000939 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000940
Chris Lattner0665a5f2002-02-05 01:43:49 +0000941 if (!LR) {
942 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
943 assert(0 && "No LR for return value of non-void method");
944 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000945
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000946 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000947
Chris Lattner699683c2002-02-04 05:59:25 +0000948 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000949 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000950 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000951 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000952 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000953}
954
Ruchira Sasanka91442282001-09-30 23:16:47 +0000955
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000956
957//---------------------------------------------------------------------------
958// Colors the return value of a method to %i0 or %f0, if possible. If it is
959// not possilbe to directly color the LR, insert a copy instruction to move
960// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
961// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000962//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000963void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000964 LiveRangeInfo &LRI,
965 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000966
Chris Lattner699683c2002-02-04 05:59:25 +0000967 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000968
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000969 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000970 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000971
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000972 // The first implicit operand is the return value of a return instr
973 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000974
Chris Lattner699683c2002-02-04 05:59:25 +0000975 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000976
Chris Lattner0665a5f2002-02-05 01:43:49 +0000977 if (!LR) {
978 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
979 // assert( LR && "No LR for return value of non-void method");
980 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000981 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000982
Ruchira Sasanka91442282001-09-30 23:16:47 +0000983 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000984 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000985
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000986 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000987 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000988 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000989 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000990 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000991 else {
Chris Lattner699683c2002-02-04 05:59:25 +0000992 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000993 return;
994 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000995
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000996 // convert to unified number
997 unsigned UniRetReg = this->getUnifiedRegNum(RegClassID, CorrectCol);
998
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000999 // Mark the register as used by this instruction
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001000 RetMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001001
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001002 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001003
Chris Lattner699683c2002-02-04 05:59:25 +00001004 if (LR->hasColor() && LR->getColor() == CorrectCol)
1005 return;
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001006
Chris Lattner699683c2002-02-04 05:59:25 +00001007 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001008
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001009 // We are here because the LR was allocted a regiter
1010 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001011
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001012 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001013
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001014 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001015
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001016 // the LR received UniLRReg but must be colored with UniRetReg
1017 // to pass as the return value
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001018 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001019 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001020 else { // if the LR is spilled
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001021 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1022 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001023 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001024 }
1025
Ruchira Sasanka91442282001-09-30 23:16:47 +00001026 } // if there is a return value
1027
1028}
1029
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001030//---------------------------------------------------------------------------
1031// Check if a specified register type needs a scratch register to be
1032// copied to/from memory. If it does, the reg. type that must be used
1033// for scratch registers is returned in scratchRegType.
1034//
1035// Only the int CC register needs such a scratch register.
1036// The FP CC registers can (and must) be copied directly to/from memory.
1037//---------------------------------------------------------------------------
1038
1039bool
1040UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1041 int& scratchRegType) const
1042{
1043 if (RegType == IntCCRegType)
1044 {
1045 scratchRegType = IntRegType;
1046 return true;
1047 }
1048 return false;
1049}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001050
1051//---------------------------------------------------------------------------
1052// Copy from a register to register. Register number must be the unified
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001053// register number.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001054//---------------------------------------------------------------------------
1055
Vikram S. Adve242a8082002-05-19 15:25:51 +00001056void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001057UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1058 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001059 unsigned DestReg,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001060 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001061 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001062 "Invalid Register");
1063
1064 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001065
Ruchira Sasanka91442282001-09-30 23:16:47 +00001066 switch( RegType ) {
1067
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001068 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001069 if (this->getRegType(DestReg) == IntRegType)
1070 { // copy intCC reg to int reg
1071 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1072 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1073 }
1074 else
1075 { // copy int reg to intCC reg
1076 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1077 assert(this->getRegType(SrcReg) == IntRegType
1078 && "Can only copy CC reg to/from integer reg");
1079 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1080 }
1081 break;
1082
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001083 case FloatCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001084 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Adve242a8082002-05-19 15:25:51 +00001085 break;
1086
1087 case IntRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001088 MI = Create3OperandInstr_Reg(ADD, SrcReg, this->getZeroRegNum(), DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001089 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001090
Ruchira Sasanka91442282001-09-30 23:16:47 +00001091 case FPSingleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001092 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001093 break;
1094
1095 case FPDoubleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001096 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001097 break;
1098
1099 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001100 assert(0 && "Unknown RegType");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001101 break;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001102 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001103
1104 if (MI)
1105 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001106}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001107
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001108//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001109// Copy from a register to memory (i.e., Store). Register number must
1110// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001111//---------------------------------------------------------------------------
1112
1113
Vikram S. Adve242a8082002-05-19 15:25:51 +00001114void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001115UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1116 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001117 unsigned DestPtrReg,
1118 int Offset, int RegType,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001119 int scratchReg = -1) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001120 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001121 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001122 case IntRegType:
1123 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001124 MI->SetMachineOperandReg(0, SrcReg, false);
1125 MI->SetMachineOperandReg(1, DestPtrReg, false);
1126 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1127 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001128 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001129 break;
1130
1131 case FPSingleRegType:
1132 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001133 MI->SetMachineOperandReg(0, SrcReg, false);
1134 MI->SetMachineOperandReg(1, DestPtrReg, false);
1135 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1136 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001137 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001138 break;
1139
1140 case FPDoubleRegType:
1141 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001142 MI->SetMachineOperandReg(0, SrcReg, false);
1143 MI->SetMachineOperandReg(1, DestPtrReg, false);
1144 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1145 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001146 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001147 break;
1148
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001149 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001150 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
1151 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1152
1153 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1154 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1155 mvec.push_back(MI);
1156
1157 this->cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
1158 break;
1159
1160 case FloatCCRegType:
1161 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1162 MI = new MachineInstr(STXFSR, 3);
1163 MI->SetMachineOperandReg(0, SrcReg, false);
1164 MI->SetMachineOperandReg(1, DestPtrReg, false);
1165 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1166 (int64_t) Offset);
1167 mvec.push_back(MI);
1168 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001169
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001170 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001171 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001172 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001173}
1174
1175
1176//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001177// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001178// register number
1179//---------------------------------------------------------------------------
1180
1181
Vikram S. Adve242a8082002-05-19 15:25:51 +00001182void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001183UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1184 unsigned SrcPtrReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001185 int Offset,
1186 unsigned DestReg,
1187 int RegType,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001188 int scratchReg = -1) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001189 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001190 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001191 case IntRegType:
1192 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001193 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1194 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1195 (int64_t) Offset);
1196 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001197 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001198 break;
1199
1200 case FPSingleRegType:
1201 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001202 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1203 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1204 (int64_t) Offset);
1205 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001206 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001207 break;
1208
1209 case FPDoubleRegType:
1210 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001211 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1212 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1213 (int64_t) Offset);
1214 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001215 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001216 break;
1217
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001218 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001219 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
1220 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1221 this->cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
1222
1223 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1224 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1225 mvec.push_back(MI);
1226
1227 break;
1228
1229 case FloatCCRegType:
1230 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1231 MI = new MachineInstr(LDXFSR, 3);
1232 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1233 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1234 (int64_t) Offset);
1235 MI->SetMachineOperandReg(2, DestReg, true);
1236 mvec.push_back(MI);
1237 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001238
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001239 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001240 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001241 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001242}
1243
1244
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001245//---------------------------------------------------------------------------
1246// Generate a copy instruction to copy a value to another. Temporarily
1247// used by PhiElimination code.
1248//---------------------------------------------------------------------------
1249
1250
Vikram S. Adve242a8082002-05-19 15:25:51 +00001251void
1252UltraSparcRegInfo::cpValue2Value(Value *Src,
1253 Value *Dest,
1254 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001255 int RegType = getRegType( Src );
1256
1257 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001258
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001259 MachineInstr * MI = NULL;
1260
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001261 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001262 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001263 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001264 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1265 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1266 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001267 break;
1268
1269 case FPSingleRegType:
1270 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001271 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1272 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001273 break;
1274
1275
1276 case FPDoubleRegType:
1277 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001278 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1279 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001280 break;
1281
1282 default:
1283 assert(0 && "Unknow RegType in CpValu2Value");
1284 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001285
Vikram S. Adve242a8082002-05-19 15:25:51 +00001286 if (MI)
1287 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001288}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001289
1290
1291
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001292
1293
1294
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001295//----------------------------------------------------------------------------
1296// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001297// a call machine instruction. The caller saving/restoring instructions are
1298// inserted like:
1299//
1300// ** caller saving instructions
1301// other instructions inserted for the call by ColorCallArg
1302// CALL instruction
1303// other instructions inserted for the call ColorCallArg
1304// ** caller restoring instructions
1305//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001306//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001307
Ruchira Sasanka91442282001-09-30 23:16:47 +00001308
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001309void
1310UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1311 vector<MachineInstr*>& instrnsAfter,
1312 MachineInstr *CallMI,
1313 const BasicBlock *BB,
1314 PhyRegAlloc &PRA) const
1315{
Vikram S. Adve242a8082002-05-19 15:25:51 +00001316 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1317
Ruchira Sasankabf915522002-01-07 21:03:42 +00001318 // has set to record which registers were saved/restored
1319 //
Chris Lattner697954c2002-01-20 22:54:45 +00001320 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001321
Vikram S. Adve242a8082002-05-19 15:25:51 +00001322 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1323
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001324 // Now find the LR of the return value of the call
1325 // The last *implicit operand* is the return value of a call
1326 // Insert it to to he PushedRegSet since we must not save that register
1327 // and restore it after the call.
1328 // We do this because, we look at the LV set *after* the instruction
1329 // to determine, which LRs must be saved across calls. The return value
1330 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001331
Vikram S. Adve242a8082002-05-19 15:25:51 +00001332 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001333
Chris Lattner699683c2002-02-04 05:59:25 +00001334 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001335 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001336 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001337
Chris Lattner699683c2002-02-04 05:59:25 +00001338 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001339 PushedRegSet.insert(
1340 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001341 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001342 }
1343
Vikram S. Adve242a8082002-05-19 15:25:51 +00001344 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001345 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001346
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001347 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001348 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001349
1350 // get the live range corresponding to live var
1351 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1352
1353 // LR can be null if it is a const since a const
1354 // doesn't have a dominating def - see Assumptions above
1355 if( LR ) {
1356
1357 if( LR->hasColor() ) {
1358
1359 unsigned RCID = (LR->getRegClass())->getID();
1360 unsigned Color = LR->getColor();
1361
1362 if ( isRegVolatile(RCID, Color) ) {
1363
1364 // if the value is in both LV sets (i.e., live before and after
1365 // the call machine instruction)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001366
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001367 unsigned Reg = getUnifiedRegNum(RCID, Color);
1368
1369 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1370
1371 // if we haven't already pushed that register
1372
1373 unsigned RegType = getRegType( LR );
1374
1375 // Now get two instructions - to push on stack and pop from stack
1376 // and add them to InstrnsBefore and InstrnsAfter of the
1377 // call instruction
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001378 //
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001379 int StackOff = PRA.mcInfo.pushTempValue(target,
1380 getSpilledRegSize(RegType));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001381
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001382 vector<MachineInstr*> AdIBef, AdIAft;
1383
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001384 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001385
1386 // We may need a scratch register to copy the saved value
1387 // to/from memory. This may itself have to insert code to
1388 // free up a scratch register. Any such code should go before
1389 // the save code.
1390 int scratchRegType = -1;
1391 int scratchReg = -1;
1392 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1393 { // Find a register not live in the LVSet before CallMI
1394 const ValueSet &LVSetBef =
1395 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1396 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1397 CallMI, AdIBef, AdIAft);
1398 assert(scratchReg != this->getInvalidRegNum());
1399 CallMI->getRegsUsed().insert(scratchReg);
1400 }
1401
1402 if (AdIBef.size() > 0)
1403 instrnsBefore.insert(instrnsBefore.end(),
1404 AdIBef.begin(), AdIBef.end());
1405
1406 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1407 scratchReg);
1408
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001409 if (AdIAft.size() > 0)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001410 instrnsBefore.insert(instrnsBefore.end(),
1411 AdIAft.begin(), AdIAft.end());
1412
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001413 //---- Insert code for popping the reg from the stack ----------
1414
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001415 // We may need a scratch register to copy the saved value
1416 // from memory. This may itself have to insert code to
1417 // free up a scratch register. Any such code should go
1418 // after the save code.
1419 //
1420 scratchRegType = -1;
1421 scratchReg = -1;
1422 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1423 { // Find a register not live in the LVSet after CallMI
1424 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1425 CallMI, AdIBef, AdIAft);
1426 assert(scratchReg != this->getInvalidRegNum());
1427 CallMI->getRegsUsed().insert(scratchReg);
1428 }
1429
1430 if (AdIBef.size() > 0)
1431 instrnsAfter.insert(instrnsAfter.end(),
1432 AdIBef.begin(), AdIBef.end());
1433
1434 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1435 scratchReg);
1436
1437 if (AdIAft.size() > 0)
1438 instrnsAfter.insert(instrnsAfter.end(),
1439 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001440
Chris Lattner748697d2002-02-05 04:20:12 +00001441 PushedRegSet.insert(Reg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001442
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001443 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001444 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001445 cerr << " -inserted caller saving instrs: Before:\n\t ";
1446 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001447 std::mem_fun(&MachineInstr::dump));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001448 cerr << " -and After:\n\t ";
1449 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001450 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001451 }
1452 } // if not already pushed
1453
1454 } // if LR has a volatile color
1455
1456 } // if LR has color
1457
1458 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001459
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001460 } // for each value in the LV set after instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +00001461}
1462
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001463
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001464//---------------------------------------------------------------------------
1465// Print the register assigned to a LR
1466//---------------------------------------------------------------------------
1467
Chris Lattner699683c2002-02-04 05:59:25 +00001468void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001469 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001470 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001471
Chris Lattner699683c2002-02-04 05:59:25 +00001472 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001473 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001474 return;
1475 }
1476
1477 // if a color is found
1478
Chris Lattner1e23ed72001-10-15 18:15:27 +00001479 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001480
Chris Lattner699683c2002-02-04 05:59:25 +00001481 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001482 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001483
Chris Lattner699683c2002-02-04 05:59:25 +00001484 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001485 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001486 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001487 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001488 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001489 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001490}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001491
1492//---------------------------------------------------------------------------
1493// This method examines instructions inserted by RegAlloc code before a
1494// machine instruction to detect invalid orders that destroy values before
1495// they are used. If it detects such conditions, it reorders the instructions.
1496//
1497// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001498// instructions inserted by RegAlloc. All such instruction MUST have
1499// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001500//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001501// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1502// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001503//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001504// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001505//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001506// Since instructions are inserted in RegAlloc, this assumes that the
1507// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001508// It also does not consider operands that are both use and def.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001509//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001510// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001511//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001512
1513void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1514 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001515 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001516
1517 /*
1518 Problem: We can have instructions inserted by RegAlloc like
1519 1. add %ox %g0 %oy
1520 2. add %oy %g0 %oz, where z!=x or z==x
1521
1522 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001523
1524 Solution:
1525 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001526
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001527 Algorithm:
1528
1529 do
1530 for each instruction 'DefInst' in the UnOrdVec
1531 for each instruction 'UseInst' that follows the DefInst
1532 if the reg defined by DefInst is used by UseInst
1533 mark DefInst as not movable in this iteration
1534 If DefInst is not marked as not-movable, move DefInst to OrdVec
1535 while all instructions in DefInst are moved to OrdVec
1536
1537 For moving, we call the move2OrdVec(). It checks whether there is a def
1538 in it for the uses in the instruction to be added to OrdVec. If there
1539 are no preceding defs, it just appends the instruction. If there is a
1540 preceding def, it puts two instructions to save the reg on stack before
1541 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001542
1543 */
1544
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001545 bool CouldMoveAll;
1546 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001547
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001548 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001549 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001550 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001551
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001552 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001553
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001554 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001555
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001556 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001557
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001558 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001559
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001560 //cerr << "\nInst in UnordVec = " << *DefInst;
1561
1562 // last operand is the def (unless for a store which has no def reg)
1563 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1564
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001565 if( DefOp.opIsDef() &&
1566 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001567
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001568 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001569
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001570 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001571
Chris Lattner697954c2002-01-20 22:54:45 +00001572 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001573 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001574
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001575 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1576
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001577 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001578 if( UseInst == NULL) continue;
1579
1580 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001581 MachineOperand& UseOp = UseInst->getOperand(0);
1582
1583 if( ! UseOp.opIsDef() &&
1584 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1585
1586 // if use is a register ...
1587
1588 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1589
1590 // if Def and this use are the same, it means that this use
1591 // is destroyed by a def before it is used
1592
1593 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001594
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001595 DefEqUse = true;
1596 CouldMoveAll = false;
1597 DebugPrint = true;
1598 break;
1599 } // if two registers are equal
1600
1601 } // if use is a register
1602
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001603 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001604
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001605 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001606
1607 // after examining all the instructions that follow the DefInst
1608 // if there are no dependencies, we can move it to the OrdVec
1609
1610 // cerr << "Moved to Ord: " << *DefInst;
1611
1612 moveInst2OrdVec(OrdVec, DefInst, PRA);
1613
1614 //OrdVec.push_back(DefInst);
1615
1616 // mark the pos of DefInst with NULL to indicate that it is
1617 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001618 *DefIt = NULL;
1619 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001620
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001621 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001622
1623 } // for all instructions in the UnordVec
1624
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001625
Chris Lattner699683c2002-02-04 05:59:25 +00001626 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001627
Chris Lattner44014412002-06-04 03:09:57 +00001628 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001629 cerr << "\nAdded instructions were reordered to:\n";
1630 for(unsigned int i=0; i < OrdVec.size(); i++)
1631 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001632 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001633}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001634
1635
1636
1637
1638
Chris Lattner697954c2002-01-20 22:54:45 +00001639void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001640 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001641 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001642 MachineOperand& UseOp = UnordInst->getOperand(0);
1643
1644 if( ! UseOp.opIsDef() &&
1645 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1646
1647 // for the use of UnordInst, see whether there is a defining instr
1648 // before in the OrdVec
1649 bool DefEqUse = false;
1650
Chris Lattner697954c2002-01-20 22:54:45 +00001651 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001652
1653 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1654
1655 MachineInstr *OrdInst = *OrdIt ;
1656
1657 MachineOperand& DefOp =
1658 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1659
1660 if( DefOp.opIsDef() &&
1661 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1662
1663 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1664
1665 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1666
1667 // we are here because there is a preceding def in the OrdVec
1668 // for the use in this intr we are going to insert. This
1669 // happened because the original code was like:
1670 // 1. add %ox %g0 %oy
1671 // 2. add %oy %g0 %ox
1672 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1673 // Now we are processing %ox of 1.
1674 // We have to
1675
1676 const int UReg = DefOp.getMachineRegNum();
1677 const int RegType = getRegType(UReg);
1678 MachineInstr *AdIBef, *AdIAft;
1679
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001680 const int StackOff = PRA.mcInfo.pushTempValue(target,
1681 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001682
1683 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001684 vector<MachineInstr*> mvec;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001685 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001686 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1687 OrdIt = OrdVec.insert(OrdIt, *MI);
1688 ++OrdIt; // OrdIt must still point to current instr we processed
1689 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001690
1691 // Load directly into DReg (%oy)
1692 MachineOperand& DOp=
1693 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1694 assert(DOp.opIsDef() && "Last operand is not the def");
1695 const int DReg = DOp.getMachineRegNum();
1696
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001697 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001698
1699 cerr << "\nFixed CIRCULAR references by reordering";
1700
1701 if( DEBUG_RA ) {
1702 cerr << "\nBefore CIRCULAR Reordering:\n";
1703 cerr << *UnordInst;
1704 cerr << *OrdInst;
1705
1706 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1707 for(unsigned i=0; i < OrdVec.size(); i++)
1708 cerr << *(OrdVec[i]);
1709 }
1710
1711 // Do not copy the UseInst to OrdVec
1712 DefEqUse = true;
1713 break;
1714
1715 }// if two registers are equal
1716
1717 } // if Def is a register
1718
1719 } // for each instr in OrdVec
1720
Chris Lattner699683c2002-02-04 05:59:25 +00001721 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001722
1723 // We didn't find a def in the OrdVec, so just append this inst
1724 OrdVec.push_back( UnordInst );
1725 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1726 }
1727
1728 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001729}