blob: b875dbed224142004e3f1381305e8a9d1e6eb729 [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adveaee67012002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee9327f02002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerd5a84702002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattnerf9986852002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner5216cc52002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner06be1802002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000023#include <iostream>
Vikram S. Advea6d94c92002-04-25 04:42:21 +000024#include <values.h>
Chris Lattner7f74a562002-01-20 22:54:45 +000025using std::cerr;
Anand Shukla458496c2002-06-25 20:55:50 +000026using std::vector;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000027
Chris Lattner5216cc52002-02-04 05:59:25 +000028UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
29 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
30 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
31
32 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
34 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adveaee67012002-07-08 23:23:12 +000036
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner5216cc52002-02-04 05:59:25 +000044//
Vikram S. Advedb1435f2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
46 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegOrder::g0);
48}
Chris Lattner5216cc52002-02-04 05:59:25 +000049
50// getCallAddressReg - returns the reg used for pushing the address when a
51// method is called. This can be used for other purposes between calls
52//
53unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000054 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegOrder::o7);
Chris Lattner5216cc52002-02-04 05:59:25 +000056}
57
58// Returns the register containing the return address.
59// It should be made sure that this register contains the return
60// value when a return instruction is reached.
61//
62unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000063 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegOrder::i7);
Chris Lattner5216cc52002-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. Advedb1435f2002-03-18 03:12:16 +000086// Get unified reg number for frame pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000087unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000088 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
89 SparcIntRegOrder::i6);
Chris Lattner5216cc52002-02-04 05:59:25 +000090}
91
Vikram S. Advedb1435f2002-03-18 03:12:16 +000092// Get unified reg number for stack pointer
Chris Lattner5216cc52002-02-04 05:59:25 +000093unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advedb1435f2002-03-18 03:12:16 +000094 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
95 SparcIntRegOrder::o6);
Chris Lattner5216cc52002-02-04 05:59:25 +000096}
97
98
Vikram S. Advea6d94c92002-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. Advee9327f02002-05-19 15:25:51 +0000134 regClassId = IntRegClassID;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000135 if (argNo >= NumOfIntArgRegs)
136 return InvalidRegNum;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000137 else
138 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Advea6d94c92002-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. Advee9327f02002-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");
Chris Lattner3091e112002-07-25 06:08:32 +0000171 return 0;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000172 }
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000173}
174
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000175
176//---------------------------------------------------------------------------
177// Finds the return address of a call sparc specific call instruction
178//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000179
Vikram S. Adveaee67012002-07-08 23:23:12 +0000180// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000181// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner5216cc52002-02-04 05:59:25 +0000182//
Vikram S. Advee9327f02002-05-19 15:25:51 +0000183int UltraSparcRegInfo::getRegType(unsigned regClassID,
184 const Type* type) const {
185 switch (regClassID) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000186 case IntRegClassID: return IntRegType;
Chris Lattnerd30f9892002-02-05 03:52:29 +0000187 case FloatRegClassID: {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000188 if (type == Type::FloatTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000189 return FPSingleRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000190 else if (type == Type::DoubleTy)
Chris Lattner5216cc52002-02-04 05:59:25 +0000191 return FPDoubleRegType;
192 assert(0 && "Unknown type in FloatRegClass");
Chris Lattnerd30f9892002-02-05 03:52:29 +0000193 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000194 case IntCCRegClassID: return IntCCRegType;
Chris Lattner5216cc52002-02-04 05:59:25 +0000195 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000196 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000197 }
198}
199
Vikram S. Advee9327f02002-05-19 15:25:51 +0000200int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
201 return getRegType(LR->getRegClass()->getID(), LR->getType());
202}
203
Chris Lattner5216cc52002-02-04 05:59:25 +0000204int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000205 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner5216cc52002-02-04 05:59:25 +0000206}
207
Vikram S. Adveaee67012002-07-08 23:23:12 +0000208int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
209 if (unifiedRegNum < 32)
Chris Lattner5216cc52002-02-04 05:59:25 +0000210 return IntRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000211 else if (unifiedRegNum < (32 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000212 return FPSingleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000213 else if (unifiedRegNum < (64 + 32))
Chris Lattner5216cc52002-02-04 05:59:25 +0000214 return FPDoubleRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000215 else if (unifiedRegNum < (64+32+4))
Chris Lattner5216cc52002-02-04 05:59:25 +0000216 return FloatCCRegType;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000217 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner5216cc52002-02-04 05:59:25 +0000218 return IntCCRegType;
219 else
Vikram S. Adveaee67012002-07-08 23:23:12 +0000220 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner5536c9c2002-02-24 23:02:40 +0000221 return 0;
Chris Lattner5216cc52002-02-04 05:59:25 +0000222}
223
224
Vikram S. Adveaee67012002-07-08 23:23:12 +0000225// To find the register class used for a specified Type
226//
227unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattner3091e112002-07-25 06:08:32 +0000228 bool isCCReg) const {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000229 Type::PrimitiveID ty = type->getPrimitiveID();
230 unsigned res;
231
232 // FIXME: Comparing types like this isn't very safe...
233 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
234 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
235 res = IntRegClassID; // sparc int reg (ty=0: void)
236 else if (ty <= Type::DoubleTyID)
237 res = FloatRegClassID; // sparc float reg class
238 else {
239 //std::cerr << "TypeID: " << ty << "\n";
240 assert(0 && "Cannot resolve register class for type");
241 return 0;
242 }
243
244 if(isCCReg)
245 return res + 2; // corresponidng condition code regiser
246 else
247 return res;
248}
249
250// To find the register class to which a specified register belongs
251//
252unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
253 unsigned classId = 0;
254 (void) getClassRegNum(unifiedRegNum, classId);
255 return classId;
256}
257
258unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
259 switch(regType) {
260 case IntRegType: return IntRegClassID;
261 case FPSingleRegType:
262 case FPDoubleRegType: return FloatRegClassID;
263 case IntCCRegType: return IntCCRegClassID;
264 case FloatCCRegType: return FloatCCRegClassID;
265 default:
266 assert(0 && "Invalid register type in getRegClassIDOfRegType");
267 return 0;
268 }
269}
270
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000271//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000272// Suggests a register for the ret address in the RET machine instruction.
273// We always suggest %i7 by convention.
274//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000275void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000276 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000277
Vikram S. Adveaee67012002-07-08 23:23:12 +0000278 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve84982772001-10-22 13:41:12 +0000279
Vikram S. Adveaee67012002-07-08 23:23:12 +0000280 // return address is always mapped to i7 so set it immediately
281 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
282 SparcIntRegOrder::i7));
Vikram S. Adve84982772001-10-22 13:41:12 +0000283
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000284 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000285 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000286 // we have to test later whether it received the suggested color.
287 // In that case, a LR has to be created at the start of method.
288 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000289
Vikram S. Adveaee67012002-07-08 23:23:12 +0000290 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000291 // const Value *RetAddrVal = MO.getVRegValue();
292 // assert( RetAddrVal && "LR for ret address must be created at start");
293 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
294 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adveaee67012002-07-08 23:23:12 +0000295 // SparcIntRegOrdr::i7) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000296}
297
298
299//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000300// Suggests a register for the ret address in the JMPL/CALL machine instr.
301// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000302//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000303void UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000304 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000305 std::vector<RegClass *> RCList) const {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000306 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
307 const Value *RetAddrVal = argDesc->getReturnAddrReg();
308 assert(RetAddrVal && "Return address value is required");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000309
Vikram S. Advee9327f02002-05-19 15:25:51 +0000310 // create a new LR for the return address and color it
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000311 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000312 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000313 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
314 RetAddrLR->setRegClass( RCList[RegClassID] );
315 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
316 LRI.addLRToMap( RetAddrVal, RetAddrLR);
317
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000318}
319
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000320
321
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000322
323//---------------------------------------------------------------------------
324// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000325// According to the Sparc ABI, the first 6 incoming args are in
326// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000327// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000328// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000329//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000330void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000331 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000332{
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000333 // check if this is a varArgs function. needed for choosing regs.
334 bool isVarArgs = isVarArgsFunction(Meth->getType());
335
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000336 // for each argument. count INT and FP arguments separately.
Chris Lattner7076ff22002-06-25 16:13:21 +0000337 unsigned argNo=0, intArgNo=0, fpArgNo=0;
338 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
339 I != E; ++I, ++argNo) {
340 // get the LR of arg
341 LiveRange *LR = LRI.getLiveRangeForValue(I);
342 assert(LR && "No live range found for method arg");
343
344 unsigned regType = getRegType(LR);
345 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
346
347 int regNum = (regType == IntRegType)
348 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
349 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
350 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
351 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
352
353 if(regNum != InvalidRegNum)
354 LR->setSuggestedColor(regNum);
355 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000356}
357
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000358
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000359//---------------------------------------------------------------------------
360// This method is called after graph coloring to move incoming args to
361// the correct hardware registers if they did not receive the correct
362// (suggested) color through graph coloring.
363//---------------------------------------------------------------------------
Chris Lattnerf739fa82002-04-08 22:03:57 +0000364void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner5216cc52002-02-04 05:59:25 +0000365 LiveRangeInfo &LRI,
366 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000367
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000368 // check if this is a varArgs function. needed for choosing regs.
369 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000370 MachineInstr *AdMI;
371
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000372 // for each argument
Chris Lattner7076ff22002-06-25 16:13:21 +0000373 // for each argument. count INT and FP arguments separately.
374 unsigned argNo=0, intArgNo=0, fpArgNo=0;
375 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
376 I != E; ++I, ++argNo) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000377 // get the LR of arg
Chris Lattner7076ff22002-06-25 16:13:21 +0000378 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000379 assert( LR && "No live range found for method arg");
380
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000381 unsigned regType = getRegType( LR );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000382 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000383
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000384 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000385 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000386 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000387 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000388 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000389 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
390
391 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000392 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
393 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
394 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
395 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000396
397 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000398 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000399 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000400 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000401
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000402 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000403
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000404 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
405
406 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000407 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000408 if( UniLRReg == UniArgReg )
409 continue;
410
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000411 // We are here because the LR did not receive the suggested
412 // but LR received another register.
413 // Now we have to copy the %i reg (or stack pos of arg)
414 // to the register the LR was colored with.
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000415
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000416 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000417 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000418 //
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000419 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000420 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Advee9327f02002-05-19 15:25:51 +0000421 assert(0 && "This could should work but it is not tested yet");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000422
423 // It is a variable argument call: the float reg must go in a %o reg.
424 // We have to move an int reg to a float reg via memory.
425 //
426 assert(isVarArgs &&
427 RegClassID == FloatRegClassID &&
428 regClassIDOfArgReg == IntRegClassID &&
429 "This should only be an Int register for an FP argument");
430
431 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
432 getSpilledRegSize(regType));
Vikram S. Adveaee67012002-07-08 23:23:12 +0000433 cpReg2MemMI(FirstAI->InstrnsBefore,
434 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000435
Vikram S. Adveaee67012002-07-08 23:23:12 +0000436 cpMem2RegMI(FirstAI->InstrnsBefore,
437 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000438 }
439 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000440 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000441 }
442 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000443 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000444
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000445 // Now the arg is coming on stack. Since the LR recieved a register,
446 // we just have to load the arg on stack into that register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000447 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000448 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000449 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000450 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
451 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000452
Vikram S. Adveaee67012002-07-08 23:23:12 +0000453 cpMem2RegMI(FirstAI->InstrnsBefore,
454 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000455 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000456
457 } // if LR received a color
458
459 else {
460
461 // Now, the LR did not receive a color. But it has a stack offset for
462 // spilling.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000463 // So, if the arg is coming in UniArgReg register, we can just move
464 // that on to the stack pos of LR
465
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000466 if( isArgInReg ) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000467
468 if( regClassIDOfArgReg != RegClassID ) {
469 assert(0 &&
470 "FP arguments to a varargs function should be explicitly "
471 "copied to/from int registers by instruction selection!");
472
473 // It must be a float arg for a variable argument call, which
474 // must come in a %o reg. Move the int reg to the stack.
475 //
476 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
477 "This should only be an Int register for an FP argument");
478
Vikram S. Adveaee67012002-07-08 23:23:12 +0000479 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
480 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000481 }
482 else {
Vikram S. Adveaee67012002-07-08 23:23:12 +0000483 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
484 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000485 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000486 }
487
488 else {
489
490 // Now the arg is coming on stack. Since the LR did NOT
491 // recieved a register as well, it is allocated a stack position. We
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000492 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000493 // since this method is called before any other method that makes
494 // uses of the stack pos of the LR (e.g., updateMachineInstr)
495
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000496 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000497 int offsetFromFP =
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000498 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
499 argNo);
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000500
501 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000502 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000503
504 }
505
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000506 } // for each incoming argument
507
508}
509
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000510
511
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000512//---------------------------------------------------------------------------
513// This method is called before graph coloring to suggest colors to the
514// outgoing call args and the return value of the call.
515//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000516void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000517 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000518 std::vector<RegClass *> RCList) const {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000519 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000520
Vikram S. Advee9327f02002-05-19 15:25:51 +0000521 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000522
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000523 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000524
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000525 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000526 // will be in %o0 if the value is an integer type, or in %f0 if the
527 // value is a float type.
528
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000529 // the return value cannot have a LR in machine instruction since it is
530 // only defined by the call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000531
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000532 // if type is not void, create a new live range and set its
533 // register class and add to LRI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000534
Vikram S. Advee9327f02002-05-19 15:25:51 +0000535 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000536
Chris Lattner5216cc52002-02-04 05:59:25 +0000537 if (RetVal) {
538 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000539 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000540
Chris Lattner5216cc52002-02-04 05:59:25 +0000541 // create a new LR for the return value
542 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000543 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000544 unsigned RegClassID = getRegClassIDOfValue(RetVal);
545 RetValLR->setRegClass(RCList[RegClassID]);
546 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000547
548 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000549
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000550 if( RegClassID == IntRegClassID )
551 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
552 else if (RegClassID == FloatRegClassID )
553 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
554 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000555 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000556
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000557
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000558 // Now suggest colors for arguments (operands) of the call instruction.
559 // Colors are suggested only if the arg number is smaller than the
560 // the number of registers allocated for argument passing.
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000561 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000562
Vikram S. Advee9327f02002-05-19 15:25:51 +0000563 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000564
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000565 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
566 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000567
Vikram S. Advee9327f02002-05-19 15:25:51 +0000568 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000569
570 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000571 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000572
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000573 // not possible to have a null LR since all args (even consts)
574 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000575 if (!LR) {
576 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000577 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000578 }
579
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000580 unsigned regType = getRegType( LR );
581 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000582
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000583 // Choose a register for this arg depending on whether it is
Vikram S. Advee9327f02002-05-19 15:25:51 +0000584 // an INT or FP value. Here we ignore whether or not it is a
585 // varargs calls, because FP arguments will be explicitly copied
586 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000587 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000588 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
589 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
590 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
591 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000592
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000593 // If a register could be allocated, use it.
594 // If not, do NOTHING as this will be colored as a normal value.
595 if(regNum != InvalidRegNum)
596 LR->setSuggestedColor(regNum);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000597
Vikram S. Advee9327f02002-05-19 15:25:51 +0000598 // Repeat for the second copy of the argument, which would be
599 // an FP argument being passed to a function with no prototype
600 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
601 if (argCopy != NULL)
602 {
603 assert(regType != IntRegType && argCopy->getType()->isIntegral()
604 && "Must be passing copy of FP argument in int register");
605 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
606 argNo, intArgNo, fpArgNo-1,
607 regClassIDOfArgReg);
608 assert(copyRegNum != InvalidRegNum);
609 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
610 copyLR->setSuggestedColor(copyRegNum);
611 }
612
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000613 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000614
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000615}
616
617
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000618//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +0000619// Helper method for UltraSparcRegInfo::colorCallArgs().
620//---------------------------------------------------------------------------
621
622void
Vikram S. Adveaee67012002-07-08 23:23:12 +0000623UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000624 AddedInstrns *CallAI,
625 PhyRegAlloc &PRA, LiveRange* LR,
626 unsigned regType, unsigned RegClassID,
627 int UniArgRegOrNone, unsigned int argNo,
628 std::vector<MachineInstr *>& AddedInstrnsBefore)
629 const
630{
631 MachineInstr *AdMI;
632 bool isArgInReg = false;
633 unsigned UniArgReg = MAXINT; // unused unless initialized below
634 if (UniArgRegOrNone != InvalidRegNum)
635 {
636 isArgInReg = true;
637 UniArgReg = (unsigned) UniArgRegOrNone;
Vikram S. Adveaee67012002-07-08 23:23:12 +0000638 CallMI->getRegsUsed().insert(UniArgReg); // mark the reg as used
Vikram S. Advee9327f02002-05-19 15:25:51 +0000639 }
640
641 if (LR->hasColor()) {
642 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
643
644 // if LR received the correct color, nothing to do
645 if( isArgInReg && UniArgReg == UniLRReg )
646 return;
647
648 // The LR is allocated to a register UniLRReg and must be copied
649 // to UniArgReg or to the stack slot.
650 //
651 if( isArgInReg ) {
652 // Copy UniLRReg to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000653 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000654 }
655 else {
656 // Copy UniLRReg to the stack to pass the arg on stack.
657 const MachineFrameInfo& frameInfo = target.getFrameInfo();
658 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000659 cpReg2MemMI(CallAI->InstrnsBefore,
660 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000661 }
662
663 } else { // LR is not colored (i.e., spilled)
664
665 if( isArgInReg ) {
666 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adveaee67012002-07-08 23:23:12 +0000667 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
668 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000669 // Now add the instruction
670 }
671
672 else {
673 // Now, we have to pass the arg on stack. Since LR also did NOT
674 // receive a register we have to move an argument in memory to
675 // outgoing parameter on stack.
676 // Use TReg to load and store the value.
677 // Use TmpOff to save TReg, since that may have a live value.
678 //
679 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
680 int TmpOff = PRA.mcInfo.pushTempValue(target,
681 getSpilledRegSize(getRegType(LR)));
682 const MachineFrameInfo& frameInfo = target.getFrameInfo();
683 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
684
685 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
686
687 // Sequence:
688 // (1) Save TReg on stack
689 // (2) Load LR value into TReg from stack pos of LR
690 // (3) Store Treg on outgoing Arg pos on stack
691 // (4) Load the old value of TReg from stack to TReg (restore it)
692 //
693 // OPTIMIZE THIS:
694 // When reverse pointers in MahineInstr are introduced:
695 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
696 // needed only if this fails. Currently, we cannot call the
697 // above method since we cannot find LVSetBefore without the BB
698 //
699 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
700 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adveaee67012002-07-08 23:23:12 +0000701 cpReg2MemMI(CallAI->InstrnsBefore,
702 TReg, getFramePointer(), TmpOff, regType);
703 cpMem2RegMI(CallAI->InstrnsBefore,
704 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
705 cpReg2MemMI(CallAI->InstrnsBefore,
706 TReg, getStackPointer(), argOffset, regType);
707 cpMem2RegMI(CallAI->InstrnsBefore,
708 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000709 }
710 }
711}
712
713//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000714// After graph coloring, we have call this method to see whehter the return
715// value and the call args received the correct colors. If not, we have
716// to instert copy instructions.
717//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000718
Vikram S. Adveaee67012002-07-08 23:23:12 +0000719void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000720 LiveRangeInfo &LRI,
721 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000722 PhyRegAlloc &PRA,
723 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000724
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000725 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
726
Vikram S. Advee9327f02002-05-19 15:25:51 +0000727 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
728
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000729 // First color the return value of the call.
730 // If there is a LR for the return value, it means this
731 // method returns a value
732
733 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000734
Vikram S. Advee9327f02002-05-19 15:25:51 +0000735 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000736
Chris Lattner30e8fb62002-02-05 01:43:49 +0000737 if (RetVal) {
738 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000739
Chris Lattner30e8fb62002-02-05 01:43:49 +0000740 if (!RetValLR) {
741 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000742 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000743 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000744
745 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000746 bool recvCorrectColor;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000747 unsigned CorrectCol; // correct color for ret value
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000748 unsigned UniRetReg; // unified number for CorrectCol
749
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000750 if(RegClassID == IntRegClassID)
751 CorrectCol = SparcIntRegOrder::o0;
752 else if(RegClassID == FloatRegClassID)
753 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000754 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000755 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000756 return;
757 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000758
759 // convert to unified number
760 UniRetReg = this->getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000761
Vikram S. Adveaee67012002-07-08 23:23:12 +0000762 // Mark the register as used by this instruction
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000763 CallMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +0000764
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000765 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000766 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
767 : false;
768
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000769 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000770 // put copy instruction
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000771 if( !recvCorrectColor ) {
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000772
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000773 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000774
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000775 if( RetValLR->hasColor() ) {
776
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000777 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000778
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000779 // the return value is coming in UniRetReg but has to go into
780 // the UniRetLRReg
781
Vikram S. Adveaee67012002-07-08 23:23:12 +0000782 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000783
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000784 } // if LR has color
785 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000786
787 // if the LR did NOT receive a color, we have to move the return
788 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000789
Vikram S. Adveaee67012002-07-08 23:23:12 +0000790 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
791 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000792 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000793
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000794 } // the LR didn't receive the suggested color
795
796 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000797
798
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000799 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000800 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000801 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000802
Chris Lattner7f74a562002-01-20 22:54:45 +0000803 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000804
805 unsigned NumOfCallArgs = argDesc->getNumArgs();
806
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000807 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
808 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000809
Vikram S. Advee9327f02002-05-19 15:25:51 +0000810 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
811
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000812 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000813 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000814
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000815 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000816 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000817
Vikram S. Advee9327f02002-05-19 15:25:51 +0000818 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000819 // Also find the correct register the argument must use (UniArgReg)
820 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000821 bool isArgInReg = false;
Vikram S. Advee9327f02002-05-19 15:25:51 +0000822 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000823 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
824
Vikram S. Advee9327f02002-05-19 15:25:51 +0000825 // Find the register that must be used for this arg, depending on
826 // whether it is an INT or FP value. Here we ignore whether or not it
827 // is a varargs calls, because FP arguments will be explicitly copied
828 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000829 int regNum = (regType == IntRegType)
Vikram S. Advee9327f02002-05-19 15:25:51 +0000830 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
831 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
832 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
833 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000834
835 if(regNum != InvalidRegNum) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000836 isArgInReg = true;
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000837 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Advee9327f02002-05-19 15:25:51 +0000838 assert(regClassIDOfArgReg == RegClassID &&
839 "Moving values between reg classes must happen during selection");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000840 }
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000841
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000842 // not possible to have a null LR since all args (even consts)
843 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000844 if (!LR) {
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000845 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Advee9327f02002-05-19 15:25:51 +0000846 assert(LR && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000847 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000848
849 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
850 UniArgReg, argNo, AddedInstrnsBefore);
851
852 // Repeat for the second copy of the argument, which would be
853 // an FP argument being passed to a function with no prototype.
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000854 // It may either be passed as a copy in an integer register
855 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Advee9327f02002-05-19 15:25:51 +0000856 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
857 if (argCopy != NULL)
858 {
859 assert(regType != IntRegType && argCopy->getType()->isIntegral()
860 && "Must be passing copy of FP argument in int register");
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000861
Vikram S. Advee9327f02002-05-19 15:25:51 +0000862 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
863 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
864
865 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
866 argNo, intArgNo, fpArgNo-1,
867 regClassIDOfArgReg);
868 assert(copyRegNum != InvalidRegNum);
869 assert(regClassIDOfArgReg == copyRegClassID &&
870 "Moving values between reg classes must happen during selection");
871
872 InitializeOutgoingArg(CallMI, CallAI, PRA,
873 LRI.getLiveRangeForValue(argCopy), copyRegType,
874 copyRegClassID, copyRegNum, argNo,
875 AddedInstrnsBefore);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000876 }
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000877
878 if (regNum != InvalidRegNum &&
879 argDesc->getArgInfo(i).usesStackSlot())
880 {
881 // Pass the argument via the stack in addition to regNum
882 assert(regType != IntRegType && "Passing an integer arg. twice?");
883 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
884 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
885 InvalidRegNum, argNo, AddedInstrnsBefore);
886 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000887 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000888
Vikram S. Advee9327f02002-05-19 15:25:51 +0000889 // If we added any instruction before the call instruction, verify
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000890 // that they are in the proper order and if not, reorder them
Vikram S. Advee9327f02002-05-19 15:25:51 +0000891 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000892 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner5216cc52002-02-04 05:59:25 +0000893 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000894
Chris Lattner5216cc52002-02-04 05:59:25 +0000895 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000896 cerr << "\nCalling reorder with instrns: \n";
897 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
898 cerr << *(AddedInstrnsBefore[i]);
899 }
900
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000901 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
902 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
903 && "Dropped some instructions when reordering!");
904
Chris Lattner5216cc52002-02-04 05:59:25 +0000905 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000906 cerr << "\nAfter reordering instrns: \n";
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000907 for(unsigned i = 0; i < ReorderedVec.size(); i++)
908 cerr << *ReorderedVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000909 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000910 }
Vikram S. Advee9327f02002-05-19 15:25:51 +0000911
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000912 // Now insert caller saving code for this call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000913 //
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000914 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
915 CallMI, BB, PRA);
916
917 // Then insert the final reordered code for the call arguments.
918 //
919 for(unsigned i=0; i < ReorderedVec.size(); i++)
920 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000921}
922
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000923//---------------------------------------------------------------------------
924// This method is called for an LLVM return instruction to identify which
925// values will be returned from this method and to suggest colors.
926//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000927void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000928 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000929
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000930 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000931
Vikram S. Adveaee67012002-07-08 23:23:12 +0000932 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000933
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000934 // if there is an implicit ref, that has to be the ret value
935 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000936
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000937 // The first implicit operand is the return value of a return instr
938 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000939
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000940 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000941
Chris Lattner30e8fb62002-02-05 01:43:49 +0000942 if (!LR) {
943 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
944 assert(0 && "No LR for return value of non-void method");
945 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000946
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000947 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000948
Chris Lattner5216cc52002-02-04 05:59:25 +0000949 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000950 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000951 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000952 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000953 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000954}
955
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000956
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000957
958//---------------------------------------------------------------------------
959// Colors the return value of a method to %i0 or %f0, if possible. If it is
960// not possilbe to directly color the LR, insert a copy instruction to move
961// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
962// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000963//---------------------------------------------------------------------------
Vikram S. Adveaee67012002-07-08 23:23:12 +0000964void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000965 LiveRangeInfo &LRI,
966 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967
Chris Lattner5216cc52002-02-04 05:59:25 +0000968 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000970 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000971 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000972
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000973 // The first implicit operand is the return value of a return instr
974 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000975
Chris Lattner5216cc52002-02-04 05:59:25 +0000976 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000977
Chris Lattner30e8fb62002-02-05 01:43:49 +0000978 if (!LR) {
979 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
980 // assert( LR && "No LR for return value of non-void method");
981 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000982 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000983
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000984 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Advea6d94c92002-04-25 04:42:21 +0000985 unsigned regType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000986
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000987 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000988 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000989 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000990 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000991 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000992 else {
Chris Lattner5216cc52002-02-04 05:59:25 +0000993 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000994 return;
995 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000996
Vikram S. Adve4aee77c702002-07-10 21:36:00 +0000997 // convert to unified number
998 unsigned UniRetReg = this->getUnifiedRegNum(RegClassID, CorrectCol);
999
Vikram S. Adveaee67012002-07-08 23:23:12 +00001000 // Mark the register as used by this instruction
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001001 RetMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001002
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001003 // if the LR received the correct color, NOTHING to do
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001004
Chris Lattner5216cc52002-02-04 05:59:25 +00001005 if (LR->hasColor() && LR->getColor() == CorrectCol)
1006 return;
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001007
Chris Lattner5216cc52002-02-04 05:59:25 +00001008 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001009
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +00001010 // We are here because the LR was allocted a regiter
1011 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001012
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001013 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001014
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001015 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001016
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001017 // the LR received UniLRReg but must be colored with UniRetReg
1018 // to pass as the return value
Vikram S. Adveaee67012002-07-08 23:23:12 +00001019 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001020 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001021 else { // if the LR is spilled
Vikram S. Adveaee67012002-07-08 23:23:12 +00001022 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1023 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner7f74a562002-01-20 22:54:45 +00001024 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001025 }
1026
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001027 } // if there is a return value
1028
1029}
1030
Vikram S. Adveaee67012002-07-08 23:23:12 +00001031//---------------------------------------------------------------------------
1032// Check if a specified register type needs a scratch register to be
1033// copied to/from memory. If it does, the reg. type that must be used
1034// for scratch registers is returned in scratchRegType.
1035//
1036// Only the int CC register needs such a scratch register.
1037// The FP CC registers can (and must) be copied directly to/from memory.
1038//---------------------------------------------------------------------------
1039
1040bool
1041UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1042 int& scratchRegType) const
1043{
1044 if (RegType == IntCCRegType)
1045 {
1046 scratchRegType = IntRegType;
1047 return true;
1048 }
1049 return false;
1050}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001051
1052//---------------------------------------------------------------------------
1053// Copy from a register to register. Register number must be the unified
Vikram S. Adveaee67012002-07-08 23:23:12 +00001054// register number.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001055//---------------------------------------------------------------------------
1056
Vikram S. Advee9327f02002-05-19 15:25:51 +00001057void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001058UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1059 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001060 unsigned DestReg,
Vikram S. Adveaee67012002-07-08 23:23:12 +00001061 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001062 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001063 "Invalid Register");
1064
1065 MachineInstr * MI = NULL;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001066
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001067 switch( RegType ) {
1068
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001069 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001070 if (this->getRegType(DestReg) == IntRegType)
1071 { // copy intCC reg to int reg
1072 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1073 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1074 }
1075 else
1076 { // copy int reg to intCC reg
1077 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1078 assert(this->getRegType(SrcReg) == IntRegType
1079 && "Can only copy CC reg to/from integer reg");
1080 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1081 }
1082 break;
1083
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001084 case FloatCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001085 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Advee9327f02002-05-19 15:25:51 +00001086 break;
1087
1088 case IntRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001089 MI = Create3OperandInstr_Reg(ADD, SrcReg, this->getZeroRegNum(), DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001090 break;
Vikram S. Advee9327f02002-05-19 15:25:51 +00001091
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001092 case FPSingleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001093 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001094 break;
1095
1096 case FPDoubleRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001097 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001098 break;
1099
1100 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001101 assert(0 && "Unknown RegType");
Vikram S. Adveaee67012002-07-08 23:23:12 +00001102 break;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001103 }
Vikram S. Advee9327f02002-05-19 15:25:51 +00001104
1105 if (MI)
1106 mvec.push_back(MI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001107}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001108
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001109//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001110// Copy from a register to memory (i.e., Store). Register number must
1111// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001112//---------------------------------------------------------------------------
1113
1114
Vikram S. Advee9327f02002-05-19 15:25:51 +00001115void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001116UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1117 unsigned SrcReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001118 unsigned DestPtrReg,
1119 int Offset, int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001120 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001121 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001122 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001123 case IntRegType:
1124 MI = new MachineInstr(STX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001125 MI->SetMachineOperandReg(0, SrcReg, false);
1126 MI->SetMachineOperandReg(1, DestPtrReg, false);
1127 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1128 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001129 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001130 break;
1131
1132 case FPSingleRegType:
1133 MI = new MachineInstr(ST, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001134 MI->SetMachineOperandReg(0, SrcReg, false);
1135 MI->SetMachineOperandReg(1, DestPtrReg, false);
1136 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1137 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001138 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001139 break;
1140
1141 case FPDoubleRegType:
1142 MI = new MachineInstr(STD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001143 MI->SetMachineOperandReg(0, SrcReg, false);
1144 MI->SetMachineOperandReg(1, DestPtrReg, false);
1145 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1146 (int64_t) Offset);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001147 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001148 break;
1149
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001150 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001151 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
1152 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1153
1154 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1155 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1156 mvec.push_back(MI);
1157
1158 this->cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
1159 break;
1160
1161 case FloatCCRegType:
1162 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1163 MI = new MachineInstr(STXFSR, 3);
1164 MI->SetMachineOperandReg(0, SrcReg, false);
1165 MI->SetMachineOperandReg(1, DestPtrReg, false);
1166 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1167 (int64_t) Offset);
1168 mvec.push_back(MI);
1169 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001170
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001171 default:
Vikram S. Advee9327f02002-05-19 15:25:51 +00001172 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001173 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001174}
1175
1176
1177//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001178// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001179// register number
1180//---------------------------------------------------------------------------
1181
1182
Vikram S. Advee9327f02002-05-19 15:25:51 +00001183void
Vikram S. Adveaee67012002-07-08 23:23:12 +00001184UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1185 unsigned SrcPtrReg,
Vikram S. Advee9327f02002-05-19 15:25:51 +00001186 int Offset,
1187 unsigned DestReg,
1188 int RegType,
Chris Lattner3091e112002-07-25 06:08:32 +00001189 int scratchReg) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001190 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001191 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001192 case IntRegType:
1193 MI = new MachineInstr(LDX, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001194 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1195 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1196 (int64_t) Offset);
1197 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001198 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001199 break;
1200
1201 case FPSingleRegType:
1202 MI = new MachineInstr(LD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001203 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1204 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1205 (int64_t) Offset);
1206 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001207 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001208 break;
1209
1210 case FPDoubleRegType:
1211 MI = new MachineInstr(LDD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001212 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1213 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1214 (int64_t) Offset);
1215 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001216 mvec.push_back(MI);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001217 break;
1218
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001219 case IntCCRegType:
Vikram S. Adveaee67012002-07-08 23:23:12 +00001220 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
1221 assert(this->getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1222 this->cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
1223
1224 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1225 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1226 mvec.push_back(MI);
1227
1228 break;
1229
1230 case FloatCCRegType:
1231 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1232 MI = new MachineInstr(LDXFSR, 3);
1233 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1234 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1235 (int64_t) Offset);
1236 MI->SetMachineOperandReg(2, DestReg, true);
1237 mvec.push_back(MI);
1238 break;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001239
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001240 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001241 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001242 }
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001243}
1244
1245
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001246//---------------------------------------------------------------------------
1247// Generate a copy instruction to copy a value to another. Temporarily
1248// used by PhiElimination code.
1249//---------------------------------------------------------------------------
1250
1251
Vikram S. Advee9327f02002-05-19 15:25:51 +00001252void
1253UltraSparcRegInfo::cpValue2Value(Value *Src,
1254 Value *Dest,
1255 vector<MachineInstr*>& mvec) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001256 int RegType = getRegType( Src );
1257
1258 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001259
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001260 MachineInstr * MI = NULL;
1261
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001262 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001263 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001264 MI = new MachineInstr(ADD, 3);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001265 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1266 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1267 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001268 break;
1269
1270 case FPSingleRegType:
1271 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001272 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1273 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001274 break;
1275
1276
1277 case FPDoubleRegType:
1278 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advedb1435f2002-03-18 03:12:16 +00001279 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1280 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001281 break;
1282
1283 default:
1284 assert(0 && "Unknow RegType in CpValu2Value");
1285 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001286
Vikram S. Advee9327f02002-05-19 15:25:51 +00001287 if (MI)
1288 mvec.push_back(MI);
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001289}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001290
1291
1292
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001293
1294
1295
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001296//----------------------------------------------------------------------------
1297// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001298// a call machine instruction. The caller saving/restoring instructions are
1299// inserted like:
1300//
1301// ** caller saving instructions
1302// other instructions inserted for the call by ColorCallArg
1303// CALL instruction
1304// other instructions inserted for the call ColorCallArg
1305// ** caller restoring instructions
1306//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001307//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001308
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001309
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001310void
1311UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1312 vector<MachineInstr*>& instrnsAfter,
1313 MachineInstr *CallMI,
1314 const BasicBlock *BB,
1315 PhyRegAlloc &PRA) const
1316{
Vikram S. Advee9327f02002-05-19 15:25:51 +00001317 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1318
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001319 // has set to record which registers were saved/restored
1320 //
Chris Lattnere98dd5f2002-07-24 21:21:32 +00001321 hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001322
Vikram S. Advee9327f02002-05-19 15:25:51 +00001323 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1324
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001325 // Now find the LR of the return value of the call
1326 // The last *implicit operand* is the return value of a call
1327 // Insert it to to he PushedRegSet since we must not save that register
1328 // and restore it after the call.
1329 // We do this because, we look at the LV set *after* the instruction
1330 // to determine, which LRs must be saved across calls. The return value
1331 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001332
Vikram S. Advee9327f02002-05-19 15:25:51 +00001333 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001334
Chris Lattner5216cc52002-02-04 05:59:25 +00001335 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001336 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001337 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001338
Chris Lattner5216cc52002-02-04 05:59:25 +00001339 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001340 PushedRegSet.insert(
1341 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001342 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001343 }
1344
Vikram S. Advee9327f02002-05-19 15:25:51 +00001345 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner7e5ee422002-02-05 04:20:12 +00001346 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001347
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001348 // for each live var in live variable set after machine inst
Chris Lattner7e5ee422002-02-05 04:20:12 +00001349 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001350
1351 // get the live range corresponding to live var
1352 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1353
1354 // LR can be null if it is a const since a const
1355 // doesn't have a dominating def - see Assumptions above
1356 if( LR ) {
1357
1358 if( LR->hasColor() ) {
1359
1360 unsigned RCID = (LR->getRegClass())->getID();
1361 unsigned Color = LR->getColor();
1362
1363 if ( isRegVolatile(RCID, Color) ) {
1364
1365 // if the value is in both LV sets (i.e., live before and after
1366 // the call machine instruction)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001367
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001368 unsigned Reg = getUnifiedRegNum(RCID, Color);
1369
1370 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1371
1372 // if we haven't already pushed that register
1373
1374 unsigned RegType = getRegType( LR );
1375
1376 // Now get two instructions - to push on stack and pop from stack
1377 // and add them to InstrnsBefore and InstrnsAfter of the
1378 // call instruction
Vikram S. Adveaee67012002-07-08 23:23:12 +00001379 //
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001380 int StackOff = PRA.mcInfo.pushTempValue(target,
1381 getSpilledRegSize(RegType));
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001382
Vikram S. Adveaee67012002-07-08 23:23:12 +00001383 vector<MachineInstr*> AdIBef, AdIAft;
1384
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001385 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adveaee67012002-07-08 23:23:12 +00001386
1387 // We may need a scratch register to copy the saved value
1388 // to/from memory. This may itself have to insert code to
1389 // free up a scratch register. Any such code should go before
1390 // the save code.
1391 int scratchRegType = -1;
1392 int scratchReg = -1;
1393 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1394 { // Find a register not live in the LVSet before CallMI
1395 const ValueSet &LVSetBef =
1396 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1397 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1398 CallMI, AdIBef, AdIAft);
1399 assert(scratchReg != this->getInvalidRegNum());
1400 CallMI->getRegsUsed().insert(scratchReg);
1401 }
1402
1403 if (AdIBef.size() > 0)
1404 instrnsBefore.insert(instrnsBefore.end(),
1405 AdIBef.begin(), AdIBef.end());
1406
1407 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1408 scratchReg);
1409
Vikram S. Adve4aee77c702002-07-10 21:36:00 +00001410 if (AdIAft.size() > 0)
Vikram S. Adveaee67012002-07-08 23:23:12 +00001411 instrnsBefore.insert(instrnsBefore.end(),
1412 AdIAft.begin(), AdIAft.end());
1413
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001414 //---- Insert code for popping the reg from the stack ----------
1415
Vikram S. Adveaee67012002-07-08 23:23:12 +00001416 // We may need a scratch register to copy the saved value
1417 // from memory. This may itself have to insert code to
1418 // free up a scratch register. Any such code should go
1419 // after the save code.
1420 //
1421 scratchRegType = -1;
1422 scratchReg = -1;
1423 if (this->regTypeNeedsScratchReg(RegType, scratchRegType))
1424 { // Find a register not live in the LVSet after CallMI
1425 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1426 CallMI, AdIBef, AdIAft);
1427 assert(scratchReg != this->getInvalidRegNum());
1428 CallMI->getRegsUsed().insert(scratchReg);
1429 }
1430
1431 if (AdIBef.size() > 0)
1432 instrnsAfter.insert(instrnsAfter.end(),
1433 AdIBef.begin(), AdIBef.end());
1434
1435 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1436 scratchReg);
1437
1438 if (AdIAft.size() > 0)
1439 instrnsAfter.insert(instrnsAfter.end(),
1440 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001441
Chris Lattner7e5ee422002-02-05 04:20:12 +00001442 PushedRegSet.insert(Reg);
Vikram S. Adveaee67012002-07-08 23:23:12 +00001443
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001444 if(DEBUG_RA) {
Vikram S. Advee9327f02002-05-19 15:25:51 +00001445 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001446 cerr << " -inserted caller saving instrs: Before:\n\t ";
1447 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001448 std::mem_fun(&MachineInstr::dump));
Vikram S. Adveaee67012002-07-08 23:23:12 +00001449 cerr << " -and After:\n\t ";
1450 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shukla7e882db2002-07-09 19:16:59 +00001451 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001452 }
1453 } // if not already pushed
1454
1455 } // if LR has a volatile color
1456
1457 } // if LR has color
1458
1459 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001460
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001461 } // for each value in the LV set after instruction
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001462}
1463
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001464
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001465//---------------------------------------------------------------------------
1466// Print the register assigned to a LR
1467//---------------------------------------------------------------------------
1468
Chris Lattner5216cc52002-02-04 05:59:25 +00001469void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001470 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001471 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001472
Chris Lattner5216cc52002-02-04 05:59:25 +00001473 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001474 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001475 return;
1476 }
1477
1478 // if a color is found
1479
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001480 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001481
Chris Lattner5216cc52002-02-04 05:59:25 +00001482 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001483 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001484
Chris Lattner5216cc52002-02-04 05:59:25 +00001485 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001486 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattnerd30f9892002-02-05 03:52:29 +00001487 if( LR->getType() == Type::DoubleTy)
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001488 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001489 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001490 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001491}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001492
1493//---------------------------------------------------------------------------
1494// This method examines instructions inserted by RegAlloc code before a
1495// machine instruction to detect invalid orders that destroy values before
1496// they are used. If it detects such conditions, it reorders the instructions.
1497//
1498// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001499// instructions inserted by RegAlloc. All such instruction MUST have
1500// their USES BEFORE THE DEFS after reordering.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001501//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001502// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1503// this method is called.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001504//
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001505// This method uses two vectors for efficiency in accessing
Vikram S. Advee9327f02002-05-19 15:25:51 +00001506//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001507// Since instructions are inserted in RegAlloc, this assumes that the
1508// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adveaee67012002-07-08 23:23:12 +00001509// It also does not consider operands that are both use and def.
Vikram S. Advee9327f02002-05-19 15:25:51 +00001510//
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001511// All the uses are before THE def to a register
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001512//---------------------------------------------------------------------------
Vikram S. Advee9327f02002-05-19 15:25:51 +00001513
1514void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1515 std::vector<MachineInstr*> &OrdVec,
Chris Lattner7f74a562002-01-20 22:54:45 +00001516 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001517
1518 /*
1519 Problem: We can have instructions inserted by RegAlloc like
1520 1. add %ox %g0 %oy
1521 2. add %oy %g0 %oz, where z!=x or z==x
1522
1523 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001524
1525 Solution:
1526 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001527
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001528 Algorithm:
1529
1530 do
1531 for each instruction 'DefInst' in the UnOrdVec
1532 for each instruction 'UseInst' that follows the DefInst
1533 if the reg defined by DefInst is used by UseInst
1534 mark DefInst as not movable in this iteration
1535 If DefInst is not marked as not-movable, move DefInst to OrdVec
1536 while all instructions in DefInst are moved to OrdVec
1537
1538 For moving, we call the move2OrdVec(). It checks whether there is a def
1539 in it for the uses in the instruction to be added to OrdVec. If there
1540 are no preceding defs, it just appends the instruction. If there is a
1541 preceding def, it puts two instructions to save the reg on stack before
1542 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001543
1544 */
1545
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001546 bool CouldMoveAll;
1547 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001548
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001549 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001550 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001551 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001552
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001553 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001554
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001555 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001556
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001557 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001558
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001559 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001560
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001561 //cerr << "\nInst in UnordVec = " << *DefInst;
1562
1563 // last operand is the def (unless for a store which has no def reg)
1564 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1565
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001566 if( DefOp.opIsDef() &&
1567 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001568
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001569 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001570
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001571 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001572
Chris Lattner7f74a562002-01-20 22:54:45 +00001573 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001574 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001575
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001576 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1577
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001578 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001579 if( UseInst == NULL) continue;
1580
1581 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001582 MachineOperand& UseOp = UseInst->getOperand(0);
1583
1584 if( ! UseOp.opIsDef() &&
1585 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1586
1587 // if use is a register ...
1588
1589 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1590
1591 // if Def and this use are the same, it means that this use
1592 // is destroyed by a def before it is used
1593
1594 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001595
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001596 DefEqUse = true;
1597 CouldMoveAll = false;
1598 DebugPrint = true;
1599 break;
1600 } // if two registers are equal
1601
1602 } // if use is a register
1603
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001604 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001605
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001606 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001607
1608 // after examining all the instructions that follow the DefInst
1609 // if there are no dependencies, we can move it to the OrdVec
1610
1611 // cerr << "Moved to Ord: " << *DefInst;
1612
1613 moveInst2OrdVec(OrdVec, DefInst, PRA);
1614
1615 //OrdVec.push_back(DefInst);
1616
1617 // mark the pos of DefInst with NULL to indicate that it is
1618 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001619 *DefIt = NULL;
1620 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001621
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001622 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001623
1624 } // for all instructions in the UnordVec
1625
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001626
Chris Lattner5216cc52002-02-04 05:59:25 +00001627 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001628
Chris Lattner070cf772002-06-04 03:09:57 +00001629 if (DebugPrint && DEBUG_RA) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001630 cerr << "\nAdded instructions were reordered to:\n";
1631 for(unsigned int i=0; i < OrdVec.size(); i++)
1632 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001633 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001634}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001635
1636
1637
1638
1639
Chris Lattner7f74a562002-01-20 22:54:45 +00001640void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001641 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001642 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643 MachineOperand& UseOp = UnordInst->getOperand(0);
1644
1645 if( ! UseOp.opIsDef() &&
1646 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1647
1648 // for the use of UnordInst, see whether there is a defining instr
1649 // before in the OrdVec
1650 bool DefEqUse = false;
1651
Chris Lattner7f74a562002-01-20 22:54:45 +00001652 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001653
1654 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1655
1656 MachineInstr *OrdInst = *OrdIt ;
1657
1658 MachineOperand& DefOp =
1659 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1660
1661 if( DefOp.opIsDef() &&
1662 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1663
1664 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1665
1666 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1667
1668 // we are here because there is a preceding def in the OrdVec
1669 // for the use in this intr we are going to insert. This
1670 // happened because the original code was like:
1671 // 1. add %ox %g0 %oy
1672 // 2. add %oy %g0 %ox
1673 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1674 // Now we are processing %ox of 1.
1675 // We have to
1676
1677 const int UReg = DefOp.getMachineRegNum();
1678 const int RegType = getRegType(UReg);
1679 MachineInstr *AdIBef, *AdIAft;
1680
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001681 const int StackOff = PRA.mcInfo.pushTempValue(target,
1682 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001683
1684 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Advee9327f02002-05-19 15:25:51 +00001685 vector<MachineInstr*> mvec;
Vikram S. Adveaee67012002-07-08 23:23:12 +00001686 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Vikram S. Advee9327f02002-05-19 15:25:51 +00001687 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1688 OrdIt = OrdVec.insert(OrdIt, *MI);
1689 ++OrdIt; // OrdIt must still point to current instr we processed
1690 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001691
1692 // Load directly into DReg (%oy)
1693 MachineOperand& DOp=
1694 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1695 assert(DOp.opIsDef() && "Last operand is not the def");
1696 const int DReg = DOp.getMachineRegNum();
1697
Vikram S. Adveaee67012002-07-08 23:23:12 +00001698 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001699
1700 cerr << "\nFixed CIRCULAR references by reordering";
1701
1702 if( DEBUG_RA ) {
1703 cerr << "\nBefore CIRCULAR Reordering:\n";
1704 cerr << *UnordInst;
1705 cerr << *OrdInst;
1706
1707 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1708 for(unsigned i=0; i < OrdVec.size(); i++)
1709 cerr << *(OrdVec[i]);
1710 }
1711
1712 // Do not copy the UseInst to OrdVec
1713 DefEqUse = true;
1714 break;
1715
1716 }// if two registers are equal
1717
1718 } // if Def is a register
1719
1720 } // for each instr in OrdVec
1721
Chris Lattner5216cc52002-02-04 05:59:25 +00001722 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001723
1724 // We didn't find a def in the OrdVec, so just append this inst
1725 OrdVec.push_back( UnordInst );
1726 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1727 }
1728
1729 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001730}