blob: a528119560292405f5d767abc8a790035a0863bf [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"
Chris Lattner699683c2002-02-04 05:59:25 +000013#include "llvm/CodeGen/MachineInstr.h"
14#include "llvm/Analysis/LiveVar/LiveVarSet.h"
15#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
16#include "llvm/iTerminators.h"
17#include "llvm/iOther.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000018#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000019#include <iostream>
20using std::cerr;
Chris Lattner20b1ea02001-09-14 03:47:57 +000021
Chris Lattner699683c2002-02-04 05:59:25 +000022UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
23 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
24 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
25
26 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
27 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
28 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
29 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
30
31 assert(SparcFloatRegOrder::StartOfNonVolatileRegs == 32 &&
32 "32 Float regs are used for float arg passing");
33}
34
35
36// getZeroRegNum - returns the register that contains always zero this is the
37// unified register number
38//
39int UltraSparcRegInfo::getZeroRegNum() const { return SparcIntRegOrder::g0; }
40
41// getCallAddressReg - returns the reg used for pushing the address when a
42// method is called. This can be used for other purposes between calls
43//
44unsigned UltraSparcRegInfo::getCallAddressReg() const {
45 return SparcIntRegOrder::o7;
46}
47
48// Returns the register containing the return address.
49// It should be made sure that this register contains the return
50// value when a return instruction is reached.
51//
52unsigned UltraSparcRegInfo::getReturnAddressReg() const {
53 return SparcIntRegOrder::i7;
54}
55
56// given the unified register number, this gives the name
57// for generating assembly code or debugging.
58//
59const std::string UltraSparcRegInfo::getUnifiedRegName(int reg) const {
60 if( reg < 32 )
61 return SparcIntRegOrder::getRegName(reg);
62 else if ( reg < (64 + 32) )
63 return SparcFloatRegOrder::getRegName( reg - 32);
64 else if( reg < (64+32+4) )
65 return SparcFloatCCRegOrder::getRegName( reg -32 - 64);
66 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
67 return SparcIntCCRegOrder::getRegName( reg -32 - 64 - 4);
68 else if (reg== InvalidRegNum) //****** TODO: Remove */
69 return "<*NoReg*>";
70 else
71 assert(0 && "Invalid register number");
72 return "";
73}
74
75unsigned UltraSparcRegInfo::getFramePointer() const {
76 return SparcIntRegOrder::i6;
77}
78
79unsigned UltraSparcRegInfo::getStackPointer() const {
80 return SparcIntRegOrder::o6;
81}
82
83
84
Ruchira Sasankad00982a2002-01-07 19:20:28 +000085//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +000086// Finds the return value of a sparc specific call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000087//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000088const Value *
Ruchira Sasankad00982a2002-01-07 19:20:28 +000089UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000090 unsigned OpCode = CallMI->getOpCode();
Chris Lattner697954c2002-01-20 22:54:45 +000091 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000092
Chris Lattner697954c2002-01-20 22:54:45 +000093 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000094
95 // The one before the last implicit operand is the return value of
96 // a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +000097 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +000098 if( NumOfImpRefs > 1 )
Chris Lattner699683c2002-02-04 05:59:25 +000099 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
100 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000101
Chris Lattner697954c2002-01-20 22:54:45 +0000102 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000103
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000104 // The last implicit operand is the return value of a JMPL
105 //
Chris Lattner697954c2002-01-20 22:54:45 +0000106 if(NumOfImpRefs > 0)
107 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
108 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner699683c2002-02-04 05:59:25 +0000109 } else
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000110 assert(0 && "OpCode must be CALL/JMPL for a call instr");
111
112 return NULL;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000113}
114
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000115
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000116
117//---------------------------------------------------------------------------
118// Finds the return address of a call sparc specific call instruction
119//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000120const Value *
Chris Lattner699683c2002-02-04 05:59:25 +0000121UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000122 unsigned OpCode = CallMI->getOpCode();
123
Chris Lattner699683c2002-02-04 05:59:25 +0000124 if (OpCode == CALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000125 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
126
127 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000128
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000129 // The last implicit operand is the return address of a CALL instr
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000130 //
Chris Lattner699683c2002-02-04 05:59:25 +0000131 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000132
Chris Lattner699683c2002-02-04 05:59:25 +0000133 } else if(OpCode == JMPLCALL) {
134 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000135 return MO.getVRegValue();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000136 }
Chris Lattner699683c2002-02-04 05:59:25 +0000137
138 assert(0 && "OpCode must be CALL/JMPL for a call instr");
139 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000140}
141
Chris Lattner699683c2002-02-04 05:59:25 +0000142// The following 3 methods are used to find the RegType (see enum above)
143// of a LiveRange, Value and using the unified RegClassID
144//
145int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
146 unsigned Typ;
147 switch (LR->getRegClass()->getID()) {
148 case IntRegClassID: return IntRegType;
149 case FloatRegClassID:
150 Typ = LR->getTypeID();
151 if (Typ == Type::FloatTyID)
152 return FPSingleRegType;
153 else if (Typ == Type::DoubleTyID)
154 return FPDoubleRegType;
155 assert(0 && "Unknown type in FloatRegClass");
156
157 case IntCCRegClassID: return IntCCRegType;
158 case FloatCCRegClassID: return FloatCCRegType;
159 default: assert( 0 && "Unknown reg class ID");
160 return 0;
161 }
162}
163
164int UltraSparcRegInfo::getRegType(const Value *Val) const {
165 unsigned Typ;
166
167 switch (getRegClassIDOfValue(Val)) {
168 case IntRegClassID: return IntRegType;
169 case FloatRegClassID:
170 Typ = Val->getType()->getPrimitiveID();
171 if (Typ == Type::FloatTyID)
172 return FPSingleRegType;
173 else if (Typ == Type::DoubleTyID)
174 return FPDoubleRegType;
175 assert(0 && "Unknown type in FloatRegClass");
176
177 case IntCCRegClassID: return IntCCRegType;
178 case FloatCCRegClassID: return FloatCCRegType ;
179 default: assert(0 && "Unknown reg class ID");
180 return 0;
181 }
182}
183
184int UltraSparcRegInfo::getRegType(int reg) const {
185 if (reg < 32)
186 return IntRegType;
187 else if (reg < (32 + 32))
188 return FPSingleRegType;
189 else if (reg < (64 + 32))
190 return FPDoubleRegType;
191 else if (reg < (64+32+4))
192 return FloatCCRegType;
193 else if (reg < (64+32+4+2))
194 return IntCCRegType;
195 else
196 assert(0 && "Invalid register number in getRegType");
197}
198
199
200
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000201
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000202
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000203//---------------------------------------------------------------------------
Vikram S. Adve53fec862001-10-22 13:41:12 +0000204// Finds the # of actual arguments of the call instruction
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000205//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000206unsigned
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000207UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
208
209 unsigned OpCode = CallMI->getOpCode();
Chris Lattner699683c2002-02-04 05:59:25 +0000210 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000211
Chris Lattner699683c2002-02-04 05:59:25 +0000212 if (OpCode == CALL) {
213 switch (NumOfImpRefs) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000214 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner699683c2002-02-04 05:59:25 +0000215 case 1: return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000216 default: // two or more implicit refs
Chris Lattner699683c2002-02-04 05:59:25 +0000217 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
218 return NumOfImpRefs - 2;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000219 else
Chris Lattner699683c2002-02-04 05:59:25 +0000220 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000221 }
Chris Lattner699683c2002-02-04 05:59:25 +0000222 } else if (OpCode == JMPLCALL) {
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000223
224 // The last implicit operand is the return value of a JMPL instr
225 if( NumOfImpRefs > 0 ) {
Chris Lattner699683c2002-02-04 05:59:25 +0000226 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
227 return NumOfImpRefs - 1;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000228 else
Chris Lattner699683c2002-02-04 05:59:25 +0000229 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000230 }
231 else
Chris Lattner699683c2002-02-04 05:59:25 +0000232 return NumOfImpRefs;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000233 }
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000234
Chris Lattner699683c2002-02-04 05:59:25 +0000235 assert(0 && "OpCode must be CALL/JMPL for a call instr");
236 return 0;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000237}
238
239
Vikram S. Adve53fec862001-10-22 13:41:12 +0000240
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000241//---------------------------------------------------------------------------
242// Finds whether a call is an indirect call
243//---------------------------------------------------------------------------
244bool UltraSparcRegInfo::isVarArgCall(const MachineInstr *CallMI) const {
245
246 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
247
248 const MachineOperand & calleeOp = CallMI->getOperand(0);
249 Value *calleeVal = calleeOp.getVRegValue();
250
251 PointerType *PT = cast<PointerType> (calleeVal->getType());
252 MethodType *MT = cast<MethodType>(PT->getElementType());
253
254 return MT->isVarArg();
255}
256
257
258
259
260//---------------------------------------------------------------------------
261// Suggests a register for the ret address in the RET machine instruction.
262// We always suggest %i7 by convention.
263//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000264void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000265 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000266
Vikram S. Adve53fec862001-10-22 13:41:12 +0000267 assert( (RetMI->getNumOperands() >= 2)
268 && "JMPL/RETURN must have 3 and 2 operands respectively");
269
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000270 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
271
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000272 // return address is always mapped to i7
273 //
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000274 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve53fec862001-10-22 13:41:12 +0000275
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000276 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000277 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000278 // we have to test later whether it received the suggested color.
279 // In that case, a LR has to be created at the start of method.
280 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000281
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000282 // const Value *RetAddrVal = MO.getVRegValue();
283 // assert( RetAddrVal && "LR for ret address must be created at start");
284 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
285 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
286 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000287}
288
289
290//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000291// Suggests a register for the ret address in the JMPL/CALL machine instr.
292// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000293//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000294void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
295 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000296 std::vector<RegClass *> RCList) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000297
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000298
299 const Value *RetAddrVal = getCallInstRetAddr( CallMI );
300
301 // RetAddrVal cannot be NULL (asserted in getCallInstRetAddr)
302 // create a new LR for the return address and color it
303
304 LiveRange * RetAddrLR = new LiveRange();
305 RetAddrLR->add( RetAddrVal );
306 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
307 RetAddrLR->setRegClass( RCList[RegClassID] );
308 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
309 LRI.addLRToMap( RetAddrVal, RetAddrLR);
310
Ruchira Sasanka91442282001-09-30 23:16:47 +0000311}
312
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000313
314
Ruchira Sasanka91442282001-09-30 23:16:47 +0000315
316//---------------------------------------------------------------------------
317// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000318// According to the Sparc ABI, the first 6 incoming args are in
319// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000320// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000321// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000322//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000323void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000324 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000325{
326
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000327 // get the argument list
328 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
329 // get an iterator to arg list
330 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
Chris Lattner20b1ea02001-09-14 03:47:57 +0000331
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000332 // for each argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000333 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000334
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000335 // get the LR of arg
336 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000337 assert( LR && "No live range found for method arg");
338
339 unsigned RegType = getRegType( LR );
340
Chris Lattner20b1ea02001-09-14 03:47:57 +0000341
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000342 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000343 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000344 if( RegType == IntRegType ) {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000345
Ruchira Sasanka91442282001-09-30 23:16:47 +0000346 if( argNo < NumOfIntArgRegs) {
347 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000348 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000349 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000350 // Do NOTHING as this will be colored as a normal value.
Chris Lattner1e23ed72001-10-15 18:15:27 +0000351 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000352 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000353
Chris Lattner20b1ea02001-09-14 03:47:57 +0000354 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000355 else if( RegType==FPSingleRegType && (argNo*2+1) < NumOfFloatArgRegs)
356 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
357
358
359 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
360 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
361
Chris Lattner20b1ea02001-09-14 03:47:57 +0000362 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000363}
364
Ruchira Sasanka91442282001-09-30 23:16:47 +0000365
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000366
367//---------------------------------------------------------------------------
368// This method is called after graph coloring to move incoming args to
369// the correct hardware registers if they did not receive the correct
370// (suggested) color through graph coloring.
371//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000372void UltraSparcRegInfo::colorMethodArgs(const Method *Meth,
373 LiveRangeInfo &LRI,
374 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000375
376 // get the argument list
377 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
378 // get an iterator to arg list
379 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
380
381 MachineInstr *AdMI;
382
383
384 // for each argument
385 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
386
387 // get the LR of arg
388 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
389 assert( LR && "No live range found for method arg");
390
391
Ruchira Sasanka91442282001-09-30 23:16:47 +0000392 unsigned RegType = getRegType( LR );
393 unsigned RegClassID = (LR->getRegClass())->getID();
394
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000395 // Find whether this argument is coming in a register (if not, on stack)
396 // Also find the correct register that the argument must go (UniArgReg)
397 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000398 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000399 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000400
401 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
402 isArgInReg = true;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000403 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000404 }
405 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
406 isArgInReg = true;
407 UniArgReg = getUnifiedRegNum( RegClassID,
408 SparcFloatRegOrder::f0 + argNo*2 + 1 ) ;
409 }
410 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
411 isArgInReg = true;
412 UniArgReg = getUnifiedRegNum(RegClassID, SparcFloatRegOrder::f0+argNo*2);
413 }
414
415
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000416 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000417
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000418 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
419
420 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000421 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000422 if( UniLRReg == UniArgReg )
423 continue;
424
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000425 // We are here because the LR did not receive the suggested
426 // but LR received another register.
427 // Now we have to copy the %i reg (or stack pos of arg)
428 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000429
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000430 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000431 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000432 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000433 if( isArgInReg )
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000434 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000435
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000436 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000437
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000438 // Now the arg is coming on stack. Since the LR recieved a register,
439 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000440 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000441 const MachineFrameInfo& frameInfo = target.getFrameInfo();
442 assert(frameInfo.argsOnStackHaveFixedSize());
443
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000444 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000445 int firstArg =
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000446 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
447 growUp);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000448 int offsetFromFP =
449 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
450 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
451
452 AdMI = cpMem2RegMI(getFramePointer(), offsetFromFP,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000453 UniLRReg, RegType );
454 }
455
456 FirstAI->InstrnsBefore.push_back( AdMI );
457
458 } // if LR received a color
459
460 else {
461
462 // Now, the LR did not receive a color. But it has a stack offset for
463 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000464 // So, if the arg is coming in UniArgReg register, we can just move
465 // that on to the stack pos of LR
466
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000467 if( isArgInReg ) {
Chris Lattner697954c2002-01-20 22:54:45 +0000468 cpReg2MemMI(UniArgReg, getFramePointer(),
469 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000470
471 FirstAI->InstrnsBefore.push_back( AdMI );
472 }
473
474 else {
475
476 // Now the arg is coming on stack. Since the LR did NOT
477 // recieved a register as well, it is allocated a stack position. We
478 // can simply change the stack poistion of the LR. We can do this,
479 // since this method is called before any other method that makes
480 // uses of the stack pos of the LR (e.g., updateMachineInstr)
481
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000482 const MachineFrameInfo& frameInfo = target.getFrameInfo();
483 assert(frameInfo.argsOnStackHaveFixedSize());
484
485 bool growUp;
486 int firstArg = frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth), growUp);
487 int offsetFromFP =
488 growUp? firstArg + argNo * frameInfo.getSizeOfEachArgOnStack()
489 : firstArg - argNo * frameInfo.getSizeOfEachArgOnStack();
490
491 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000492 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000493
494 }
495
Ruchira Sasanka91442282001-09-30 23:16:47 +0000496 } // for each incoming argument
497
498}
499
Chris Lattner20b1ea02001-09-14 03:47:57 +0000500
501
Ruchira Sasanka91442282001-09-30 23:16:47 +0000502//---------------------------------------------------------------------------
503// This method is called before graph coloring to suggest colors to the
504// outgoing call args and the return value of the call.
505//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000506void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000507 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000508 std::vector<RegClass *> RCList) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000509
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000510 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000511
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000512 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000513
Chris Lattner20b1ea02001-09-14 03:47:57 +0000514
Ruchira Sasanka91442282001-09-30 23:16:47 +0000515 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000516 // will be in %o0 if the value is an integer type, or in %f0 if the
517 // value is a float type.
518
Ruchira Sasanka91442282001-09-30 23:16:47 +0000519 // the return value cannot have a LR in machine instruction since it is
520 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000521
Ruchira Sasanka91442282001-09-30 23:16:47 +0000522 // if type is not void, create a new live range and set its
523 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000524
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000525
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000526 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000527
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000528
Chris Lattner699683c2002-02-04 05:59:25 +0000529 if (RetVal) {
530 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000531 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000532
Chris Lattner699683c2002-02-04 05:59:25 +0000533 // create a new LR for the return value
534 LiveRange *RetValLR = new LiveRange();
535 RetValLR->add(RetVal);
536 unsigned RegClassID = getRegClassIDOfValue(RetVal);
537 RetValLR->setRegClass(RCList[RegClassID]);
538 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000539
540 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000541
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000542 if( RegClassID == IntRegClassID )
543 RetValLR->setSuggestedColor(SparcIntRegOrder::o0);
544 else if (RegClassID == FloatRegClassID )
545 RetValLR->setSuggestedColor(SparcFloatRegOrder::f0 );
546 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000547 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000548
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000549
Ruchira Sasanka91442282001-09-30 23:16:47 +0000550 // Now suggest colors for arguments (operands) of the call instruction.
551 // Colors are suggested only if the arg number is smaller than the
552 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000553 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000554
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000555 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000556
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000557 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
558
559 const Value *CallArg = CallMI->getImplicitRef(i);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000560
561 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000562 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000563
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000564 // not possible to have a null LR since all args (even consts)
565 // must be defined before
566 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000567 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000568 cerr << " ERROR: In call instr, no LR for arg: " ;
Chris Lattner697954c2002-01-20 22:54:45 +0000569 printValue(CallArg); cerr << "\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000570 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000571 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000572 }
573
574 unsigned RegType = getRegType( LR );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000575
Ruchira Sasanka91442282001-09-30 23:16:47 +0000576 // if the arg is in int class - allocate a reg for an int arg
577 if( RegType == IntRegType ) {
578
579 if( argNo < NumOfIntArgRegs)
580 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
581
582 else if (DEBUG_RA)
583 // Do NOTHING as this will be colored as a normal value.
Chris Lattner697954c2002-01-20 22:54:45 +0000584 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000585
Ruchira Sasanka91442282001-09-30 23:16:47 +0000586 }
587 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
588 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
589
590
591 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
592 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
593
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000594
Ruchira Sasanka91442282001-09-30 23:16:47 +0000595 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000596
Chris Lattner20b1ea02001-09-14 03:47:57 +0000597}
598
599
Ruchira Sasanka91442282001-09-30 23:16:47 +0000600//---------------------------------------------------------------------------
601// After graph coloring, we have call this method to see whehter the return
602// value and the call args received the correct colors. If not, we have
603// to instert copy instructions.
604//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000605
Chris Lattner699683c2002-02-04 05:59:25 +0000606void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
607 LiveRangeInfo &LRI,
608 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000609 PhyRegAlloc &PRA,
610 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000611
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000612 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
613
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000614 // Reset the optional args area in the stack frame
615 // since that is reused for each call
616 //
617 PRA.mcInfo.resetOptionalArgs(target);
618
Ruchira Sasanka91442282001-09-30 23:16:47 +0000619 // First color the return value of the call.
620 // If there is a LR for the return value, it means this
621 // method returns a value
622
623 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000624
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000625 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000626
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000627 if( RetVal ) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000628
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000629 LiveRange * RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000630
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000631 if( !RetValLR ) {
632 cerr << "\nNo LR for:";
633 printValue( RetVal );
Chris Lattner697954c2002-01-20 22:54:45 +0000634 cerr << "\n";
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000635 assert( RetValLR && "ERR:No LR for non-void return value");
636 //return;
637 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000638
639 unsigned RegClassID = (RetValLR->getRegClass())->getID();
640 bool recvCorrectColor = false;
641
642 unsigned CorrectCol; // correct color for ret value
643 if(RegClassID == IntRegClassID)
644 CorrectCol = SparcIntRegOrder::o0;
645 else if(RegClassID == FloatRegClassID)
646 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000647 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000648 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000649 return;
650 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000651
652 // if the LR received the correct color, NOTHING to do
653
654 if( RetValLR->hasColor() )
655 if( RetValLR->getColor() == CorrectCol )
656 recvCorrectColor = true;
657
658
659 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000660 // put copy instruction
661
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000662 if( !recvCorrectColor ) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000663
664 unsigned RegType = getRegType( RetValLR );
665
666 // the reg that LR must be colored with
667 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000668
669 if( RetValLR->hasColor() ) {
670
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000671 unsigned
672 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000673
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000674 // the return value is coming in UniRetReg but has to go into
675 // the UniRetLRReg
676
677 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000678
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000679 } // if LR has color
680 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000681
682 // if the LR did NOT receive a color, we have to move the return
683 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000684
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000685 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
686 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000687 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000688
689 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000690
691 } // the LR didn't receive the suggested color
692
693 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000694
695
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000696 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000697 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000698 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000699
Chris Lattner697954c2002-01-20 22:54:45 +0000700 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000701
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000702 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000703
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000704 bool VarArgCall = isVarArgCall( CallMI );
705
706 if(VarArgCall) cerr << "\nVar arg call found!!\n";
707
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000708 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
709
710 const Value *CallArg = CallMI->getImplicitRef(i);
711
Ruchira Sasanka91442282001-09-30 23:16:47 +0000712 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000713 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000714
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000715 unsigned RegType = getRegType( CallArg );
716 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000717
718 // find whether this argument is coming in a register (if not, on stack)
719
720 bool isArgInReg = false;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000721 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka91442282001-09-30 23:16:47 +0000722
723 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
724 isArgInReg = true;
725 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
726 }
727 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
728 isArgInReg = true;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000729
730 if( !VarArgCall )
731 UniArgReg = getUnifiedRegNum(RegClassID,
732 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
733 else {
734 // a variable argument call - must pass float arg in %o's
735 if( argNo < NumOfIntArgRegs)
736 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
737 else
738 isArgInReg = false;
739 }
740
Ruchira Sasanka91442282001-09-30 23:16:47 +0000741 }
742 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
743 isArgInReg = true;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000744
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000745 if( !VarArgCall )
746 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
747 else {
748 // a variable argument call - must pass float arg in %o's
749 if( argNo < NumOfIntArgRegs)
750 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
751 else
752 isArgInReg = false;
753 }
754 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000755
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000756 // not possible to have a null LR since all args (even consts)
757 // must be defined before
758 if( !LR ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000759 if( DEBUG_RA) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000760 cerr << " ERROR: In call instr, no LR for arg: " ;
Chris Lattner697954c2002-01-20 22:54:45 +0000761 printValue(CallArg); cerr << "\n";
Ruchira Sasanka91442282001-09-30 23:16:47 +0000762 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000763 assert(0 && "NO LR for call arg");
764 // continue;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000765 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000766
Ruchira Sasanka91442282001-09-30 23:16:47 +0000767
Chris Lattner699683c2002-02-04 05:59:25 +0000768 if (LR->hasColor()) {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000769 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
770
771 // if LR received the correct color, nothing to do
772 if( UniLRReg == UniArgReg )
773 continue;
774
Ruchira Sasanka91442282001-09-30 23:16:47 +0000775 // We are here because though the LR is allocated a register, it
776 // was not allocated the suggested register. So, we have to copy %ix reg
777 // (or stack pos of arg) to the register it was colored with
778
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000779 // the LR is colored with UniLRReg but has to go into UniArgReg
780 // to pass it as an argument
Ruchira Sasanka91442282001-09-30 23:16:47 +0000781
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000782 if( isArgInReg ) {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000783
784 if( VarArgCall && RegClassID == FloatRegClassID ) {
785
786
787 // for a variable argument call, the float reg must go in a %o reg.
788 // We have to move a float reg to an int reg via memory.
789 // The store instruction will be directly added to
790 // CallAI->InstrnsBefore since it does not need reordering
791 //
792 int TmpOff = PRA.mcInfo.pushTempValue(target,
793 getSpilledRegSize(RegType));
794
795 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
796 CallAI->InstrnsBefore.push_back( AdMI );
797
798 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
799 AddedInstrnsBefore.push_back( AdMI );
800 }
801
802 else {
803 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
804 AddedInstrnsBefore.push_back( AdMI );
805 }
806
Chris Lattner699683c2002-02-04 05:59:25 +0000807 } else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000808 // Now, we have to pass the arg on stack. Since LR received a register
809 // we just have to move that register to the stack position where
810 // the argument must be passed
Ruchira Sasanka91442282001-09-30 23:16:47 +0000811
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000812 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000813
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000814 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000815
816 // Now add the instruction. We can directly add to
817 // CallAI->InstrnsBefore since we are just saving a reg on stack
818 //
819 CallAI->InstrnsBefore.push_back( AdMI );
820
821 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000822 }
823
Ruchira Sasanka9d478662001-11-12 20:54:19 +0000824
Chris Lattner699683c2002-02-04 05:59:25 +0000825 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka91442282001-09-30 23:16:47 +0000826
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000827 if( isArgInReg ) {
828
829 // Now the LR did NOT recieve a register but has a stack poistion.
830 // Since, the outgoing arg goes in a register we just have to insert
831 // a load instruction to load the LR to outgoing register
832
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000833 if( VarArgCall && RegClassID == FloatRegClassID )
834 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
835 UniArgReg, IntRegType );
836 else
837 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
838 UniArgReg, RegType );
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000839
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000840 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000841 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000842 }
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000843
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000844 else {
845 // Now, we have to pass the arg on stack. Since LR also did NOT
846 // receive a register we have to move an argument in memory to
847 // outgoing parameter on stack.
848
849 // Optoimize: Optimize when reverse pointers in MahineInstr are
850 // introduced.
851 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
852 // fails, then use the following code. Currently, we cannot call the
853 // above method since we cannot find LVSetBefore without the BB
854
Ruchira Sasanka295264d2001-11-15 20:25:07 +0000855 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000856
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000857 int TmpOff = PRA.mcInfo.pushTempValue(target,
858 getSpilledRegSize(getRegType(LR)) );
859
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000860
861 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
862
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000863 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000864
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000865 // Sequence:
866 // (1) Save TReg on stack
867 // (2) Load LR value into TReg from stack pos of LR
868 // (3) Store Treg on outgoing Arg pos on stack
869 // (4) Load the old value of TReg from stack to TReg (restore it)
870
871 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
872 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
873 TReg, RegType );
Ruchira Sasankac56e5c12001-11-11 22:37:51 +0000874 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000875 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000876
877 // We directly add to CallAI->InstrnsBefore instead of adding to
878 // AddedInstrnsBefore since these instructions must not be
879 // reordered.
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000880
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000881 CallAI->InstrnsBefore.push_back( Ad1 );
882 CallAI->InstrnsBefore.push_back( Ad2 );
883 CallAI->InstrnsBefore.push_back( Ad3 );
884 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000885
Ruchira Sasanka91014f62001-11-12 20:31:47 +0000886 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000887 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000888 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000889 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000890
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000891
892 // if we added any instruction before the call instruction, verify
893 // that they are in the proper order and if not, reorder them
894
Chris Lattner699683c2002-02-04 05:59:25 +0000895 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000896
Chris Lattner699683c2002-02-04 05:59:25 +0000897 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000898 cerr << "\nCalling reorder with instrns: \n";
899 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
900 cerr << *(AddedInstrnsBefore[i]);
901 }
902
Chris Lattner697954c2002-01-20 22:54:45 +0000903 std::vector<MachineInstr *> TmpVec;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000904 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000905
Chris Lattner699683c2002-02-04 05:59:25 +0000906 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000907 cerr << "\nAfter reordering instrns: \n";
Chris Lattner699683c2002-02-04 05:59:25 +0000908 for(unsigned i = 0; i < TmpVec.size(); i++)
909 cerr << *TmpVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000910 }
911
912 // copy the results back from TmpVec to InstrnsBefore
913 for(unsigned i=0; i < TmpVec.size(); i++)
914 CallAI->InstrnsBefore.push_back( TmpVec[i] );
915 }
916
917
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000918 // now insert caller saving code for this call instruction
919 //
920 insertCallerSavingCode(CallMI, BB, PRA);
921
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000922 // Reset optional args area again to be safe
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000923 PRA.mcInfo.resetOptionalArgs(target);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000924}
925
Ruchira Sasanka91442282001-09-30 23:16:47 +0000926//---------------------------------------------------------------------------
927// This method is called for an LLVM return instruction to identify which
928// values will be returned from this method and to suggest colors.
929//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000930void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
931 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000932
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000933 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000934
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000935 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000936
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000937 // if there is an implicit ref, that has to be the ret value
938 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000939
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000940 // The first implicit operand is the return value of a return instr
941 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000942
Ruchira Sasanka91442282001-09-30 23:16:47 +0000943 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000944
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000945 if( !LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000946 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000947 printValue( RetVal );
Chris Lattner697954c2002-01-20 22:54:45 +0000948 cerr << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000949 assert( LR && "No LR for return value of non-void method");
950 //return;
951 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000952
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000953 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000954
Chris Lattner699683c2002-02-04 05:59:25 +0000955 if (RegClassID == IntRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000956 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner699683c2002-02-04 05:59:25 +0000957 else if (RegClassID == FloatRegClassID)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000958 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000959 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000960}
961
Ruchira Sasanka91442282001-09-30 23:16:47 +0000962
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000963
964//---------------------------------------------------------------------------
965// Colors the return value of a method to %i0 or %f0, if possible. If it is
966// not possilbe to directly color the LR, insert a copy instruction to move
967// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
968// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000969//---------------------------------------------------------------------------
Chris Lattner699683c2002-02-04 05:59:25 +0000970void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
971 LiveRangeInfo &LRI,
972 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000973
Chris Lattner699683c2002-02-04 05:59:25 +0000974 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +0000975
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000976 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +0000977 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000978
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000979 // The first implicit operand is the return value of a return instr
980 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000981
Chris Lattner699683c2002-02-04 05:59:25 +0000982 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000983
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000984 if( ! LR ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +0000985 cerr << "\nNo LR for:";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000986 printValue( RetVal );
Chris Lattner697954c2002-01-20 22:54:45 +0000987 cerr << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000988 // assert( LR && "No LR for return value of non-void method");
989 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000990 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000991
Ruchira Sasanka91442282001-09-30 23:16:47 +0000992 unsigned RegClassID = getRegClassIDOfValue(RetVal);
993 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000994
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000995 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000996 if(RegClassID == IntRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000997 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +0000998 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka88dedc12001-10-23 21:40:39 +0000999 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001000 else {
Chris Lattner699683c2002-02-04 05:59:25 +00001001 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001002 return;
1003 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001004
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001005 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka91442282001-09-30 23:16:47 +00001006
Chris Lattner699683c2002-02-04 05:59:25 +00001007 if (LR->hasColor() && LR->getColor() == CorrectCol)
1008 return;
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001009
Chris Lattner699683c2002-02-04 05:59:25 +00001010 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001011
Chris Lattner699683c2002-02-04 05:59:25 +00001012 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001013
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001014 // We are here because the LR was allocted a regiter
1015 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001016
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001017 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001018
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001019 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001020
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001021 // the LR received UniLRReg but must be colored with UniRetReg
1022 // to pass as the return value
Chris Lattner697954c2002-01-20 22:54:45 +00001023 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001024 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001025 else { // if the LR is spilled
Chris Lattner697954c2002-01-20 22:54:45 +00001026 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1027 LR->getSpillOffFromFP(),
1028 UniRetReg, RegType);
1029 RetAI->InstrnsBefore.push_back(AdMI);
1030 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001031 }
1032
Ruchira Sasanka91442282001-09-30 23:16:47 +00001033 } // if there is a return value
1034
1035}
1036
1037
1038//---------------------------------------------------------------------------
1039// Copy from a register to register. Register number must be the unified
1040// register number
1041//---------------------------------------------------------------------------
1042
Chris Lattner699683c2002-02-04 05:59:25 +00001043MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
1044 int RegType) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001045
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001046 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001047 "Invalid Register");
1048
1049 MachineInstr * MI = NULL;
1050
1051 switch( RegType ) {
1052
1053 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001054 case IntCCRegType:
1055 case FloatCCRegType:
Ruchira Sasanka91442282001-09-30 23:16:47 +00001056 MI = new MachineInstr(ADD, 3);
1057 MI->SetMachineOperand(0, SrcReg, false);
1058 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1059 MI->SetMachineOperand(2, DestReg, true);
1060 break;
1061
1062 case FPSingleRegType:
1063 MI = new MachineInstr(FMOVS, 2);
1064 MI->SetMachineOperand(0, SrcReg, false);
1065 MI->SetMachineOperand(1, DestReg, true);
1066 break;
1067
1068 case FPDoubleRegType:
1069 MI = new MachineInstr(FMOVD, 2);
1070 MI->SetMachineOperand(0, SrcReg, false);
1071 MI->SetMachineOperand(1, DestReg, true);
1072 break;
1073
1074 default:
1075 assert(0 && "Unknow RegType");
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001076 }
1077
1078 return MI;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001079}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001080
1081
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001082//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001083// Copy from a register to memory (i.e., Store). Register number must
1084// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001085//---------------------------------------------------------------------------
1086
1087
Chris Lattner699683c2002-02-04 05:59:25 +00001088MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1089 unsigned DestPtrReg,
1090 int Offset, int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001091 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001092 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001093 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001094 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001095 MI = new MachineInstr(STX, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001096 MI->SetMachineOperand(0, SrcReg, false);
1097 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001098 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1099 (int64_t) Offset, false);
1100 break;
1101
1102 case FPSingleRegType:
1103 MI = new MachineInstr(ST, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001104 MI->SetMachineOperand(0, SrcReg, false);
1105 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001106 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1107 (int64_t) Offset, false);
1108 break;
1109
1110 case FPDoubleRegType:
1111 MI = new MachineInstr(STD, 3);
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001112 MI->SetMachineOperand(0, SrcReg, false);
1113 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001114 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1115 (int64_t) Offset, false);
1116 break;
1117
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001118 case IntCCRegType:
1119 assert( 0 && "Cannot directly store %ccr to memory");
1120
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001121 default:
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001122 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001123 }
1124
1125 return MI;
1126}
1127
1128
1129//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001130// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001131// register number
1132//---------------------------------------------------------------------------
1133
1134
Chris Lattner699683c2002-02-04 05:59:25 +00001135MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1136 int Offset,
1137 unsigned DestReg,
1138 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001139 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001140 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001141 case IntRegType:
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001142 case FloatCCRegType:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001143 MI = new MachineInstr(LDX, 3);
1144 MI->SetMachineOperand(0, SrcPtrReg, false);
1145 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1146 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001147 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001148 break;
1149
1150 case FPSingleRegType:
1151 MI = new MachineInstr(LD, 3);
1152 MI->SetMachineOperand(0, SrcPtrReg, false);
1153 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1154 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001155 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001156
1157 break;
1158
1159 case FPDoubleRegType:
1160 MI = new MachineInstr(LDD, 3);
1161 MI->SetMachineOperand(0, SrcPtrReg, false);
1162 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1163 (int64_t) Offset, false);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001164 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001165 break;
1166
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001167 case IntCCRegType:
1168 assert( 0 && "Cannot directly load into %ccr from memory");
1169
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001170 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001171 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001172 }
1173
1174 return MI;
1175}
1176
1177
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001178
1179
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001180
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001181//---------------------------------------------------------------------------
1182// Generate a copy instruction to copy a value to another. Temporarily
1183// used by PhiElimination code.
1184//---------------------------------------------------------------------------
1185
1186
Chris Lattner699683c2002-02-04 05:59:25 +00001187MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001188 int RegType = getRegType( Src );
1189
1190 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001191
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001192 MachineInstr * MI = NULL;
1193
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001194 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001195 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001196 MI = new MachineInstr(ADD, 3);
1197 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1198 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1199 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1200 break;
1201
1202 case FPSingleRegType:
1203 MI = new MachineInstr(FMOVS, 2);
1204 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1205 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1206 break;
1207
1208
1209 case FPDoubleRegType:
1210 MI = new MachineInstr(FMOVD, 2);
1211 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1212 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1213 break;
1214
1215 default:
1216 assert(0 && "Unknow RegType in CpValu2Value");
1217 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001218
1219 return MI;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001220}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001221
1222
1223
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001224
1225
1226
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001227//----------------------------------------------------------------------------
1228// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001229// a call machine instruction. The caller saving/restoring instructions are
1230// inserted like:
1231//
1232// ** caller saving instructions
1233// other instructions inserted for the call by ColorCallArg
1234// CALL instruction
1235// other instructions inserted for the call ColorCallArg
1236// ** caller restoring instructions
1237//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001238//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001239
Ruchira Sasanka91442282001-09-30 23:16:47 +00001240
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001241void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1242 const BasicBlock *BB,
1243 PhyRegAlloc &PRA) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001244
Ruchira Sasankabf915522002-01-07 21:03:42 +00001245 // has set to record which registers were saved/restored
1246 //
Chris Lattner697954c2002-01-20 22:54:45 +00001247 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001248
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001249 // Now find the LR of the return value of the call
1250 // The last *implicit operand* is the return value of a call
1251 // Insert it to to he PushedRegSet since we must not save that register
1252 // and restore it after the call.
1253 // We do this because, we look at the LV set *after* the instruction
1254 // to determine, which LRs must be saved across calls. The return value
1255 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001256
1257
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001258 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001259
Chris Lattner699683c2002-02-04 05:59:25 +00001260 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001261 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001262 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001263
Chris Lattner699683c2002-02-04 05:59:25 +00001264 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001265 PushedRegSet.insert(
1266 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001267 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001268 }
1269
1270
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001271 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001272 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001273
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001274 // for each live var in live variable set after machine inst
1275 for( ; LIt != LVSetAft->end(); ++LIt) {
1276
1277 // get the live range corresponding to live var
1278 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1279
1280 // LR can be null if it is a const since a const
1281 // doesn't have a dominating def - see Assumptions above
1282 if( LR ) {
1283
1284 if( LR->hasColor() ) {
1285
1286 unsigned RCID = (LR->getRegClass())->getID();
1287 unsigned Color = LR->getColor();
1288
1289 if ( isRegVolatile(RCID, Color) ) {
1290
1291 // if the value is in both LV sets (i.e., live before and after
1292 // the call machine instruction)
1293
1294 unsigned Reg = getUnifiedRegNum(RCID, Color);
1295
1296 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1297
1298 // if we haven't already pushed that register
1299
1300 unsigned RegType = getRegType( LR );
1301
1302 // Now get two instructions - to push on stack and pop from stack
1303 // and add them to InstrnsBefore and InstrnsAfter of the
1304 // call instruction
1305
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001306
1307 int StackOff = PRA.mcInfo.pushTempValue(target,
1308 getSpilledRegSize(RegType));
1309
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001310
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001311 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001312 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001313
1314
1315 //---- Insert code for pushing the reg on stack ----------
1316
1317 if( RegType == IntCCRegType ) {
1318
1319 // Handle IntCCRegType specially since we cannot directly
1320 // push %ccr on to the stack
1321
1322 const LiveVarSet *LVSetBef =
1323 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1324
1325 // get a free INTEGER register
1326 int FreeIntReg =
Ruchira Sasanka295264d2001-11-15 20:25:07 +00001327 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001328 LVSetBef, AdIBefCC, AdIAftCC);
1329
1330 // insert the instructions in reverse order since we are
1331 // adding them to the front of InstrnsBefore
1332
1333 if(AdIAftCC)
1334 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1335
1336 AdICpCC = cpCCR2IntMI(FreeIntReg);
1337 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1338
1339 if(AdIBefCC)
1340 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1341
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001342 if(DEBUG_RA) {
1343 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1344 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1345 cerr << "\t" << *AdICpCC;
1346 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1347 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001348
1349 } else {
1350 // for any other register type, just add the push inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001351 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001352 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1353 }
1354
1355
1356 //---- Insert code for popping the reg from the stack ----------
1357
1358 if( RegType == IntCCRegType ) {
1359
1360 // Handle IntCCRegType specially since we cannot directly
1361 // pop %ccr on from the stack
1362
1363 // get a free INT register
1364 int FreeIntReg =
Ruchira Sasanka295264d2001-11-15 20:25:07 +00001365 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001366 LVSetAft, AdIBefCC, AdIAftCC);
1367
1368 if(AdIBefCC)
1369 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1370
1371 AdICpCC = cpInt2CCRMI(FreeIntReg);
1372 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1373
1374 if(AdIAftCC)
1375 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1376
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001377 if(DEBUG_RA) {
1378
1379 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1380 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1381 cerr << "\t" << *AdICpCC;
1382 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1383 }
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001384
1385 } else {
1386 // for any other register type, just add the pop inst
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001387 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001388 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001389 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001390
1391 PushedRegSet.insert( Reg );
1392
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001393 if(DEBUG_RA) {
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001394 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001395 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Adve9576b152001-11-06 05:01:54 +00001396 if( RegType == IntCCRegType )
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001397 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Adve9576b152001-11-06 05:01:54 +00001398 else
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001399 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001400 }
1401 } // if not already pushed
1402
1403 } // if LR has a volatile color
1404
1405 } // if LR has color
1406
1407 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001408
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001409 } // for each value in the LV set after instruction
1410
Ruchira Sasanka91442282001-09-30 23:16:47 +00001411}
1412
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001413//---------------------------------------------------------------------------
1414// Copies %ccr into an integer register. IntReg is the UNIFIED register
1415// number.
1416//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +00001417
Chris Lattner699683c2002-02-04 05:59:25 +00001418MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1419 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001420 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1421 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001422 return MI;
1423}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001424
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001425//---------------------------------------------------------------------------
1426// Copies an integer register into %ccr. IntReg is the UNIFIED register
1427// number.
1428//---------------------------------------------------------------------------
1429
Chris Lattner699683c2002-02-04 05:59:25 +00001430MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1431 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001432 MI->SetMachineOperand(0, IntReg, false);
1433 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1434 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001435 return MI;
1436}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001437
1438
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001439
1440
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001441//---------------------------------------------------------------------------
1442// Print the register assigned to a LR
1443//---------------------------------------------------------------------------
1444
Chris Lattner699683c2002-02-04 05:59:25 +00001445void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001446 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001447 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001448
Chris Lattner699683c2002-02-04 05:59:25 +00001449 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001450 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001451 return;
1452 }
1453
1454 // if a color is found
1455
Chris Lattner1e23ed72001-10-15 18:15:27 +00001456 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001457
Chris Lattner699683c2002-02-04 05:59:25 +00001458 if (RegClassID == IntRegClassID) {
Chris Lattner697954c2002-01-20 22:54:45 +00001459 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001460
Chris Lattner699683c2002-02-04 05:59:25 +00001461 } else if (RegClassID == FloatRegClassID) {
Chris Lattner1e23ed72001-10-15 18:15:27 +00001462 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001463 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattner1e23ed72001-10-15 18:15:27 +00001464 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001465 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001466 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001467}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001468
1469//---------------------------------------------------------------------------
1470// This method examines instructions inserted by RegAlloc code before a
1471// machine instruction to detect invalid orders that destroy values before
1472// they are used. If it detects such conditions, it reorders the instructions.
1473//
1474// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001475// instructions inserted by RegAlloc. All such instruction MUST have
1476// their USES BEFORE THE DEFS after reordering.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001477
1478// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1479// this method is called.
1480
1481// This method uses two vectors for efficiency in accessing
1482
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001483// Since instructions are inserted in RegAlloc, this assumes that the
1484// first operand is the source reg and the last operand is the dest reg.
1485
1486// All the uses are before THE def to a register
1487
1488
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001489//---------------------------------------------------------------------------
Chris Lattner697954c2002-01-20 22:54:45 +00001490void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1491 std::vector<MachineInstr *> &OrdVec,
1492 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001493
1494 /*
1495 Problem: We can have instructions inserted by RegAlloc like
1496 1. add %ox %g0 %oy
1497 2. add %oy %g0 %oz, where z!=x or z==x
1498
1499 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001500
1501 Solution:
1502 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001503
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001504 Algorithm:
1505
1506 do
1507 for each instruction 'DefInst' in the UnOrdVec
1508 for each instruction 'UseInst' that follows the DefInst
1509 if the reg defined by DefInst is used by UseInst
1510 mark DefInst as not movable in this iteration
1511 If DefInst is not marked as not-movable, move DefInst to OrdVec
1512 while all instructions in DefInst are moved to OrdVec
1513
1514 For moving, we call the move2OrdVec(). It checks whether there is a def
1515 in it for the uses in the instruction to be added to OrdVec. If there
1516 are no preceding defs, it just appends the instruction. If there is a
1517 preceding def, it puts two instructions to save the reg on stack before
1518 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001519
1520 */
1521
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001522 bool CouldMoveAll;
1523 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001524
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001525 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001526 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001527 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001528
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001529 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001530
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001531 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001532
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001533 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001534
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001535 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001536
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001537 //cerr << "\nInst in UnordVec = " << *DefInst;
1538
1539 // last operand is the def (unless for a store which has no def reg)
1540 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1541
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001542 if( DefOp.opIsDef() &&
1543 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001544
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001545 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001546
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001547 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001548
Chris Lattner697954c2002-01-20 22:54:45 +00001549 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001550 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001551
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001552 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1553
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001554 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001555 if( UseInst == NULL) continue;
1556
1557 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001558 MachineOperand& UseOp = UseInst->getOperand(0);
1559
1560 if( ! UseOp.opIsDef() &&
1561 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1562
1563 // if use is a register ...
1564
1565 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1566
1567 // if Def and this use are the same, it means that this use
1568 // is destroyed by a def before it is used
1569
1570 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001571
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001572 DefEqUse = true;
1573 CouldMoveAll = false;
1574 DebugPrint = true;
1575 break;
1576 } // if two registers are equal
1577
1578 } // if use is a register
1579
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001580 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001581
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001582 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001583
1584 // after examining all the instructions that follow the DefInst
1585 // if there are no dependencies, we can move it to the OrdVec
1586
1587 // cerr << "Moved to Ord: " << *DefInst;
1588
1589 moveInst2OrdVec(OrdVec, DefInst, PRA);
1590
1591 //OrdVec.push_back(DefInst);
1592
1593 // mark the pos of DefInst with NULL to indicate that it is
1594 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001595 *DefIt = NULL;
1596 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001597
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001598 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001599
1600 } // for all instructions in the UnordVec
1601
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001602
Chris Lattner699683c2002-02-04 05:59:25 +00001603 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001604
Chris Lattner699683c2002-02-04 05:59:25 +00001605 if (DebugPrint) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001606 cerr << "\nAdded instructions were reordered to:\n";
1607 for(unsigned int i=0; i < OrdVec.size(); i++)
1608 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001609 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001610}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001611
1612
1613
1614
1615
Chris Lattner697954c2002-01-20 22:54:45 +00001616void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001617 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001618 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001619 MachineOperand& UseOp = UnordInst->getOperand(0);
1620
1621 if( ! UseOp.opIsDef() &&
1622 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1623
1624 // for the use of UnordInst, see whether there is a defining instr
1625 // before in the OrdVec
1626 bool DefEqUse = false;
1627
Chris Lattner697954c2002-01-20 22:54:45 +00001628 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001629
1630 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1631
1632 MachineInstr *OrdInst = *OrdIt ;
1633
1634 MachineOperand& DefOp =
1635 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1636
1637 if( DefOp.opIsDef() &&
1638 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1639
1640 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1641
1642 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1643
1644 // we are here because there is a preceding def in the OrdVec
1645 // for the use in this intr we are going to insert. This
1646 // happened because the original code was like:
1647 // 1. add %ox %g0 %oy
1648 // 2. add %oy %g0 %ox
1649 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1650 // Now we are processing %ox of 1.
1651 // We have to
1652
1653 const int UReg = DefOp.getMachineRegNum();
1654 const int RegType = getRegType(UReg);
1655 MachineInstr *AdIBef, *AdIAft;
1656
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001657 const int StackOff = PRA.mcInfo.pushTempValue(target,
1658 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001659
1660 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001661 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001662 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1663 OrdIt++; // points to current instr we processed
1664
1665 // Load directly into DReg (%oy)
1666 MachineOperand& DOp=
1667 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1668 assert(DOp.opIsDef() && "Last operand is not the def");
1669 const int DReg = DOp.getMachineRegNum();
1670
Ruchira Sasanka6beb0132001-11-11 21:49:37 +00001671 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001672 OrdVec.push_back(AdIAft);
1673
1674 cerr << "\nFixed CIRCULAR references by reordering";
1675
1676 if( DEBUG_RA ) {
1677 cerr << "\nBefore CIRCULAR Reordering:\n";
1678 cerr << *UnordInst;
1679 cerr << *OrdInst;
1680
1681 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1682 for(unsigned i=0; i < OrdVec.size(); i++)
1683 cerr << *(OrdVec[i]);
1684 }
1685
1686 // Do not copy the UseInst to OrdVec
1687 DefEqUse = true;
1688 break;
1689
1690 }// if two registers are equal
1691
1692 } // if Def is a register
1693
1694 } // for each instr in OrdVec
1695
Chris Lattner699683c2002-02-04 05:59:25 +00001696 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001697
1698 // We didn't find a def in the OrdVec, so just append this inst
1699 OrdVec.push_back( UnordInst );
1700 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1701 }
1702
1703 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001704}