blob: 6aa4d816264141ddfe22f6e8cf73664885fd159a [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;
Chris Lattner20b1ea02001-09-14 03:47:57 +000025
Chris Lattner699683c2002-02-04 05:59:25 +000026UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
27 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
28 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
29
30 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
31 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
32 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
34
35 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
36 "32 Float regs are used for float arg passing");
37}
38
39
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000040// getZeroRegNum - returns the register that contains always zero.
41// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000042//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000043int UltraSparcRegInfo::getZeroRegNum() const {
44 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
45 SparcIntRegOrder::g0);
46}
Chris Lattner699683c2002-02-04 05:59:25 +000047
48// getCallAddressReg - returns the reg used for pushing the address when a
49// method is called. This can be used for other purposes between calls
50//
51unsigned UltraSparcRegInfo::getCallAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000052 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
53 SparcIntRegOrder::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000054}
55
56// Returns the register containing the return address.
57// It should be made sure that this register contains the return
58// value when a return instruction is reached.
59//
60unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000061 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
62 SparcIntRegOrder::i7);
Chris Lattner699683c2002-02-04 05:59:25 +000063}
64
65// given the unified register number, this gives the name
66// for generating assembly code or debugging.
67//
68const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
69 if( reg < 32 )
70 return SparcIntRegOrder::getRegName(reg);
71 else if ( reg < (64 + 32) )
72 return SparcFloatRegOrder::getRegName( reg - 32);
73 else if( reg < (64+32+4) )
74 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
75 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
76 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
77 else if (reg== InvalidRegNum) //****** TODO: Remove */
78 return "<*NoReg*>";
79 else
80 assert(0 && "Invalid register number");
81 return "";
82}
83
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000084// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +000085unsigned UltraSparcRegInfo::getFramePointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000086 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
87 SparcIntRegOrder::i6);
Chris Lattner699683c2002-02-04 05:59:25 +000088}
89
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000090// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +000091unsigned UltraSparcRegInfo::getStackPointer() const {
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000092 return this->getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
93 SparcIntRegOrder::o6);
Chris Lattner699683c2002-02-04 05:59:25 +000094}
95
96
Vikram S. Adve31f78c42002-04-25 04:42:21 +000097//---------------------------------------------------------------------------
98// Finds whether a call is an indirect call
99//---------------------------------------------------------------------------
100
101inline bool
102isVarArgsFunction(const Type *funcType) {
103 return cast<FunctionType>(cast<PointerType>(funcType)
104 ->getElementType())->isVarArg();
105}
106
107inline bool
108isVarArgsCall(const MachineInstr *CallMI) {
109 Value* callee = CallMI->getOperand(0).getVRegValue();
110 // const Type* funcType = isa<Function>(callee)? callee->getType()
111 // : cast<PointerType>(callee->getType())->getElementType();
112 const Type* funcType = callee->getType();
113 return isVarArgsFunction(funcType);
114}
115
116
117// Get the register number for the specified integer arg#,
118// assuming there are argNum total args, intArgNum int args,
119// and fpArgNum FP args preceding (and not including) this one.
120// Use INT regs for FP args if this is a varargs call.
121//
122// Return value:
123// InvalidRegNum, if there is no int register available for the arg.
124// regNum, otherwise (this is NOT the unified reg. num).
125//
126inline int
127UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
128 unsigned argNo,
129 unsigned intArgNo, unsigned fpArgNo,
130 unsigned& regClassId) const
131{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000132 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000133 if (argNo >= NumOfIntArgRegs)
134 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000135 else
136 return argNo + (inCallee? SparcIntRegOrder::i0 : SparcIntRegOrder::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000137}
138
139// Get the register number for the specified FP arg#,
140// assuming there are argNum total args, intArgNum int args,
141// and fpArgNum FP args preceding (and not including) this one.
142// Use INT regs for FP args if this is a varargs call.
143//
144// Return value:
145// InvalidRegNum, if there is no int register available for the arg.
146// regNum, otherwise (this is NOT the unified reg. num).
147//
148inline int
149UltraSparcRegInfo::regNumForFPArg(unsigned regType,
150 bool inCallee, bool isVarArgsCall,
151 unsigned argNo,
152 unsigned intArgNo, unsigned fpArgNo,
153 unsigned& regClassId) const
154{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000155 if (isVarArgsCall)
156 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
157 regClassId);
158 else
159 {
160 regClassId = FloatRegClassID;
161 if (regType == FPSingleRegType)
162 return (argNo*2+1 >= NumOfFloatArgRegs)?
163 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2 + 1);
164 else if (regType == FPDoubleRegType)
165 return (argNo*2 >= NumOfFloatArgRegs)?
166 InvalidRegNum : SparcFloatRegOrder::f0 + (argNo * 2);
167 else
168 assert(0 && "Illegal FP register type");
169 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000170}
171
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000172
173//---------------------------------------------------------------------------
174// Finds the return address of a call sparc specific call instruction
175//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000176
Vikram S. Adve242a8082002-05-19 15:25:51 +0000177// The following 4 methods are used to find the RegType (see enum above)
178// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000179//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180int UltraSparcRegInfo::getRegType(unsigned regClassID,
181 const Type* type) const {
182 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000183 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000184 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000185 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000186 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000187 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000188 return FPDoubleRegType;
189 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000190 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000191 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000192 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000193 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000194 }
195}
196
Vikram S. Adve242a8082002-05-19 15:25:51 +0000197int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
198 return getRegType(LR->getRegClass()->getID(), LR->getType());
199}
200
Chris Lattner699683c2002-02-04 05:59:25 +0000201int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000202 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000203}
204
205int UltraSparcRegInfo::getRegType(int reg) const {
206 if (reg < 32)
207 return IntRegType;
208 else if (reg < (32 + 32))
209 return FPSingleRegType;
210 else if (reg < (64 + 32))
211 return FPDoubleRegType;
212 else if (reg < (64+32+4))
213 return FloatCCRegType;
214 else if (reg < (64+32+4+2))
215 return IntCCRegType;
216 else
217 assert(0 && "Invalid register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000218 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000219}
220
221
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000222//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000223// Suggests a register for the ret address in the RET machine instruction.
224// We always suggest %i7 by convention.
225//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000226void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000227 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000228
Vikram S. Adve53fec862001-10-22 13:41:12 +0000229 assert( (RetMI->getNumOperands() >= 2)
230 && "JMPL/RETURN must have 3 and 2 operands respectively");
231
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000232 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
233
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000234 // return address is always mapped to i7
235 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000236 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000237
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000238 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000239 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000240 // we have to test later whether it received the suggested color.
241 // In that case, a LR has to be created at the start of method.
242 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000243
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000244 // const Value *RetAddrVal = MO.getVRegValue();
245 // assert( RetAddrVal && "LR for ret address must be created at start");
246 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
247 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
248 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000249}
250
251
252//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000253// Suggests a register for the ret address in the JMPL/CALL machine instr.
254// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000255//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000256void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
257 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000258 std::vector<RegClass *> RCList) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000259 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
260 const Value *RetAddrVal = argDesc->getReturnAddrReg();
261 assert(RetAddrVal && "Return address value is required");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000262
Vikram S. Adve242a8082002-05-19 15:25:51 +0000263 // create a new LR for the return address and color it
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000264 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000265 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000266 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
267 RetAddrLR->setRegClass( RCList[RegClassID] );
268 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
269 LRI.addLRToMap( RetAddrVal, RetAddrLR);
270
Ruchira Sasanka91442282001-09-30 23:16:47 +0000271}
272
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000273
274
Ruchira Sasanka91442282001-09-30 23:16:47 +0000275
276//---------------------------------------------------------------------------
277// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000278// According to the Sparc ABI, the first 6 incoming args are in
279// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000280// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000281// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000282//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000283void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000284 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000285{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000286 // check if this is a varArgs function. needed for choosing regs.
287 bool isVarArgs = isVarArgsFunction(Meth->getType());
288
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000289 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000290 unsigned argNo=0, intArgNo=0, fpArgNo=0;
291 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
292 I != E; ++I, ++argNo) {
293 // get the LR of arg
294 LiveRange *LR = LRI.getLiveRangeForValue(I);
295 assert(LR && "No live range found for method arg");
296
297 unsigned regType = getRegType(LR);
298 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
299
300 int regNum = (regType == IntRegType)
301 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
302 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
303 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
304 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
305
306 if(regNum != InvalidRegNum)
307 LR->setSuggestedColor(regNum);
308 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000309}
310
Ruchira Sasanka91442282001-09-30 23:16:47 +0000311
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000312//---------------------------------------------------------------------------
313// This method is called after graph coloring to move incoming args to
314// the correct hardware registers if they did not receive the correct
315// (suggested) color through graph coloring.
316//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000317void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000318 LiveRangeInfo &LRI,
319 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000320
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000321 // check if this is a varArgs function. needed for choosing regs.
322 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000323 MachineInstr *AdMI;
324
Ruchira Sasanka91442282001-09-30 23:16:47 +0000325 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000326 // for each argument. count INT and FP arguments separately.
327 unsigned argNo=0, intArgNo=0, fpArgNo=0;
328 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
329 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000330 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000331 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000332 assert( LR && "No live range found for method arg");
333
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000334 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000335 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000336
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000337 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000338 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000339 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000340 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000341 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000342 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
343
344 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000345 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
346 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
347 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
348 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000349
350 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000351 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000352 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000353 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000354
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000355 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000356
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000357 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
358
359 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000360 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000361 if( UniLRReg == UniArgReg )
362 continue;
363
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000364 // We are here because the LR did not receive the suggested
365 // but LR received another register.
366 // Now we have to copy the %i reg (or stack pos of arg)
367 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000368
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000369 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000370 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000371 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000372 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000373 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000374 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000375
376 // It is a variable argument call: the float reg must go in a %o reg.
377 // We have to move an int reg to a float reg via memory.
378 //
379 assert(isVarArgs &&
380 RegClassID == FloatRegClassID &&
381 regClassIDOfArgReg == IntRegClassID &&
382 "This should only be an Int register for an FP argument");
383
384 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
385 getSpilledRegSize(regType));
Vikram S. Adve242a8082002-05-19 15:25:51 +0000386 cpReg2MemMI(UniArgReg, getFramePointer(), TmpOff, IntRegType,
387 FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000388
Vikram S. Adve242a8082002-05-19 15:25:51 +0000389 cpMem2RegMI(getFramePointer(), TmpOff, UniLRReg, regType,
390 FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000391 }
392 else {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000393 cpReg2RegMI(UniArgReg, UniLRReg, regType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000394 }
395 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000396 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000397
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000398 // Now the arg is coming on stack. Since the LR recieved a register,
399 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000400 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000401 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000402 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000403 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
404 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000405
Vikram S. Adve242a8082002-05-19 15:25:51 +0000406 cpMem2RegMI(getFramePointer(), offsetFromFP, UniLRReg, regType,
407 FirstAI->InstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000408 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000409
410 } // if LR received a color
411
412 else {
413
414 // Now, the LR did not receive a color. But it has a stack offset for
415 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000416 // So, if the arg is coming in UniArgReg register, we can just move
417 // that on to the stack pos of LR
418
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000419 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000420
421 if( regClassIDOfArgReg != RegClassID ) {
422 assert(0 &&
423 "FP arguments to a varargs function should be explicitly "
424 "copied to/from int registers by instruction selection!");
425
426 // It must be a float arg for a variable argument call, which
427 // must come in a %o reg. Move the int reg to the stack.
428 //
429 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
430 "This should only be an Int register for an FP argument");
431
Vikram S. Adve242a8082002-05-19 15:25:51 +0000432 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
433 IntRegType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000434 }
435 else {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000436 cpReg2MemMI(UniArgReg, getFramePointer(), LR->getSpillOffFromFP(),
437 regType, FirstAI->InstrnsBefore);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000438 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000439 }
440
441 else {
442
443 // Now the arg is coming on stack. Since the LR did NOT
444 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000445 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000446 // since this method is called before any other method that makes
447 // uses of the stack pos of the LR (e.g., updateMachineInstr)
448
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000449 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000450 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000451 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
452 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000453
454 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000455 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000456
457 }
458
Ruchira Sasanka91442282001-09-30 23:16:47 +0000459 } // for each incoming argument
460
461}
462
Chris Lattner20b1ea02001-09-14 03:47:57 +0000463
464
Ruchira Sasanka91442282001-09-30 23:16:47 +0000465//---------------------------------------------------------------------------
466// This method is called before graph coloring to suggest colors to the
467// outgoing call args and the return value of the call.
468//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000469void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000470 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000471 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000472 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000473
Vikram S. Adve242a8082002-05-19 15:25:51 +0000474 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000475
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000476 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000477
Ruchira Sasanka91442282001-09-30 23:16:47 +0000478 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000479 // will be in %o0 if the value is an integer type, or in %f0 if the
480 // value is a float type.
481
Ruchira Sasanka91442282001-09-30 23:16:47 +0000482 // the return value cannot have a LR in machine instruction since it is
483 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000484
Ruchira Sasanka91442282001-09-30 23:16:47 +0000485 // if type is not void, create a new live range and set its
486 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000487
Vikram S. Adve242a8082002-05-19 15:25:51 +0000488 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000489
Chris Lattner699683c2002-02-04 05:59:25 +0000490 if (RetVal) {
491 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000492 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000493
Chris Lattner699683c2002-02-04 05:59:25 +0000494 // create a new LR for the return value
495 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000496 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000497 unsigned RegClassID = getRegClassIDOfValue(RetVal);
498 RetValLR->setRegClass(RCList[RegClassID]);
499 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000500
501 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000502
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000503 if( RegClassID == IntRegClassID )
504 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
505 else if (RegClassID == FloatRegClassID )
506 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
507 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000508 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000509
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000510
Ruchira Sasanka91442282001-09-30 23:16:47 +0000511 // Now suggest colors for arguments (operands) of the call instruction.
512 // Colors are suggested only if the arg number is smaller than the
513 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000514 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000515
Vikram S. Adve242a8082002-05-19 15:25:51 +0000516 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000517
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000518 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
519 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000520
Vikram S. Adve242a8082002-05-19 15:25:51 +0000521 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000522
523 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000524 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000525
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000526 // not possible to have a null LR since all args (even consts)
527 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000528 if (!LR) {
529 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000530 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000531 }
532
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000533 unsigned regType = getRegType( LR );
534 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000535
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000536 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000537 // an INT or FP value. Here we ignore whether or not it is a
538 // varargs calls, because FP arguments will be explicitly copied
539 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000540 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000541 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
542 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
543 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
544 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000545
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000546 // If a register could be allocated, use it.
547 // If not, do NOTHING as this will be colored as a normal value.
548 if(regNum != InvalidRegNum)
549 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000550
Vikram S. Adve242a8082002-05-19 15:25:51 +0000551 // Repeat for the second copy of the argument, which would be
552 // an FP argument being passed to a function with no prototype
553 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
554 if (argCopy != NULL)
555 {
556 assert(regType != IntRegType && argCopy->getType()->isIntegral()
557 && "Must be passing copy of FP argument in int register");
558 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
559 argNo, intArgNo, fpArgNo-1,
560 regClassIDOfArgReg);
561 assert(copyRegNum != InvalidRegNum);
562 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
563 copyLR->setSuggestedColor(copyRegNum);
564 }
565
Ruchira Sasanka91442282001-09-30 23:16:47 +0000566 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000567
Chris Lattner20b1ea02001-09-14 03:47:57 +0000568}
569
570
Ruchira Sasanka91442282001-09-30 23:16:47 +0000571//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000572// Helper method for UltraSparcRegInfo::colorCallArgs().
573//---------------------------------------------------------------------------
574
575void
576UltraSparcRegInfo::InitializeOutgoingArg(const MachineInstr* CallMI,
577 AddedInstrns *CallAI,
578 PhyRegAlloc &PRA, LiveRange* LR,
579 unsigned regType, unsigned RegClassID,
580 int UniArgRegOrNone, unsigned int argNo,
581 std::vector<MachineInstr *>& AddedInstrnsBefore)
582 const
583{
584 MachineInstr *AdMI;
585 bool isArgInReg = false;
586 unsigned UniArgReg = MAXINT; // unused unless initialized below
587 if (UniArgRegOrNone != InvalidRegNum)
588 {
589 isArgInReg = true;
590 UniArgReg = (unsigned) UniArgRegOrNone;
591 }
592
593 if (LR->hasColor()) {
594 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
595
596 // if LR received the correct color, nothing to do
597 if( isArgInReg && UniArgReg == UniLRReg )
598 return;
599
600 // The LR is allocated to a register UniLRReg and must be copied
601 // to UniArgReg or to the stack slot.
602 //
603 if( isArgInReg ) {
604 // Copy UniLRReg to UniArgReg
605 cpReg2RegMI(UniLRReg, UniArgReg, regType, AddedInstrnsBefore);
606 }
607 else {
608 // Copy UniLRReg to the stack to pass the arg on stack.
609 const MachineFrameInfo& frameInfo = target.getFrameInfo();
610 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
611 cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, regType,
612 CallAI->InstrnsBefore);
613 }
614
615 } else { // LR is not colored (i.e., spilled)
616
617 if( isArgInReg ) {
618 // Insert a load instruction to load the LR to UniArgReg
619 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
620 UniArgReg, regType, AddedInstrnsBefore);
621 // Now add the instruction
622 }
623
624 else {
625 // Now, we have to pass the arg on stack. Since LR also did NOT
626 // receive a register we have to move an argument in memory to
627 // outgoing parameter on stack.
628 // Use TReg to load and store the value.
629 // Use TmpOff to save TReg, since that may have a live value.
630 //
631 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
632 int TmpOff = PRA.mcInfo.pushTempValue(target,
633 getSpilledRegSize(getRegType(LR)));
634 const MachineFrameInfo& frameInfo = target.getFrameInfo();
635 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
636
637 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
638
639 // Sequence:
640 // (1) Save TReg on stack
641 // (2) Load LR value into TReg from stack pos of LR
642 // (3) Store Treg on outgoing Arg pos on stack
643 // (4) Load the old value of TReg from stack to TReg (restore it)
644 //
645 // OPTIMIZE THIS:
646 // When reverse pointers in MahineInstr are introduced:
647 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
648 // needed only if this fails. Currently, we cannot call the
649 // above method since we cannot find LVSetBefore without the BB
650 //
651 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
652 // AddedInstrnsBefore since these instructions must not be reordered.
653 cpReg2MemMI(TReg, getFramePointer(), TmpOff, regType,
654 CallAI->InstrnsBefore);
655 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(), TReg, regType,
656 CallAI->InstrnsBefore);
657 cpReg2MemMI(TReg, getStackPointer(), argOffset, regType,
658 CallAI->InstrnsBefore);
659 cpMem2RegMI(getFramePointer(), TmpOff, TReg, regType,
660 CallAI->InstrnsBefore);
661 }
662 }
663}
664
665//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000666// After graph coloring, we have call this method to see whehter the return
667// value and the call args received the correct colors. If not, we have
668// to instert copy instructions.
669//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000670
Chris Lattner699683c2002-02-04 05:59:25 +0000671void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
672 LiveRangeInfo &LRI,
673 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000674 PhyRegAlloc &PRA,
675 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000676
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000677 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
678
Vikram S. Adve242a8082002-05-19 15:25:51 +0000679 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
680
Ruchira Sasanka91442282001-09-30 23:16:47 +0000681 // First color the return value of the call.
682 // If there is a LR for the return value, it means this
683 // method returns a value
684
685 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000686
Vikram S. Adve242a8082002-05-19 15:25:51 +0000687 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000688
Chris Lattner0665a5f2002-02-05 01:43:49 +0000689 if (RetVal) {
690 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000691
Chris Lattner0665a5f2002-02-05 01:43:49 +0000692 if (!RetValLR) {
693 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000694 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000695 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000696
697 unsigned RegClassID = (RetValLR->getRegClass())->getID();
698 bool recvCorrectColor = false;
699
700 unsigned CorrectCol; // correct color for ret value
701 if(RegClassID == IntRegClassID)
702 CorrectCol = SparcIntRegOrder::o0;
703 else if(RegClassID == FloatRegClassID)
704 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000705 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000706 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000707 return;
708 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000709
710 // if the LR received the correct color, NOTHING to do
711
712 if( RetValLR->hasColor() )
713 if( RetValLR->getColor() == CorrectCol )
714 recvCorrectColor = true;
715
716
717 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000718 // put copy instruction
719
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000720 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000721
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000722 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000723
724 // the reg that LR must be colored with
725 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000726
727 if( RetValLR->hasColor() ) {
728
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000729 unsigned
730 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000731
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000732 // the return value is coming in UniRetReg but has to go into
733 // the UniRetLRReg
734
Vikram S. Adve242a8082002-05-19 15:25:51 +0000735 cpReg2RegMI(UniRetReg, UniRetLRReg, regType, CallAI->InstrnsAfter);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000736
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000737 } // if LR has color
738 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000739
740 // if the LR did NOT receive a color, we have to move the return
741 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000742
Vikram S. Adve242a8082002-05-19 15:25:51 +0000743 cpReg2MemMI(UniRetReg, getFramePointer(),RetValLR->getSpillOffFromFP(),
744 regType, CallAI->InstrnsAfter);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000745 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000746
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000747 } // the LR didn't receive the suggested color
748
749 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000750
751
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000752 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000753 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000754 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000755
Chris Lattner697954c2002-01-20 22:54:45 +0000756 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000757
758 unsigned NumOfCallArgs = argDesc->getNumArgs();
759
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000760 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
761 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000762
Vikram S. Adve242a8082002-05-19 15:25:51 +0000763 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
764
Ruchira Sasanka91442282001-09-30 23:16:47 +0000765 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000766 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000767
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000768 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000769 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000770
Vikram S. Adve242a8082002-05-19 15:25:51 +0000771 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000772 // Also find the correct register the argument must use (UniArgReg)
773 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000774 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000775 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000776 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
777
Vikram S. Adve242a8082002-05-19 15:25:51 +0000778 // Find the register that must be used for this arg, depending on
779 // whether it is an INT or FP value. Here we ignore whether or not it
780 // is a varargs calls, because FP arguments will be explicitly copied
781 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000782 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000783 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
784 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
785 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
786 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000787
788 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000789 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000790 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000791 assert(regClassIDOfArgReg == RegClassID &&
792 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000793 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000794
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000795 // not possible to have a null LR since all args (even consts)
796 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000797 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000798 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000799 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000800 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000801
802 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
803 UniArgReg, argNo, AddedInstrnsBefore);
804
805 // Repeat for the second copy of the argument, which would be
806 // an FP argument being passed to a function with no prototype.
807 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
808 if (argCopy != NULL)
809 {
810 assert(regType != IntRegType && argCopy->getType()->isIntegral()
811 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000812
Vikram S. Adve242a8082002-05-19 15:25:51 +0000813 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
814 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
815
816 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
817 argNo, intArgNo, fpArgNo-1,
818 regClassIDOfArgReg);
819 assert(copyRegNum != InvalidRegNum);
820 assert(regClassIDOfArgReg == copyRegClassID &&
821 "Moving values between reg classes must happen during selection");
822
823 InitializeOutgoingArg(CallMI, CallAI, PRA,
824 LRI.getLiveRangeForValue(argCopy), copyRegType,
825 copyRegClassID, copyRegNum, argNo,
826 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000827 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000828 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000829
Vikram S. Adve242a8082002-05-19 15:25:51 +0000830 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000831 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000832 //
Chris Lattner699683c2002-02-04 05:59:25 +0000833 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000834
Chris Lattner699683c2002-02-04 05:59:25 +0000835 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000836 cerr << "\nCalling reorder with instrns: \n";
837 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
838 cerr << *(AddedInstrnsBefore[i]);
839 }
840
Chris Lattner697954c2002-01-20 22:54:45 +0000841 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000842 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000843
Chris Lattner699683c2002-02-04 05:59:25 +0000844 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000845 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000846 for(unsigned i = 0; i < TmpVec.size(); i++)
847 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000848 }
849
850 // copy the results back from TmpVec to InstrnsBefore
851 for(unsigned i=0; i < TmpVec.size(); i++)
852 CallAI->InstrnsBefore.push_back( TmpVec[i] );
853 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000854
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000855 // now insert caller saving code for this call instruction
856 //
857 insertCallerSavingCode(CallMI, BB, PRA);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000858}
859
Ruchira Sasanka91442282001-09-30 23:16:47 +0000860//---------------------------------------------------------------------------
861// This method is called for an LLVM return instruction to identify which
862// values will be returned from this method and to suggest colors.
863//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000864void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
865 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000866
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000867 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000868
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000869 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000870
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000871 // if there is an implicit ref, that has to be the ret value
872 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000873
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000874 // The first implicit operand is the return value of a return instr
875 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000876
Ruchira Sasanka91442282001-09-30 23:16:47 +0000877 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000878
Chris Lattner0665a5f2002-02-05 01:43:49 +0000879 if (!LR) {
880 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
881 assert(0 && "No LR for return value of non-void method");
882 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000883
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000884 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000885
Chris Lattner699683c2002-02-04 05:59:25 +0000886 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000887 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000888 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000889 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000890 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000891}
892
Ruchira Sasanka91442282001-09-30 23:16:47 +0000893
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000894
895//---------------------------------------------------------------------------
896// Colors the return value of a method to %i0 or %f0, if possible. If it is
897// not possilbe to directly color the LR, insert a copy instruction to move
898// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
899// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000900//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000901void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
902 LiveRangeInfo &LRI,
903 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000904
Chris Lattner699683c2002-02-04 05:59:25 +0000905 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000906
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000907 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000908 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000909
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000910 // The first implicit operand is the return value of a return instr
911 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000912
Chris Lattner699683c2002-02-04 05:59:25 +0000913 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000914
Chris Lattner0665a5f2002-02-05 01:43:49 +0000915 if (!LR) {
916 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
917 // assert( LR && "No LR for return value of non-void method");
918 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000919 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000920
Ruchira Sasanka91442282001-09-30 23:16:47 +0000921 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000922 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000923
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000924 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000925 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000926 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000927 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000928 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000929 else {
Chris Lattner699683c2002-02-04 05:59:25 +0000930 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000931 return;
932 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000933
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000934 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +0000935
Chris Lattner699683c2002-02-04 05:59:25 +0000936 if (LR->hasColor() && LR->getColor() == CorrectCol)
937 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000938
Chris Lattner699683c2002-02-04 05:59:25 +0000939 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000940
Chris Lattner699683c2002-02-04 05:59:25 +0000941 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000942
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000943 // We are here because the LR was allocted a regiter
944 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +0000945
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000946 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +0000947
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000948 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000949
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000950 // the LR received UniLRReg but must be colored with UniRetReg
951 // to pass as the return value
Vikram S. Adve242a8082002-05-19 15:25:51 +0000952 cpReg2RegMI(UniLRReg, UniRetReg, regType, RetAI->InstrnsBefore);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000953 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000954 else { // if the LR is spilled
Vikram S. Adve242a8082002-05-19 15:25:51 +0000955 cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
956 UniRetReg, regType, RetAI->InstrnsBefore);
Chris Lattner697954c2002-01-20 22:54:45 +0000957 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000958 }
959
Ruchira Sasanka91442282001-09-30 23:16:47 +0000960 } // if there is a return value
961
962}
963
964
965//---------------------------------------------------------------------------
966// Copy from a register to register. Register number must be the unified
967// register number
968//---------------------------------------------------------------------------
969
Vikram S. Adve242a8082002-05-19 15:25:51 +0000970void
971UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg,
972 unsigned DestReg,
973 int RegType,
974 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000975 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +0000976 "Invalid Register");
977
978 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000979
Ruchira Sasanka91442282001-09-30 23:16:47 +0000980 switch( RegType ) {
981
Ruchira Sasanka735d6e32001-10-18 22:38:52 +0000982 case IntCCRegType:
983 case FloatCCRegType:
Vikram S. Adve242a8082002-05-19 15:25:51 +0000984 assert(0 && "This code was bogus and needs to be fixed!");
985 break;
986
987 case IntRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +0000988 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000989 MI->SetMachineOperandReg(0, SrcReg, false);
990 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
991 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000992 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000993
Ruchira Sasanka91442282001-09-30 23:16:47 +0000994 case FPSingleRegType:
995 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000996 MI->SetMachineOperandReg(0, SrcReg, false);
997 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000998 break;
999
1000 case FPDoubleRegType:
1001 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001002 MI->SetMachineOperandReg(0, SrcReg, false);
1003 MI->SetMachineOperandReg(1, DestReg, true);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004 break;
1005
1006 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001007 assert(0 && "Unknown RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001008 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001009
1010 if (MI)
1011 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001012}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001013
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001014//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001015// Copy from a register to memory (i.e., Store). Register number must
1016// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001017//---------------------------------------------------------------------------
1018
1019
Vikram S. Adve242a8082002-05-19 15:25:51 +00001020void
1021UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1022 unsigned DestPtrReg,
1023 int Offset, int RegType,
1024 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001025 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001026 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001027 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001028 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001029 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001030 MI->SetMachineOperandReg(0, SrcReg, false);
1031 MI->SetMachineOperandReg(1, DestPtrReg, false);
1032 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1033 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001034 break;
1035
1036 case FPSingleRegType:
1037 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001038 MI->SetMachineOperandReg(0, SrcReg, false);
1039 MI->SetMachineOperandReg(1, DestPtrReg, false);
1040 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1041 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001042 break;
1043
1044 case FPDoubleRegType:
1045 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001046 MI->SetMachineOperandReg(0, SrcReg, false);
1047 MI->SetMachineOperandReg(1, DestPtrReg, false);
1048 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1049 (int64_t) Offset);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001050 break;
1051
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001052 case IntCCRegType:
1053 assert( 0 && "Cannot directly store %ccr to memory");
1054
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001055 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001056 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001057 }
1058
Vikram S. Adve242a8082002-05-19 15:25:51 +00001059 if (MI)
1060 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001061}
1062
1063
1064//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001065// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001066// register number
1067//---------------------------------------------------------------------------
1068
1069
Vikram S. Adve242a8082002-05-19 15:25:51 +00001070void
1071UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1072 int Offset,
1073 unsigned DestReg,
1074 int RegType,
1075 vector<MachineInstr*>& mvec) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001076 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001077 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001078 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001079 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001080 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001081 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1082 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1083 (int64_t) Offset);
1084 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001085 break;
1086
1087 case FPSingleRegType:
1088 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001089 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1090 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1091 (int64_t) Offset);
1092 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001093
1094 break;
1095
1096 case FPDoubleRegType:
1097 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001098 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1099 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1100 (int64_t) Offset);
1101 MI->SetMachineOperandReg(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001102 break;
1103
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001104 case IntCCRegType:
1105 assert( 0 && "Cannot directly load into %ccr from memory");
1106
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001107 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001108 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001109 }
1110
Vikram S. Adve242a8082002-05-19 15:25:51 +00001111 if (MI)
1112 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001113}
1114
1115
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001116//---------------------------------------------------------------------------
1117// Generate a copy instruction to copy a value to another. Temporarily
1118// used by PhiElimination code.
1119//---------------------------------------------------------------------------
1120
1121
Vikram S. Adve242a8082002-05-19 15:25:51 +00001122void
1123UltraSparcRegInfo::cpValue2Value(Value *Src,
1124 Value *Dest,
1125 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001126 int RegType = getRegType( Src );
1127
1128 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001129
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001130 MachineInstr * MI = NULL;
1131
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001132 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001133 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001134 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001135 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1136 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1137 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001138 break;
1139
1140 case FPSingleRegType:
1141 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001142 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1143 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001144 break;
1145
1146
1147 case FPDoubleRegType:
1148 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001149 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1150 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001151 break;
1152
1153 default:
1154 assert(0 && "Unknow RegType in CpValu2Value");
1155 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001156
Vikram S. Adve242a8082002-05-19 15:25:51 +00001157 if (MI)
1158 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001159}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001160
1161
1162
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001163
1164
1165
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001166//----------------------------------------------------------------------------
1167// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001168// a call machine instruction. The caller saving/restoring instructions are
1169// inserted like:
1170//
1171// ** caller saving instructions
1172// other instructions inserted for the call by ColorCallArg
1173// CALL instruction
1174// other instructions inserted for the call ColorCallArg
1175// ** caller restoring instructions
1176//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001177//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001178
Ruchira Sasanka91442282001-09-30 23:16:47 +00001179
Vikram S. Adve242a8082002-05-19 15:25:51 +00001180void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *CallMI,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001181 const BasicBlock *BB,
1182 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001183
Vikram S. Adve242a8082002-05-19 15:25:51 +00001184 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1185
Ruchira Sasankabf915522002-01-07 21:03:42 +00001186 // has set to record which registers were saved/restored
1187 //
Chris Lattner697954c2002-01-20 22:54:45 +00001188 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001189
Vikram S. Adve242a8082002-05-19 15:25:51 +00001190 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1191
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001192 // Now find the LR of the return value of the call
1193 // The last *implicit operand* is the return value of a call
1194 // Insert it to to he PushedRegSet since we must not save that register
1195 // and restore it after the call.
1196 // We do this because, we look at the LV set *after* the instruction
1197 // to determine, which LRs must be saved across calls. The return value
1198 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001199
Vikram S. Adve242a8082002-05-19 15:25:51 +00001200 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001201
Chris Lattner699683c2002-02-04 05:59:25 +00001202 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001203 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001204 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001205
Chris Lattner699683c2002-02-04 05:59:25 +00001206 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001207 PushedRegSet.insert(
1208 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001209 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001210 }
1211
1212
Vikram S. Adve242a8082002-05-19 15:25:51 +00001213 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001214 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001215
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001216 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001217 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001218
1219 // get the live range corresponding to live var
1220 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1221
1222 // LR can be null if it is a const since a const
1223 // doesn't have a dominating def - see Assumptions above
1224 if( LR ) {
1225
1226 if( LR->hasColor() ) {
1227
1228 unsigned RCID = (LR->getRegClass())->getID();
1229 unsigned Color = LR->getColor();
1230
1231 if ( isRegVolatile(RCID, Color) ) {
1232
1233 // if the value is in both LV sets (i.e., live before and after
1234 // the call machine instruction)
1235
1236 unsigned Reg = getUnifiedRegNum(RCID, Color);
1237
1238 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1239
1240 // if we haven't already pushed that register
1241
1242 unsigned RegType = getRegType( LR );
1243
1244 // Now get two instructions - to push on stack and pop from stack
1245 // and add them to InstrnsBefore and InstrnsAfter of the
1246 // call instruction
1247
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001248
1249 int StackOff = PRA.mcInfo.pushTempValue(target,
1250 getSpilledRegSize(RegType));
1251
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001252
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001253 MachineInstr *AdIBefCC=NULL, *AdIAftCC=NULL, *AdICpCC;
1254 MachineInstr *AdIBef=NULL, *AdIAft=NULL;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001255
1256 //---- Insert code for pushing the reg on stack ----------
1257
1258 if( RegType == IntCCRegType ) {
1259
1260 // Handle IntCCRegType specially since we cannot directly
1261 // push %ccr on to the stack
1262
Chris Lattner748697d2002-02-05 04:20:12 +00001263 const ValueSet &LVSetBef =
Vikram S. Adve242a8082002-05-19 15:25:51 +00001264 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001265
1266 // get a free INTEGER register
1267 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001268 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /*LR->getRegClass()*/,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001269 IntRegType, CallMI, &LVSetBef, AdIBefCC, AdIAftCC);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001270
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001271 // insert the instructions in reverse order since we are
1272 // adding them to the front of InstrnsBefore
Vikram S. Adve242a8082002-05-19 15:25:51 +00001273 AddedInstrns& addedI = PRA.AddedInstrMap[CallMI];
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001274 if(AdIAftCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001275 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1276 AdIAftCC);
1277
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001278 AdICpCC = cpCCR2IntMI(FreeIntReg);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001279 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1280 AdICpCC);
1281
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001282 if(AdIBefCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001283 addedI.InstrnsBefore.insert(addedI.InstrnsBefore.begin(),
1284 AdIBefCC);
1285
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001286 if(DEBUG_RA) {
1287 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1288 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1289 cerr << "\t" << *AdICpCC;
1290 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1291 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001292
1293 } else {
1294 // for any other register type, just add the push inst
Vikram S. Adve242a8082002-05-19 15:25:51 +00001295 cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType,
1296 PRA.AddedInstrMap[CallMI].InstrnsBefore);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001297 }
1298
1299
1300 //---- Insert code for popping the reg from the stack ----------
1301
Chris Lattner748697d2002-02-05 04:20:12 +00001302 if (RegType == IntCCRegType) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001303
1304 // Handle IntCCRegType specially since we cannot directly
1305 // pop %ccr on from the stack
1306
1307 // get a free INT register
1308 int FreeIntReg =
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001309 PRA.getUsableUniRegAtMI(PRA.getRegClassByID(IntRegClassID) /* LR->getRegClass()*/,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001310 IntRegType, CallMI, &LVSetAft, AdIBefCC, AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001311
1312 if(AdIBefCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001313 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIBefCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001314
1315 AdICpCC = cpInt2CCRMI(FreeIntReg);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001316 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdICpCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001317
1318 if(AdIAftCC)
Vikram S. Adve242a8082002-05-19 15:25:51 +00001319 PRA.AddedInstrMap[CallMI].InstrnsAfter.push_back(AdIAftCC);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001320
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001321 if(DEBUG_RA) {
1322
1323 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1324 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1325 cerr << "\t" << *AdICpCC;
1326 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1327 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001328
1329 } else {
1330 // for any other register type, just add the pop inst
Vikram S. Adve242a8082002-05-19 15:25:51 +00001331 cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType,
1332 PRA.AddedInstrMap[CallMI].InstrnsAfter);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001333 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001334
Chris Lattner748697d2002-02-05 04:20:12 +00001335 PushedRegSet.insert(Reg);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001336
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001337 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001338 cerr << "\nFor call inst:" << *CallMI;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001339 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001340 if( RegType == IntCCRegType ) {
1341 if(AdIBefCC) cerr << *AdIBefCC << "\t";
1342 if(AdIAftCC) cerr << *AdIAftCC;
1343 }
1344 else {
1345 if(AdIBef) cerr << *AdIBef << "\t";
1346 if(AdIAft) cerr << *AdIAft;
1347 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001348 }
1349 } // if not already pushed
1350
1351 } // if LR has a volatile color
1352
1353 } // if LR has color
1354
1355 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001356
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001357 } // for each value in the LV set after instruction
1358
Ruchira Sasanka91442282001-09-30 23:16:47 +00001359}
1360
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001361//---------------------------------------------------------------------------
1362// Copies %ccr into an integer register. IntReg is the UNIFIED register
1363// number.
1364//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001365
Chris Lattner699683c2002-02-04 05:59:25 +00001366MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1367 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001368 MI->SetMachineOperandReg(0, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID,
1369 SparcIntCCRegOrder::ccr),
1370 false, true);
1371 MI->SetMachineOperandReg(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001372 return MI;
1373}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001374
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001375//---------------------------------------------------------------------------
1376// Copies an integer register into %ccr. IntReg is the UNIFIED register
1377// number.
1378//---------------------------------------------------------------------------
1379
Chris Lattner699683c2002-02-04 05:59:25 +00001380MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1381 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001382 MI->SetMachineOperandReg(0, IntReg, false);
1383 MI->SetMachineOperandReg(1, this->getZeroRegNum(), false);
1384 MI->SetMachineOperandReg(2, this->getUnifiedRegNum(UltraSparcRegInfo::IntCCRegClassID, SparcIntCCRegOrder::ccr),
1385 true, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001386 return MI;
1387}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001388
1389
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001390
1391
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001392//---------------------------------------------------------------------------
1393// Print the register assigned to a LR
1394//---------------------------------------------------------------------------
1395
Chris Lattner699683c2002-02-04 05:59:25 +00001396void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001397 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001398 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001399
Chris Lattner699683c2002-02-04 05:59:25 +00001400 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001401 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001402 return;
1403 }
1404
1405 // if a color is found
1406
Chris Lattner1e23ed72001-10-15 18:15:27 +00001407 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001408
Chris Lattner699683c2002-02-04 05:59:25 +00001409 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001410 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001411
Chris Lattner699683c2002-02-04 05:59:25 +00001412 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001413 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001414 if( LR->getType() == Type::DoubleTy)
Chris Lattner1e23ed72001-10-15 18:15:27 +00001415 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001416 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001417 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001418}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001419
1420//---------------------------------------------------------------------------
1421// This method examines instructions inserted by RegAlloc code before a
1422// machine instruction to detect invalid orders that destroy values before
1423// they are used. If it detects such conditions, it reorders the instructions.
1424//
1425// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001426// instructions inserted by RegAlloc. All such instruction MUST have
1427// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001428//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001429// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1430// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001431//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001432// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001433//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001434// Since instructions are inserted in RegAlloc, this assumes that the
1435// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001436//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001437// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001438//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001439
1440void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1441 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001442 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001443
1444 /*
1445 Problem: We can have instructions inserted by RegAlloc like
1446 1. add %ox %g0 %oy
1447 2. add %oy %g0 %oz, where z!=x or z==x
1448
1449 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001450
1451 Solution:
1452 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001453
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001454 Algorithm:
1455
1456 do
1457 for each instruction 'DefInst' in the UnOrdVec
1458 for each instruction 'UseInst' that follows the DefInst
1459 if the reg defined by DefInst is used by UseInst
1460 mark DefInst as not movable in this iteration
1461 If DefInst is not marked as not-movable, move DefInst to OrdVec
1462 while all instructions in DefInst are moved to OrdVec
1463
1464 For moving, we call the move2OrdVec(). It checks whether there is a def
1465 in it for the uses in the instruction to be added to OrdVec. If there
1466 are no preceding defs, it just appends the instruction. If there is a
1467 preceding def, it puts two instructions to save the reg on stack before
1468 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001469
1470 */
1471
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001472 bool CouldMoveAll;
1473 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001474
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001475 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001476 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001477 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001478
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001479 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001480
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001481 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001482
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001483 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001484
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001485 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001486
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001487 //cerr << "\nInst in UnordVec = " << *DefInst;
1488
1489 // last operand is the def (unless for a store which has no def reg)
1490 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1491
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001492 if( DefOp.opIsDef() &&
1493 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001494
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001495 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001496
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001497 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001498
Chris Lattner697954c2002-01-20 22:54:45 +00001499 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001500 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001501
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001502 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1503
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001504 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001505 if( UseInst == NULL) continue;
1506
1507 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001508 MachineOperand& UseOp = UseInst->getOperand(0);
1509
1510 if( ! UseOp.opIsDef() &&
1511 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1512
1513 // if use is a register ...
1514
1515 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1516
1517 // if Def and this use are the same, it means that this use
1518 // is destroyed by a def before it is used
1519
1520 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001521
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001522 DefEqUse = true;
1523 CouldMoveAll = false;
1524 DebugPrint = true;
1525 break;
1526 } // if two registers are equal
1527
1528 } // if use is a register
1529
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001530 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001531
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001532 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001533
1534 // after examining all the instructions that follow the DefInst
1535 // if there are no dependencies, we can move it to the OrdVec
1536
1537 // cerr << "Moved to Ord: " << *DefInst;
1538
1539 moveInst2OrdVec(OrdVec, DefInst, PRA);
1540
1541 //OrdVec.push_back(DefInst);
1542
1543 // mark the pos of DefInst with NULL to indicate that it is
1544 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001545 *DefIt = NULL;
1546 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001547
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001548 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001549
1550 } // for all instructions in the UnordVec
1551
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001552
Chris Lattner699683c2002-02-04 05:59:25 +00001553 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001554
Chris Lattner44014412002-06-04 03:09:57 +00001555 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001556 cerr << "\nAdded instructions were reordered to:\n";
1557 for(unsigned int i=0; i < OrdVec.size(); i++)
1558 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001559 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001560}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001561
1562
1563
1564
1565
Chris Lattner697954c2002-01-20 22:54:45 +00001566void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001567 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001568 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001569 MachineOperand& UseOp = UnordInst->getOperand(0);
1570
1571 if( ! UseOp.opIsDef() &&
1572 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1573
1574 // for the use of UnordInst, see whether there is a defining instr
1575 // before in the OrdVec
1576 bool DefEqUse = false;
1577
Chris Lattner697954c2002-01-20 22:54:45 +00001578 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001579
1580 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1581
1582 MachineInstr *OrdInst = *OrdIt ;
1583
1584 MachineOperand& DefOp =
1585 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1586
1587 if( DefOp.opIsDef() &&
1588 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1589
1590 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1591
1592 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1593
1594 // we are here because there is a preceding def in the OrdVec
1595 // for the use in this intr we are going to insert. This
1596 // happened because the original code was like:
1597 // 1. add %ox %g0 %oy
1598 // 2. add %oy %g0 %ox
1599 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1600 // Now we are processing %ox of 1.
1601 // We have to
1602
1603 const int UReg = DefOp.getMachineRegNum();
1604 const int RegType = getRegType(UReg);
1605 MachineInstr *AdIBef, *AdIAft;
1606
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001607 const int StackOff = PRA.mcInfo.pushTempValue(target,
1608 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001609
1610 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001611 vector<MachineInstr*> mvec;
1612 cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType, mvec);
1613 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1614 OrdIt = OrdVec.insert(OrdIt, *MI);
1615 ++OrdIt; // OrdIt must still point to current instr we processed
1616 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001617
1618 // Load directly into DReg (%oy)
1619 MachineOperand& DOp=
1620 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1621 assert(DOp.opIsDef() && "Last operand is not the def");
1622 const int DReg = DOp.getMachineRegNum();
1623
Vikram S. Adve242a8082002-05-19 15:25:51 +00001624 cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType, OrdVec);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001625
1626 cerr << "\nFixed CIRCULAR references by reordering";
1627
1628 if( DEBUG_RA ) {
1629 cerr << "\nBefore CIRCULAR Reordering:\n";
1630 cerr << *UnordInst;
1631 cerr << *OrdInst;
1632
1633 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1634 for(unsigned i=0; i < OrdVec.size(); i++)
1635 cerr << *(OrdVec[i]);
1636 }
1637
1638 // Do not copy the UseInst to OrdVec
1639 DefEqUse = true;
1640 break;
1641
1642 }// if two registers are equal
1643
1644 } // if Def is a register
1645
1646 } // for each instr in OrdVec
1647
Chris Lattner699683c2002-02-04 05:59:25 +00001648 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001649
1650 // We didn't find a def in the OrdVec, so just append this inst
1651 OrdVec.push_back( UnordInst );
1652 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1653 }
1654
1655 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001656}