blob: 96ff5ad0f529734fcea7b12f01e542f798ea8a76 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Chris Lattner699683c2002-02-04 05:59:25 +000014#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000015#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000016#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000017#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000018#include "llvm/iTerminators.h"
19#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000020#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000021#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000022#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000023#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000024using std::cerr;
Anand Shuklacfb22d32002-06-25 20:55:50 +000025using std::vector;
Chris Lattner20b1ea02001-09-14 03:47:57 +000026
Chris Lattner699683c2002-02-04 05:59:25 +000027UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
28 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
29 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
30
31 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
32 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
33 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
34 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
35
36 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
37 "32 Float regs are used for float arg passing");
38}
39
40
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000041// getZeroRegNum - returns the register that contains always zero.
42// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000043//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000044int UltraSparcRegInfo::getZeroRegNum() const {
45 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
46 SparcIntRegOrder::g0);
47}
Chris Lattner699683c2002-02-04 05:59:25 +000048
49// getCallAddressReg - returns the reg used for pushing the address when a
50// method is called. This can be used for other purposes between calls
51//
52unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000053 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
54 SparcIntRegOrder::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000055}
56
57// Returns the register containing the return address.
58// It should be made sure that this register contains the return
59// value when a return instruction is reached.
60//
61unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000062 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
63 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000064}
65
66// given the unified register number, this gives the name
67// for generating assembly code or debugging.
68//
69const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
70 if( reg < 32 )
71 return SparcIntRegOrder::getRegName(reg);
72 else if ( reg < (64 + 32) )
73 return SparcFloatRegOrder::getRegName( reg - 32);
74 else if( reg < (64+32+4) )
75 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
76 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
77 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
78 else if (reg== InvalidRegNum) //****** TODO: Remove */
79 return "<*NoReg*>";
80 else
81 assert(0 && "Invalid register number");
82 return "";
83}
84
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000085// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000086unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000087 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
88 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000089}
90
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000091// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000092unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000093 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
94 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000095}
96
97
Vikram S. Adve31f78c42002-04-25 04:42:21 +000098//---------------------------------------------------------------------------
99// Finds whether a call is an indirect call
100//---------------------------------------------------------------------------
101
102inline bool
103isVarArgsFunction(const Type *funcType) {
104 return cast<FunctionType>(cast<PointerType>(funcType)
105 ->getElementType())->isVarArg();
106}
107
108inline bool
109isVarArgsCall(const MachineInstr *CallMI) {
110 Value* callee = CallMI->getOperand(0).getVRegValue();
111 // const Type* funcType = isa<Function>(callee)? callee->getType()
112 // : cast<PointerType>(callee->getType())->getElementType();
113 const Type* funcType = callee->getType();
114 return isVarArgsFunction(funcType);
115}
116
117
118// Get the register number for the specified integer arg#,
119// assuming there are argNum total args, intArgNum int args,
120// and fpArgNum FP args preceding (and not including) this one.
121// Use INT regs for FP args if this is a varargs call.
122//
123// Return value:
124// InvalidRegNum, if there is no int register available for the arg.
125// regNum, otherwise (this is NOT the unified reg. num).
126//
127inline int
128UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
129 unsigned argNo,
130 unsigned intArgNo, unsigned fpArgNo,
131 unsigned& regClassId) const
132{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000133 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000134 if (argNo >= NumOfIntArgRegs)
135 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000136 else
137 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000138}
139
140// Get the register number for the specified FP arg#,
141// assuming there are argNum total args, intArgNum int args,
142// and fpArgNum FP args preceding (and not including) this one.
143// Use INT regs for FP args if this is a varargs call.
144//
145// Return value:
146// InvalidRegNum, if there is no int register available for the arg.
147// regNum, otherwise (this is NOT the unified reg. num).
148//
149inline int
150UltraSparcRegInfo::regNumForFPArg(unsigned regType,
151 bool inCallee, bool isVarArgsCall,
152 unsigned argNo,
153 unsigned intArgNo, unsigned fpArgNo,
154 unsigned& regClassId) const
155{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000156 if (isVarArgsCall)
157 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
158 regClassId);
159 else
160 {
161 regClassId = FloatRegClassID;
162 if (regType == FPSingleRegType)
163 return (argNo*2+1 >= NumOfFloatArgRegs)?
164 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2 + 1);
165 else if (regType == FPDoubleRegType)
166 return (argNo*2 >= NumOfFloatArgRegs)?
167 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2);
168 else
169 assert(0 && "Illegal FP register type");
170 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000171}
172
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000173
174//---------------------------------------------------------------------------
175// Finds the return address of a call sparc specific call instruction
176//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000177
Vikram S. Adve242a8082002-05-19 15:25:51 +0000178// The following 4 methods are used to find the RegType (see enum above)
179// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000180//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000181int UltraSparcRegInfo::getRegType(unsigned regClassID,
182 const Type* type) const {
183 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000184 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000185 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000186 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000187 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000188 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000189 return FPDoubleRegType;
190 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000191 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000192 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000193 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000194 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000195 }
196}
197
Vikram S. Adve242a8082002-05-19 15:25:51 +0000198int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
199 return getRegType(LR->getRegClass()->getID(), LR->getType());
200}
201
Chris Lattner699683c2002-02-04 05:59:25 +0000202int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000203 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000204}
205
206int UltraSparcRegInfo::getRegType(int reg) const {
207 if (reg < 32)
208 return IntRegType;
209 else if (reg < (32 + 32))
210 return FPSingleRegType;
211 else if (reg < (64 + 32))
212 return FPDoubleRegType;
213 else if (reg < (64+32+4))
214 return FloatCCRegType;
215 else if (reg < (64+32+4+2))
216 return IntCCRegType;
217 else
218 assert(0 && "Invalid register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000219 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000220}
221
222
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000223//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000224// Suggests a register for the ret address in the RET machine instruction.
225// We always suggest %i7 by convention.
226//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000227void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000228 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000229
Vikram S. Adve53fec862001-10-22 13:41:12 +0000230 assert( (RetMI->getNumOperands() >= 2)
231 && "JMPL/RETURN must have 3 and 2 operands respectively");
232
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000233 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
234
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000235 // return address is always mapped to i7
236 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000237 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000238
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000239 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000240 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000241 // we have to test later whether it received the suggested color.
242 // In that case, a LR has to be created at the start of method.
243 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000244
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000245 // const Value *RetAddrVal = MO.getVRegValue();
246 // assert( RetAddrVal && "LR for ret address must be created at start");
247 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
248 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
249 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000250}
251
252
253//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000254// Suggests a register for the ret address in the JMPL/CALL machine instr.
255// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000256//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000257void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
258 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000259 std::vector<RegClass *> RCList) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000260 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
261 const Value *RetAddrVal = argDesc->getReturnAddrReg();
262 assert(RetAddrVal && "Return address value is required");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000263
Vikram S. Adve242a8082002-05-19 15:25:51 +0000264 // create a new LR for the return address and color it
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000265 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000266 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000267 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
268 RetAddrLR->setRegClass( RCList[RegClassID] );
269 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
270 LRI.addLRToMap( RetAddrVal, RetAddrLR);
271
Ruchira Sasanka91442282001-09-30 23:16:47 +0000272}
273
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000274
275
Ruchira Sasanka91442282001-09-30 23:16:47 +0000276
277//---------------------------------------------------------------------------
278// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000279// According to the Sparc ABI, the first 6 incoming args are in
280// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000281// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000282// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000283//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000284void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000285 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000286{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000287 // check if this is a varArgs function. needed for choosing regs.
288 bool isVarArgs = isVarArgsFunction(Meth->getType());
289
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000290 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000291 unsigned argNo=0, intArgNo=0, fpArgNo=0;
292 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
293 I != E; ++I, ++argNo) {
294 // get the LR of arg
295 LiveRange *LR = LRI.getLiveRangeForValue(I);
296 assert(LR && "No live range found for method arg");
297
298 unsigned regType = getRegType(LR);
299 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
300
301 int regNum = (regType == IntRegType)
302 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
303 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
304 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
305 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
306
307 if(regNum != InvalidRegNum)
308 LR->setSuggestedColor(regNum);
309 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000310}
311
Ruchira Sasanka91442282001-09-30 23:16:47 +0000312
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000313//---------------------------------------------------------------------------
314// This method is called after graph coloring to move incoming args to
315// the correct hardware registers if they did not receive the correct
316// (suggested) color through graph coloring.
317//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000318void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000319 LiveRangeInfo &LRI,
320 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000321
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000322 // check if this is a varArgs function. needed for choosing regs.
323 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000324 MachineInstr *AdMI;
325
Ruchira Sasanka91442282001-09-30 23:16:47 +0000326 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000327 // for each argument. count INT and FP arguments separately.
328 unsigned argNo=0, intArgNo=0, fpArgNo=0;
329 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
330 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000331 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000332 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000333 assert( LR && "No live range found for method arg");
334
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000335 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000336 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000337
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000338 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000339 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000340 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000341 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000342 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000343 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
344
345 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000346 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
347 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
348 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
349 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000350
351 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000352 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000353 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000354 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000355
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000356 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000357
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000358 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
359
360 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000361 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000362 if( UniLRReg == UniArgReg )
363 continue;
364
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000365 // We are here because the LR did not receive the suggested
366 // but LR received another register.
367 // Now we have to copy the %i reg (or stack pos of arg)
368 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000369
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000370 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000371 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000372 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000373 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000374 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000375 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000376
377 // It is a variable argument call: the float reg must go in a %o reg.
378 // We have to move an int reg to a float reg via memory.
379 //
380 assert(isVarArgs &&
381 RegClassID == FloatRegClassID &&
382 regClassIDOfArgReg == IntRegClassID &&
383 "This should only be an Int register for an FP argument");
384
385 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
386 getSpilledRegSize(regType));
Vikram S. Adve242a8082002-05-19 15:25:51 +0000387 cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType,
388 FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000389
Vikram S. Adve242a8082002-05-19 15:25:51 +0000390 cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType,
391 FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000392 }
393 else {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000394 cpReg2RegMI(UniArgReg, UniLRReg, regType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000395 }
396 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000397 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000398
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000399 // Now the arg is coming on stack. Since the LR recieved a register,
400 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000401 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000402 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000403 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000404 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
405 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000406
Vikram S. Adve242a8082002-05-19 15:25:51 +0000407 cpMem2RegMI(getFramePointer(), offsetFromFP, UniLRReg, regType,
408 FirstAI->InstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000409 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000410
411 } // if LR received a color
412
413 else {
414
415 // Now, the LR did not receive a color. But it has a stack offset for
416 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000417 // So, if the arg is coming in UniArgReg register, we can just move
418 // that on to the stack pos of LR
419
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000420 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000421
422 if( regClassIDOfArgReg != RegClassID ) {
423 assert(0 &&
424 "FP arguments to a varargs function should be explicitly "
425 "copied to/from int registers by instruction selection!");
426
427 // It must be a float arg for a variable argument call, which
428 // must come in a %o reg. Move the int reg to the stack.
429 //
430 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
431 "This should only be an Int register for an FP argument");
432
Vikram S. Adve242a8082002-05-19 15:25:51 +0000433 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
434 IntRegType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000435 }
436 else {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000437 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
438 regType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000439 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000440 }
441
442 else {
443
444 // Now the arg is coming on stack. Since the LR did NOT
445 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000446 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000447 // since this method is called before any other method that makes
448 // uses of the stack pos of the LR (e.g., updateMachineInstr)
449
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000450 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000451 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000452 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
453 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000454
455 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000456 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000457
458 }
459
Ruchira Sasanka91442282001-09-30 23:16:47 +0000460 } // for each incoming argument
461
462}
463
Chris Lattner20b1ea02001-09-14 03:47:57 +0000464
465
Ruchira Sasanka91442282001-09-30 23:16:47 +0000466//---------------------------------------------------------------------------
467// This method is called before graph coloring to suggest colors to the
468// outgoing call args and the return value of the call.
469//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000470void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000471 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000472 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000473 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000474
Vikram S. Adve242a8082002-05-19 15:25:51 +0000475 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000476
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000477 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000478
Ruchira Sasanka91442282001-09-30 23:16:47 +0000479 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000480 // will be in %o0 if the value is an integer type, or in %f0 if the
481 // value is a float type.
482
Ruchira Sasanka91442282001-09-30 23:16:47 +0000483 // the return value cannot have a LR in machine instruction since it is
484 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000485
Ruchira Sasanka91442282001-09-30 23:16:47 +0000486 // if type is not void, create a new live range and set its
487 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000488
Vikram S. Adve242a8082002-05-19 15:25:51 +0000489 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000490
Chris Lattner699683c2002-02-04 05:59:25 +0000491 if (RetVal) {
492 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000493 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000494
Chris Lattner699683c2002-02-04 05:59:25 +0000495 // create a new LR for the return value
496 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000497 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000498 unsigned RegClassID = getRegClassIDOfValue(RetVal);
499 RetValLR->setRegClass(RCList[RegClassID]);
500 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000501
502 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000503
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000504 if( RegClassID == IntRegClassID )
505 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
506 else if (RegClassID == FloatRegClassID )
507 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
508 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000509 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000510
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000511
Ruchira Sasanka91442282001-09-30 23:16:47 +0000512 // Now suggest colors for arguments (operands) of the call instruction.
513 // Colors are suggested only if the arg number is smaller than the
514 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000515 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000516
Vikram S. Adve242a8082002-05-19 15:25:51 +0000517 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000518
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000519 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
520 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000521
Vikram S. Adve242a8082002-05-19 15:25:51 +0000522 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000523
524 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000525 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000526
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000527 // not possible to have a null LR since all args (even consts)
528 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000529 if (!LR) {
530 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000531 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000532 }
533
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000534 unsigned regType = getRegType( LR );
535 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000536
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000537 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000538 // an INT or FP value. Here we ignore whether or not it is a
539 // varargs calls, because FP arguments will be explicitly copied
540 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000541 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000542 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
543 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
544 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
545 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000546
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000547 // If a register could be allocated, use it.
548 // If not, do NOTHING as this will be colored as a normal value.
549 if(regNum != InvalidRegNum)
550 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000551
Vikram S. Adve242a8082002-05-19 15:25:51 +0000552 // Repeat for the second copy of the argument, which would be
553 // an FP argument being passed to a function with no prototype
554 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
555 if (argCopy != NULL)
556 {
557 assert(regType != IntRegType && argCopy->getType()->isIntegral()
558 && "Must be passing copy of FP argument in int register");
559 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
560 argNo, intArgNo, fpArgNo-1,
561 regClassIDOfArgReg);
562 assert(copyRegNum != InvalidRegNum);
563 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
564 copyLR->setSuggestedColor(copyRegNum);
565 }
566
Ruchira Sasanka91442282001-09-30 23:16:47 +0000567 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000568
Chris Lattner20b1ea02001-09-14 03:47:57 +0000569}
570
571
Ruchira Sasanka91442282001-09-30 23:16:47 +0000572//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000573// Helper method for UltraSparcRegInfo::colorCallArgs().
574//---------------------------------------------------------------------------
575
576void
577UltraSparcRegInfo::InitializeOutgoingArg(const MachineInstr* CallMI,
578 AddedInstrns *CallAI,
579 PhyRegAlloc &PRA, LiveRange* LR,
580 unsigned regType, unsigned RegClassID,
581 int UniArgRegOrNone, unsigned int argNo,
582 std::vector<MachineInstr *>& AddedInstrnsBefore)
583 const
584{
585 MachineInstr *AdMI;
586 bool isArgInReg = false;
587 unsigned UniArgReg = MAXINT; // unused unless initialized below
588 if (UniArgRegOrNone != InvalidRegNum)
589 {
590 isArgInReg = true;
591 UniArgReg = (unsigned) UniArgRegOrNone;
592 }
593
594 if (LR->hasColor()) {
595 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
596
597 // if LR received the correct color, nothing to do
598 if( isArgInReg && UniArgReg == UniLRReg )
599 return;
600
601 // The LR is allocated to a register UniLRReg and must be copied
602 // to UniArgReg or to the stack slot.
603 //
604 if( isArgInReg ) {
605 // Copy UniLRReg to UniArgReg
606 cpReg2RegMI(UniLRReg, UniArgReg, regType, AddedInstrnsBefore);
607 }
608 else {
609 // Copy UniLRReg to the stack to pass the arg on stack.
610 const MachineFrameInfo& frameInfo = target.getFrameInfo();
611 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
612 cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType,
613 CallAI->InstrnsBefore);
614 }
615
616 } else { // LR is not colored (i.e., spilled)
617
618 if( isArgInReg ) {
619 // Insert a load instruction to load the LR to UniArgReg
620 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
621 UniArgReg, regType, AddedInstrnsBefore);
622 // Now add the instruction
623 }
624
625 else {
626 // Now, we have to pass the arg on stack. Since LR also did NOT
627 // receive a register we have to move an argument in memory to
628 // outgoing parameter on stack.
629 // Use TReg to load and store the value.
630 // Use TmpOff to save TReg, since that may have a live value.
631 //
632 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
633 int TmpOff = PRA.mcInfo.pushTempValue(target,
634 getSpilledRegSize(getRegType(LR)));
635 const MachineFrameInfo& frameInfo = target.getFrameInfo();
636 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
637
638 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
639
640 // Sequence:
641 // (1) Save TReg on stack
642 // (2) Load LR value into TReg from stack pos of LR
643 // (3) Store Treg on outgoing Arg pos on stack
644 // (4) Load the old value of TReg from stack to TReg (restore it)
645 //
646 // OPTIMIZE THIS:
647 // When reverse pointers in MahineInstr are introduced:
648 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
649 // needed only if this fails. Currently, we cannot call the
650 // above method since we cannot find LVSetBefore without the BB
651 //
652 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
653 // AddedInstrnsBefore since these instructions must not be reordered.
654 cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType,
655 CallAI->InstrnsBefore);
656 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), TReg, regType,
657 CallAI->InstrnsBefore);
658 cpReg2MemMI(TReg, getStackPointer(), argOffset, regType,
659 CallAI->InstrnsBefore);
660 cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType,
661 CallAI->InstrnsBefore);
662 }
663 }
664}
665
666//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000667// After graph coloring, we have call this method to see whehter the return
668// value and the call args received the correct colors. If not, we have
669// to instert copy instructions.
670//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000671
Chris Lattner699683c2002-02-04 05:59:25 +0000672void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
673 LiveRangeInfo &LRI,
674 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000675 PhyRegAlloc &PRA,
676 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000677
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000678 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
679
Vikram S. Adve242a8082002-05-19 15:25:51 +0000680 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
681
Ruchira Sasanka91442282001-09-30 23:16:47 +0000682 // First color the return value of the call.
683 // If there is a LR for the return value, it means this
684 // method returns a value
685
686 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000687
Vikram S. Adve242a8082002-05-19 15:25:51 +0000688 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000689
Chris Lattner0665a5f2002-02-05 01:43:49 +0000690 if (RetVal) {
691 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000692
Chris Lattner0665a5f2002-02-05 01:43:49 +0000693 if (!RetValLR) {
694 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000695 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000696 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000697
698 unsigned RegClassID = (RetValLR->getRegClass())->getID();
699 bool recvCorrectColor = false;
700
701 unsigned CorrectCol; // correct color for ret value
702 if(RegClassID == IntRegClassID)
703 CorrectCol = SparcIntRegOrder::o0;
704 else if(RegClassID == FloatRegClassID)
705 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000706 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000707 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000708 return;
709 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000710
711 // if the LR received the correct color, NOTHING to do
712
713 if( RetValLR->hasColor() )
714 if( RetValLR->getColor() == CorrectCol )
715 recvCorrectColor = true;
716
717
718 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000719 // put copy instruction
720
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000721 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000722
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000723 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000724
725 // the reg that LR must be colored with
726 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000727
728 if( RetValLR->hasColor() ) {
729
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000730 unsigned
731 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000732
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000733 // the return value is coming in UniRetReg but has to go into
734 // the UniRetLRReg
735
Vikram S. Adve242a8082002-05-19 15:25:51 +0000736 cpReg2RegMI(UniRetReg, UniRetLRReg, regType, CallAI->InstrnsAfter);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000737
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000738 } // if LR has color
739 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000740
741 // if the LR did NOT receive a color, we have to move the return
742 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000743
Vikram S. Adve242a8082002-05-19 15:25:51 +0000744 cpReg2MemMI(UniRetReg, getFramePointer(),RetValLR->getSpillOffFromFP(),
745 regType, CallAI->InstrnsAfter);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000746 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000747
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000748 } // the LR didn't receive the suggested color
749
750 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000751
752
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000753 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000754 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000755 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000756
Chris Lattner697954c2002-01-20 22:54:45 +0000757 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000758
759 unsigned NumOfCallArgs = argDesc->getNumArgs();
760
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000761 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
762 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000763
Vikram S. Adve242a8082002-05-19 15:25:51 +0000764 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
765
Ruchira Sasanka91442282001-09-30 23:16:47 +0000766 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000767 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000768
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000769 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000770 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000771
Vikram S. Adve242a8082002-05-19 15:25:51 +0000772 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000773 // Also find the correct register the argument must use (UniArgReg)
774 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000775 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000776 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000777 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
778
Vikram S. Adve242a8082002-05-19 15:25:51 +0000779 // Find the register that must be used for this arg, depending on
780 // whether it is an INT or FP value. Here we ignore whether or not it
781 // is a varargs calls, because FP arguments will be explicitly copied
782 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000783 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000784 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
785 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
786 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
787 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000788
789 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000790 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000791 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000792 assert(regClassIDOfArgReg == RegClassID &&
793 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000794 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000795
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000796 // not possible to have a null LR since all args (even consts)
797 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000798 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000799 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000800 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000801 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000802
803 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
804 UniArgReg, argNo, AddedInstrnsBefore);
805
806 // Repeat for the second copy of the argument, which would be
807 // an FP argument being passed to a function with no prototype.
808 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
809 if (argCopy != NULL)
810 {
811 assert(regType != IntRegType && argCopy->getType()->isIntegral()
812 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000813
Vikram S. Adve242a8082002-05-19 15:25:51 +0000814 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
815 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
816
817 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
818 argNo, intArgNo, fpArgNo-1,
819 regClassIDOfArgReg);
820 assert(copyRegNum != InvalidRegNum);
821 assert(regClassIDOfArgReg == copyRegClassID &&
822 "Moving values between reg classes must happen during selection");
823
824 InitializeOutgoingArg(CallMI, CallAI, PRA,
825 LRI.getLiveRangeForValue(argCopy), copyRegType,
826 copyRegClassID, copyRegNum, argNo,
827 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000828 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000829 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000830
Vikram S. Adve242a8082002-05-19 15:25:51 +0000831 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000832 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000833 //
Chris Lattner699683c2002-02-04 05:59:25 +0000834 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000835
Chris Lattner699683c2002-02-04 05:59:25 +0000836 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000837 cerr << "\nCalling reorder with instrns: \n";
838 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
839 cerr << *(AddedInstrnsBefore[i]);
840 }
841
Chris Lattner697954c2002-01-20 22:54:45 +0000842 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000843 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000844
Chris Lattner699683c2002-02-04 05:59:25 +0000845 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000846 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000847 for(unsigned i = 0; i < TmpVec.size(); i++)
848 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000849 }
850
851 // copy the results back from TmpVec to InstrnsBefore
852 for(unsigned i=0; i < TmpVec.size(); i++)
853 CallAI->InstrnsBefore.push_back( TmpVec[i] );
854 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000855
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000856 // now insert caller saving code for this call instruction
857 //
858 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000859}
860
Ruchira Sasanka91442282001-09-30 23:16:47 +0000861//---------------------------------------------------------------------------
862// This method is called for an LLVM return instruction to identify which
863// values will be returned from this method and to suggest colors.
864//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000865void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
866 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000867
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000868 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000869
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000870 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000871
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000872 // if there is an implicit ref, that has to be the ret value
873 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000874
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000875 // The first implicit operand is the return value of a return instr
876 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000877
Ruchira Sasanka91442282001-09-30 23:16:47 +0000878 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000879
Chris Lattner0665a5f2002-02-05 01:43:49 +0000880 if (!LR) {
881 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
882 assert(0 && "No LR for return value of non-void method");
883 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000884
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000885 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000886
Chris Lattner699683c2002-02-04 05:59:25 +0000887 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000888 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000889 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000890 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000891 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000892}
893
Ruchira Sasanka91442282001-09-30 23:16:47 +0000894
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000895
896//---------------------------------------------------------------------------
897// Colors the return value of a method to %i0 or %f0, if possible. If it is
898// not possilbe to directly color the LR, insert a copy instruction to move
899// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
900// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000901//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000902void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
903 LiveRangeInfo &LRI,
904 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000905
Chris Lattner699683c2002-02-04 05:59:25 +0000906 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000907
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000908 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000909 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000910
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000911 // The first implicit operand is the return value of a return instr
912 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000913
Chris Lattner699683c2002-02-04 05:59:25 +0000914 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000915
Chris Lattner0665a5f2002-02-05 01:43:49 +0000916 if (!LR) {
917 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
918 // assert( LR && "No LR for return value of non-void method");
919 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000920 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000921
Ruchira Sasanka91442282001-09-30 23:16:47 +0000922 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000923 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000924
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000925 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000926 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000927 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000928 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000929 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000930 else {
Chris Lattner699683c2002-02-04 05:59:25 +0000931 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000932 return;
933 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000934
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000935 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000936
Chris Lattner699683c2002-02-04 05:59:25 +0000937 if (LR->hasColor() && LR->getColor() == CorrectCol)
938 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000939
Chris Lattner699683c2002-02-04 05:59:25 +0000940 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000941
Chris Lattner699683c2002-02-04 05:59:25 +0000942 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000943
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000944 // We are here because the LR was allocted a regiter
945 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000946
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000947 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000948
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000949 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000950
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000951 // the LR received UniLRReg but must be colored with UniRetReg
952 // to pass as the return value
Vikram S. Adve242a8082002-05-19 15:25:51 +0000953 cpReg2RegMI(UniLRReg, UniRetReg, regType, RetAI->InstrnsBefore);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000954 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000955 else { // if the LR is spilled
Vikram S. Adve242a8082002-05-19 15:25:51 +0000956 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
957 UniRetReg, regType, RetAI->InstrnsBefore);
Chris Lattner697954c2002-01-20 22:54:45 +0000958 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000959 }
960
Ruchira Sasanka91442282001-09-30 23:16:47 +0000961 } // if there is a return value
962
963}
964
965
966//---------------------------------------------------------------------------
967// Copy from a register to register. Register number must be the unified
968// register number
969//---------------------------------------------------------------------------
970
Vikram S. Adve242a8082002-05-19 15:25:51 +0000971void
972UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
973 unsigned DestReg,
974 int RegType,
975 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000976 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000977 "Invalid Register");
978
979 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000980
Ruchira Sasanka91442282001-09-30 23:16:47 +0000981 switch( RegType ) {
982
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000983 case IntCCRegType:
984 case FloatCCRegType:
Vikram S. Adve242a8082002-05-19 15:25:51 +0000985 assert(0 && "This code was bogus and needs to be fixed!");
986 break;
987
988 case IntRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000989 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000990 MI->SetMachineOperandReg(0, SrcReg, false);
991 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
992 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000993 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000994
Ruchira Sasanka91442282001-09-30 23:16:47 +0000995 case FPSingleRegType:
996 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000997 MI->SetMachineOperandReg(0, SrcReg, false);
998 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000999 break;
1000
1001 case FPDoubleRegType:
1002 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001003 MI->SetMachineOperandReg(0, SrcReg, false);
1004 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001005 break;
1006
1007 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001008 assert(0 && "Unknown RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001009 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001010
1011 if (MI)
1012 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001013}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001014
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001015//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001016// Copy from a register to memory (i.e., Store). Register number must
1017// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001018//---------------------------------------------------------------------------
1019
1020
Vikram S. Adve242a8082002-05-19 15:25:51 +00001021void
1022UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1023 unsigned DestPtrReg,
1024 int Offset, int RegType,
1025 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001026 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001027 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001028 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001029 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001030 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001031 MI->SetMachineOperandReg(0, SrcReg, false);
1032 MI->SetMachineOperandReg(1, DestPtrReg, false);
1033 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1034 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001035 break;
1036
1037 case FPSingleRegType:
1038 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001039 MI->SetMachineOperandReg(0, SrcReg, false);
1040 MI->SetMachineOperandReg(1, DestPtrReg, false);
1041 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1042 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001043 break;
1044
1045 case FPDoubleRegType:
1046 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001047 MI->SetMachineOperandReg(0, SrcReg, false);
1048 MI->SetMachineOperandReg(1, DestPtrReg, false);
1049 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1050 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001051 break;
1052
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001053 case IntCCRegType:
1054 assert( 0 && "Cannot directly store %ccr to memory");
1055
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001056 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001057 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001058 }
1059
Vikram S. Adve242a8082002-05-19 15:25:51 +00001060 if (MI)
1061 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001062}
1063
1064
1065//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001066// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001067// register number
1068//---------------------------------------------------------------------------
1069
1070
Vikram S. Adve242a8082002-05-19 15:25:51 +00001071void
1072UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1073 int Offset,
1074 unsigned DestReg,
1075 int RegType,
1076 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001077 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001078 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001079 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001080 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001081 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001082 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1083 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1084 (int64_t) Offset);
1085 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001086 break;
1087
1088 case FPSingleRegType:
1089 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001090 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1091 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1092 (int64_t) Offset);
1093 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001094
1095 break;
1096
1097 case FPDoubleRegType:
1098 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001099 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1100 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1101 (int64_t) Offset);
1102 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001103 break;
1104
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001105 case IntCCRegType:
1106 assert( 0 && "Cannot directly load into %ccr from memory");
1107
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001108 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001109 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001110 }
1111
Vikram S. Adve242a8082002-05-19 15:25:51 +00001112 if (MI)
1113 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001114}
1115
1116
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001117//---------------------------------------------------------------------------
1118// Generate a copy instruction to copy a value to another. Temporarily
1119// used by PhiElimination code.
1120//---------------------------------------------------------------------------
1121
1122
Vikram S. Adve242a8082002-05-19 15:25:51 +00001123void
1124UltraSparcRegInfo::cpValue2Value(Value *Src,
1125 Value *Dest,
1126 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001127 int RegType = getRegType( Src );
1128
1129 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001130
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001131 MachineInstr * MI = NULL;
1132
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001133 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001134 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001135 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001136 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1137 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1138 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001139 break;
1140
1141 case FPSingleRegType:
1142 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001143 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1144 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001145 break;
1146
1147
1148 case FPDoubleRegType:
1149 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001150 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1151 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001152 break;
1153
1154 default:
1155 assert(0 && "Unknow RegType in CpValu2Value");
1156 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001157
Vikram S. Adve242a8082002-05-19 15:25:51 +00001158 if (MI)
1159 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001160}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001161
1162
1163
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001164
1165
1166
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001167//----------------------------------------------------------------------------
1168// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001169// a call machine instruction. The caller saving/restoring instructions are
1170// inserted like:
1171//
1172// ** caller saving instructions
1173// other instructions inserted for the call by ColorCallArg
1174// CALL instruction
1175// other instructions inserted for the call ColorCallArg
1176// ** caller restoring instructions
1177//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001178//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001179
Ruchira Sasanka91442282001-09-30 23:16:47 +00001180
Vikram S. Adve242a8082002-05-19 15:25:51 +00001181void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *CallMI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001182 const BasicBlock *BB,
1183 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001184
Vikram S. Adve242a8082002-05-19 15:25:51 +00001185 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1186
Ruchira Sasankabf915522002-01-07 21:03:42 +00001187 // has set to record which registers were saved/restored
1188 //
Chris Lattner697954c2002-01-20 22:54:45 +00001189 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001190
Vikram S. Adve242a8082002-05-19 15:25:51 +00001191 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1192
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001193 // Now find the LR of the return value of the call
1194 // The last *implicit operand* is the return value of a call
1195 // Insert it to to he PushedRegSet since we must not save that register
1196 // and restore it after the call.
1197 // We do this because, we look at the LV set *after* the instruction
1198 // to determine, which LRs must be saved across calls. The return value
1199 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001200
Vikram S. Adve242a8082002-05-19 15:25:51 +00001201 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001202
Chris Lattner699683c2002-02-04 05:59:25 +00001203 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001204 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001205 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001206
Chris Lattner699683c2002-02-04 05:59:25 +00001207 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001208 PushedRegSet.insert(
1209 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001210 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001211 }
1212
1213
Vikram S. Adve242a8082002-05-19 15:25:51 +00001214 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001215 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001216
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001217 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001218 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001219
1220 // get the live range corresponding to live var
1221 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1222
1223 // LR can be null if it is a const since a const
1224 // doesn't have a dominating def - see Assumptions above
1225 if( LR ) {
1226
1227 if( LR->hasColor() ) {
1228
1229 unsigned RCID = (LR->getRegClass())->getID();
1230 unsigned Color = LR->getColor();
1231
1232 if ( isRegVolatile(RCID, Color) ) {
1233
1234 // if the value is in both LV sets (i.e., live before and after
1235 // the call machine instruction)
1236
1237 unsigned Reg = getUnifiedRegNum(RCID, Color);
1238
1239 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1240
1241 // if we haven't already pushed that register
1242
1243 unsigned RegType = getRegType( LR );
1244
1245 // Now get two instructions - to push on stack and pop from stack
1246 // and add them to InstrnsBefore and InstrnsAfter of the
1247 // call instruction
1248
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001249
1250 int StackOff = PRA.mcInfo.pushTempValue(target,
1251 getSpilledRegSize(RegType));
1252
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001253
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001254 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1255 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001256
1257 //---- Insert code for pushing the reg on stack ----------
1258
1259 if( RegType == IntCCRegType ) {
1260
1261 // Handle IntCCRegType specially since we cannot directly
1262 // push %ccr on to the stack
1263
Chris Lattner748697d2002-02-05 04:20:12 +00001264 const ValueSet &LVSetBef =
Vikram S. Adve242a8082002-05-19 15:25:51 +00001265 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001266
1267 // get a free INTEGER register
1268 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001269 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001270 IntRegType, CallMI, &LVSetBef, AdIBefCC, AdIAftCC);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001271
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001272 // insert the instructions in reverse order since we are
1273 // adding them to the front of InstrnsBefore
Vikram S. Adve242a8082002-05-19 15:25:51 +00001274 AddedInstrns& addedI = PRA.AddedInstrMap[CallMI];
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001275 if(AdIAftCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001276 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1277 AdIAftCC);
1278
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001279 AdICpCC = cpCCR2IntMI(FreeIntReg);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001280 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1281 AdICpCC);
1282
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001283 if(AdIBefCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001284 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1285 AdIBefCC);
1286
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001287 if(DEBUG_RA) {
1288 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1289 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1290 cerr << "\t" << *AdICpCC;
1291 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1292 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001293
1294 } else {
1295 // for any other register type, just add the push inst
Vikram S. Adve242a8082002-05-19 15:25:51 +00001296 cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType,
1297 PRA.AddedInstrMap[CallMI].InstrnsBefore);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001298 }
1299
1300
1301 //---- Insert code for popping the reg from the stack ----------
1302
Chris Lattner748697d2002-02-05 04:20:12 +00001303 if (RegType == IntCCRegType) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001304
1305 // Handle IntCCRegType specially since we cannot directly
1306 // pop %ccr on from the stack
1307
1308 // get a free INT register
1309 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001310 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001311 IntRegType, CallMI, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001312
1313 if(AdIBefCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001314 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001315
1316 AdICpCC = cpInt2CCRMI(FreeIntReg);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001317 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001318
1319 if(AdIAftCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001320 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001321
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001322 if(DEBUG_RA) {
1323
1324 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1325 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1326 cerr << "\t" << *AdICpCC;
1327 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1328 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001329
1330 } else {
1331 // for any other register type, just add the pop inst
Vikram S. Adve242a8082002-05-19 15:25:51 +00001332 cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType,
1333 PRA.AddedInstrMap[CallMI].InstrnsAfter);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001334 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001335
Chris Lattner748697d2002-02-05 04:20:12 +00001336 PushedRegSet.insert(Reg);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001337
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001338 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001339 cerr << "\nFor call inst:" << *CallMI;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001340 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001341 if( RegType == IntCCRegType ) {
1342 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1343 if(AdIAftCC) cerr << *AdIAftCC;
1344 }
1345 else {
1346 if(AdIBef) cerr << *AdIBef << "\t";
1347 if(AdIAft) cerr << *AdIAft;
1348 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001349 }
1350 } // if not already pushed
1351
1352 } // if LR has a volatile color
1353
1354 } // if LR has color
1355
1356 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001357
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001358 } // for each value in the LV set after instruction
1359
Ruchira Sasanka91442282001-09-30 23:16:47 +00001360}
1361
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001362//---------------------------------------------------------------------------
1363// Copies %ccr into an integer register. IntReg is the UNIFIED register
1364// number.
1365//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001366
Chris Lattner699683c2002-02-04 05:59:25 +00001367MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1368 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001369 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1370 SparcIntCCRegOrder::ccr),
1371 false, true);
1372 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001373 return MI;
1374}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001375
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001376//---------------------------------------------------------------------------
1377// Copies an integer register into %ccr. IntReg is the UNIFIED register
1378// number.
1379//---------------------------------------------------------------------------
1380
Chris Lattner699683c2002-02-04 05:59:25 +00001381MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1382 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001383 MI->SetMachineOperandReg(0, IntReg, false);
1384 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1385 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1386 true, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001387 return MI;
1388}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001389
1390
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001391
1392
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001393//---------------------------------------------------------------------------
1394// Print the register assigned to a LR
1395//---------------------------------------------------------------------------
1396
Chris Lattner699683c2002-02-04 05:59:25 +00001397void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001398 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001399 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001400
Chris Lattner699683c2002-02-04 05:59:25 +00001401 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001402 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001403 return;
1404 }
1405
1406 // if a color is found
1407
Chris Lattner1e23ed72001-10-15 18:15:27 +00001408 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001409
Chris Lattner699683c2002-02-04 05:59:25 +00001410 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001411 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001412
Chris Lattner699683c2002-02-04 05:59:25 +00001413 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001414 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001415 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001416 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001417 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001418 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001419}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001420
1421//---------------------------------------------------------------------------
1422// This method examines instructions inserted by RegAlloc code before a
1423// machine instruction to detect invalid orders that destroy values before
1424// they are used. If it detects such conditions, it reorders the instructions.
1425//
1426// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001427// instructions inserted by RegAlloc. All such instruction MUST have
1428// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001429//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001430// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1431// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001432//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001433// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001434//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001435// Since instructions are inserted in RegAlloc, this assumes that the
1436// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001437//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001438// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001439//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001440
1441void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1442 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001443 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001444
1445 /*
1446 Problem: We can have instructions inserted by RegAlloc like
1447 1. add %ox %g0 %oy
1448 2. add %oy %g0 %oz, where z!=x or z==x
1449
1450 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001451
1452 Solution:
1453 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001454
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001455 Algorithm:
1456
1457 do
1458 for each instruction 'DefInst' in the UnOrdVec
1459 for each instruction 'UseInst' that follows the DefInst
1460 if the reg defined by DefInst is used by UseInst
1461 mark DefInst as not movable in this iteration
1462 If DefInst is not marked as not-movable, move DefInst to OrdVec
1463 while all instructions in DefInst are moved to OrdVec
1464
1465 For moving, we call the move2OrdVec(). It checks whether there is a def
1466 in it for the uses in the instruction to be added to OrdVec. If there
1467 are no preceding defs, it just appends the instruction. If there is a
1468 preceding def, it puts two instructions to save the reg on stack before
1469 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001470
1471 */
1472
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001473 bool CouldMoveAll;
1474 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001475
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001476 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001477 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001478 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001479
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001480 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001481
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001482 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001483
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001484 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001485
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001486 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001487
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001488 //cerr << "\nInst in UnordVec = " << *DefInst;
1489
1490 // last operand is the def (unless for a store which has no def reg)
1491 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1492
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001493 if( DefOp.opIsDef() &&
1494 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001495
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001496 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001497
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001498 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001499
Chris Lattner697954c2002-01-20 22:54:45 +00001500 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001501 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001502
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001503 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1504
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001505 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001506 if( UseInst == NULL) continue;
1507
1508 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001509 MachineOperand& UseOp = UseInst->getOperand(0);
1510
1511 if( ! UseOp.opIsDef() &&
1512 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1513
1514 // if use is a register ...
1515
1516 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1517
1518 // if Def and this use are the same, it means that this use
1519 // is destroyed by a def before it is used
1520
1521 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001522
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001523 DefEqUse = true;
1524 CouldMoveAll = false;
1525 DebugPrint = true;
1526 break;
1527 } // if two registers are equal
1528
1529 } // if use is a register
1530
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001531 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001532
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001533 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001534
1535 // after examining all the instructions that follow the DefInst
1536 // if there are no dependencies, we can move it to the OrdVec
1537
1538 // cerr << "Moved to Ord: " << *DefInst;
1539
1540 moveInst2OrdVec(OrdVec, DefInst, PRA);
1541
1542 //OrdVec.push_back(DefInst);
1543
1544 // mark the pos of DefInst with NULL to indicate that it is
1545 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001546 *DefIt = NULL;
1547 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001548
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001549 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001550
1551 } // for all instructions in the UnordVec
1552
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001553
Chris Lattner699683c2002-02-04 05:59:25 +00001554 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001555
Chris Lattner44014412002-06-04 03:09:57 +00001556 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001557 cerr << "\nAdded instructions were reordered to:\n";
1558 for(unsigned int i=0; i < OrdVec.size(); i++)
1559 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001560 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001561}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001562
1563
1564
1565
1566
Chris Lattner697954c2002-01-20 22:54:45 +00001567void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001568 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001569 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001570 MachineOperand& UseOp = UnordInst->getOperand(0);
1571
1572 if( ! UseOp.opIsDef() &&
1573 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1574
1575 // for the use of UnordInst, see whether there is a defining instr
1576 // before in the OrdVec
1577 bool DefEqUse = false;
1578
Chris Lattner697954c2002-01-20 22:54:45 +00001579 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001580
1581 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1582
1583 MachineInstr *OrdInst = *OrdIt ;
1584
1585 MachineOperand& DefOp =
1586 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1587
1588 if( DefOp.opIsDef() &&
1589 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1590
1591 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1592
1593 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1594
1595 // we are here because there is a preceding def in the OrdVec
1596 // for the use in this intr we are going to insert. This
1597 // happened because the original code was like:
1598 // 1. add %ox %g0 %oy
1599 // 2. add %oy %g0 %ox
1600 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1601 // Now we are processing %ox of 1.
1602 // We have to
1603
1604 const int UReg = DefOp.getMachineRegNum();
1605 const int RegType = getRegType(UReg);
1606 MachineInstr *AdIBef, *AdIAft;
1607
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001608 const int StackOff = PRA.mcInfo.pushTempValue(target,
1609 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001610
1611 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001612 vector<MachineInstr*> mvec;
1613 cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType, mvec);
1614 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1615 OrdIt = OrdVec.insert(OrdIt, *MI);
1616 ++OrdIt; // OrdIt must still point to current instr we processed
1617 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001618
1619 // Load directly into DReg (%oy)
1620 MachineOperand& DOp=
1621 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1622 assert(DOp.opIsDef() && "Last operand is not the def");
1623 const int DReg = DOp.getMachineRegNum();
1624
Vikram S. Adve242a8082002-05-19 15:25:51 +00001625 cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType, OrdVec);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001626
1627 cerr << "\nFixed CIRCULAR references by reordering";
1628
1629 if( DEBUG_RA ) {
1630 cerr << "\nBefore CIRCULAR Reordering:\n";
1631 cerr << *UnordInst;
1632 cerr << *OrdInst;
1633
1634 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1635 for(unsigned i=0; i < OrdVec.size(); i++)
1636 cerr << *(OrdVec[i]);
1637 }
1638
1639 // Do not copy the UseInst to OrdVec
1640 DefEqUse = true;
1641 break;
1642
1643 }// if two registers are equal
1644
1645 } // if Def is a register
1646
1647 } // for each instr in OrdVec
1648
Chris Lattner699683c2002-02-04 05:59:25 +00001649 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001650
1651 // We didn't find a def in the OrdVec, so just append this inst
1652 OrdVec.push_back( UnordInst );
1653 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1654 }
1655
1656 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001657}