blob: 6e2c1b0cd67cf44b010c8d7fd41778865e81862e [file] [log] [blame]
Chris Lattner029af0b2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner5216cc52002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattner029af0b2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Chris Lattner5216cc52002-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 Sasanka4cfbfd52002-01-07 19:20:28 +000018#include "llvm/DerivedTypes.h"
Chris Lattner7f74a562002-01-20 22:54:45 +000019#include <iostream>
20using std::cerr;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +000021
Chris Lattner5216cc52002-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 Sasanka4cfbfd52002-01-07 19:20:28 +000085//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000086// Finds the return value of a sparc specific call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000087//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +000088const Value *
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000089UltraSparcRegInfo::getCallInstRetVal(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000090 unsigned OpCode = CallMI->getOpCode();
Chris Lattner7f74a562002-01-20 22:54:45 +000091 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +000092
Chris Lattner7f74a562002-01-20 22:54:45 +000093 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +000094
95 // The one before the last implicit operand is the return value of
96 // a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +000097 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +000098 if( NumOfImpRefs > 1 )
Chris Lattner5216cc52002-02-04 05:59:25 +000099 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
100 return CallMI->getImplicitRef(NumOfImpRefs-2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000101
Chris Lattner7f74a562002-01-20 22:54:45 +0000102 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000103
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000104 // The last implicit operand is the return value of a JMPL
105 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000106 if(NumOfImpRefs > 0)
107 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
108 return CallMI->getImplicitRef(NumOfImpRefs-1);
Chris Lattner5216cc52002-02-04 05:59:25 +0000109 } else
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000110 assert(0 && "OpCode must be CALL/JMPL for a call instr");
111
112 return NULL;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000113}
114
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000115
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000116
117//---------------------------------------------------------------------------
118// Finds the return address of a call sparc specific call instruction
119//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000120const Value *
Chris Lattner5216cc52002-02-04 05:59:25 +0000121UltraSparcRegInfo::getCallInstRetAddr(const MachineInstr *CallMI) const {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000122 unsigned OpCode = CallMI->getOpCode();
123
Chris Lattner5216cc52002-02-04 05:59:25 +0000124 if (OpCode == CALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000125 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
126
127 assert( NumOfImpRefs && "CALL instr must have at least on ImpRef");
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000128
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000129 // The last implicit operand is the return address of a CALL instr
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000130 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000131 return CallMI->getImplicitRef(NumOfImpRefs-1);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000132
Chris Lattner5216cc52002-02-04 05:59:25 +0000133 } else if(OpCode == JMPLCALL) {
134 MachineOperand &MO = (MachineOperand &)CallMI->getOperand(2);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000135 return MO.getVRegValue();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000136 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000137
138 assert(0 && "OpCode must be CALL/JMPL for a call instr");
139 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000140}
141
Chris Lattner5216cc52002-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 Sasanka24729a32001-10-21 16:43:41 +0000201
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000202
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000203//---------------------------------------------------------------------------
Vikram S. Adve84982772001-10-22 13:41:12 +0000204// Finds the # of actual arguments of the call instruction
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000205//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000206unsigned
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000207UltraSparcRegInfo::getCallInstNumArgs(const MachineInstr *CallMI) const {
208
209 unsigned OpCode = CallMI->getOpCode();
Chris Lattner5216cc52002-02-04 05:59:25 +0000210 unsigned NumOfImpRefs = CallMI->getNumImplicitRefs();
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000211
Chris Lattner5216cc52002-02-04 05:59:25 +0000212 if (OpCode == CALL) {
213 switch (NumOfImpRefs) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000214 case 0: assert(0 && "A CALL inst must have at least one ImpRef (RetAddr)");
Chris Lattner5216cc52002-02-04 05:59:25 +0000215 case 1: return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000216 default: // two or more implicit refs
Chris Lattner5216cc52002-02-04 05:59:25 +0000217 if (CallMI->implicitRefIsDefined(NumOfImpRefs-2))
218 return NumOfImpRefs - 2;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000219 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000220 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000221 }
Chris Lattner5216cc52002-02-04 05:59:25 +0000222 } else if (OpCode == JMPLCALL) {
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000223
224 // The last implicit operand is the return value of a JMPL instr
225 if( NumOfImpRefs > 0 ) {
Chris Lattner5216cc52002-02-04 05:59:25 +0000226 if (CallMI->implicitRefIsDefined(NumOfImpRefs-1))
227 return NumOfImpRefs - 1;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000228 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000229 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000230 }
231 else
Chris Lattner5216cc52002-02-04 05:59:25 +0000232 return NumOfImpRefs;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000233 }
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000234
Chris Lattner5216cc52002-02-04 05:59:25 +0000235 assert(0 && "OpCode must be CALL/JMPL for a call instr");
236 return 0;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000237}
238
239
Vikram S. Adve84982772001-10-22 13:41:12 +0000240
Ruchira Sasanka4cfbfd52002-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 Lattner5216cc52002-02-04 05:59:25 +0000264void UltraSparcRegInfo::suggestReg4RetAddr(const MachineInstr *RetMI,
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000265 LiveRangeInfo& LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000266
Vikram S. Adve84982772001-10-22 13:41:12 +0000267 assert( (RetMI->getNumOperands() >= 2)
268 && "JMPL/RETURN must have 3 and 2 operands respectively");
269
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000270 MachineOperand & MO = ( MachineOperand &) RetMI->getOperand(0);
271
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000272 // return address is always mapped to i7
273 //
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000274 MO.setRegForValue( getUnifiedRegNum( IntRegClassID, SparcIntRegOrder::i7) );
Vikram S. Adve84982772001-10-22 13:41:12 +0000275
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000276 // Possible Optimization:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000277 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000281
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000287}
288
289
290//---------------------------------------------------------------------------
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000293//---------------------------------------------------------------------------
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000294void UltraSparcRegInfo::suggestReg4CallAddr(const MachineInstr * CallMI,
295 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000296 std::vector<RegClass *> RCList) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000297
Ruchira Sasanka24729a32001-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();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000305 RetAddrLR->insert( RetAddrVal );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000306 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
307 RetAddrLR->setRegClass( RCList[RegClassID] );
308 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o7));
309 LRI.addLRToMap( RetAddrVal, RetAddrLR);
310
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000311}
312
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000313
314
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000315
316//---------------------------------------------------------------------------
317// This method will suggest colors to incoming args to a method.
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000320// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000321// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000322//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000323void UltraSparcRegInfo::suggestRegs4MethodArgs(const Method *Meth,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000324 LiveRangeInfo& LRI) const
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000325{
326
Ruchira Sasankadfc6c882001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000331
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000332 // for each argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000333 for( unsigned argNo=0; ArgIt != ArgList.end() ; ++ArgIt, ++argNo) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000334
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000335 // get the LR of arg
336 LiveRange *const LR = LRI.getLiveRangeForValue((const Value *) *ArgIt);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000337 assert( LR && "No live range found for method arg");
338
339 unsigned RegType = getRegType( LR );
340
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000341
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000342 // if the arg is in int class - allocate a reg for an int arg
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000343 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000344 if( RegType == IntRegType ) {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000345
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000346 if( argNo < NumOfIntArgRegs) {
347 LR->setSuggestedColor( SparcIntRegOrder::i0 + argNo );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000348 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000349 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000350 // Do NOTHING as this will be colored as a normal value.
Chris Lattnerf3f1e452001-10-15 18:15:27 +0000351 if (DEBUG_RA) cerr << " Int Regr not suggested for method arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000352 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000353
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000354 }
Ruchira Sasanka5867c7a2001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000362 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000363}
364
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000365
Ruchira Sasanka4cfbfd52002-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 Lattner5216cc52002-02-04 05:59:25 +0000372void UltraSparcRegInfo::colorMethodArgs(const Method *Meth,
373 LiveRangeInfo &LRI,
374 AddedInstrns *FirstAI) const {
Ruchira Sasanka5867c7a2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000392 unsigned RegType = getRegType( LR );
393 unsigned RegClassID = (LR->getRegClass())->getID();
394
Ruchira Sasanka4cfbfd52002-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 Sasanka5867c7a2001-09-30 23:16:47 +0000398 bool isArgInReg = false;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000399 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000400
401 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
402 isArgInReg = true;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000403 UniArgReg = getUnifiedRegNum( RegClassID, SparcIntRegOrder::i0 + argNo );
Ruchira Sasanka5867c7a2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000416 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000417
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000418 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
419
420 // if LR received the correct color, nothing to do
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000421 //
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000422 if( UniLRReg == UniArgReg )
423 continue;
424
Ruchira Sasanka4cfbfd52002-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 Sasanka36bcd792001-10-24 15:56:58 +0000429
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000430 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000431 // the UniLRReg register
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000432 //
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000433 if( isArgInReg )
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000434 AdMI = cpReg2RegMI( UniArgReg, UniLRReg, RegType );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000435
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000436 else {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000437
Ruchira Sasanka9c38dbc2001-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 Sasanka4cfbfd52002-01-07 19:20:28 +0000440 //
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000441 const MachineFrameInfo& frameInfo = target.getFrameInfo();
442 assert(frameInfo.argsOnStackHaveFixedSize());
443
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000444 bool growUp; // find the offset of arg in stack frame
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000445 int firstArg =
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000446 frameInfo.getFirstIncomingArgOffset(MachineCodeForMethod::get(Meth),
447 growUp);
Vikram S. Adve7a1524f2001-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 Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000467 if( isArgInReg ) {
Chris Lattner7f74a562002-01-20 22:54:45 +0000468 cpReg2MemMI(UniArgReg, getFramePointer(),
469 LR->getSpillOffFromFP(), RegType );
Ruchira Sasanka9c38dbc2001-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. Adve7a1524f2001-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 Sasanka9c38dbc2001-10-28 18:15:12 +0000492 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000493
494 }
495
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000496 } // for each incoming argument
497
498}
499
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000500
501
Ruchira Sasanka5867c7a2001-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 Lattner5216cc52002-02-04 05:59:25 +0000506void UltraSparcRegInfo::suggestRegs4CallArgs(const MachineInstr *CallMI,
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000507 LiveRangeInfo& LRI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000508 std::vector<RegClass *> RCList) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000509
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000510 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000511
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000512 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000513
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000514
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000515 // First color the return value of the call instruction. The return value
Ruchira Sasankadfc6c882001-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 Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000521
Ruchira Sasanka5867c7a2001-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 Sasankadfc6c882001-09-18 22:52:44 +0000524
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000525
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000526 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000527
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000528
Chris Lattner5216cc52002-02-04 05:59:25 +0000529 if (RetVal) {
530 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000531 "LR for ret Value of call already definded!");
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000532
Chris Lattner5216cc52002-02-04 05:59:25 +0000533 // create a new LR for the return value
534 LiveRange *RetValLR = new LiveRange();
Chris Lattnere6b511d2002-02-04 16:37:09 +0000535 RetValLR->insert(RetVal);
Chris Lattner5216cc52002-02-04 05:59:25 +0000536 unsigned RegClassID = getRegClassIDOfValue(RetVal);
537 RetValLR->setRegClass(RCList[RegClassID]);
538 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000539
540 // now suggest a register depending on the register class of ret arg
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000541
Ruchira Sasanka24729a32001-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 Lattnerb0ddffa2001-09-14 03:47:57 +0000547 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000548
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000549
Ruchira Sasanka5867c7a2001-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 Sasanka24729a32001-10-21 16:43:41 +0000553 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000554
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000555 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000556
Ruchira Sasanka086bf0f2001-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 Sasanka5867c7a2001-09-30 23:16:47 +0000560
561 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000562 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000563
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000564 // not possible to have a null LR since all args (even consts)
565 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000566 if (!LR) {
567 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000568 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000569 }
570
571 unsigned RegType = getRegType( LR );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000572
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000573 // if the arg is in int class - allocate a reg for an int arg
574 if( RegType == IntRegType ) {
575
576 if( argNo < NumOfIntArgRegs)
577 LR->setSuggestedColor( SparcIntRegOrder::o0 + argNo );
578
579 else if (DEBUG_RA)
580 // Do NOTHING as this will be colored as a normal value.
Chris Lattner7f74a562002-01-20 22:54:45 +0000581 cerr << " Regr not suggested for int call arg\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000582
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000583 }
584 else if( RegType == FPSingleRegType && (argNo*2 +1)< NumOfFloatArgRegs)
585 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2 + 1) );
586
587
588 else if( RegType == FPDoubleRegType && (argNo*2) < NumOfFloatArgRegs)
589 LR->setSuggestedColor( SparcFloatRegOrder::f0 + (argNo * 2) );
590
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000591
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000592 } // for all call arguments
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000593
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000594}
595
596
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000597//---------------------------------------------------------------------------
598// After graph coloring, we have call this method to see whehter the return
599// value and the call args received the correct colors. If not, we have
600// to instert copy instructions.
601//---------------------------------------------------------------------------
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000602
Chris Lattner5216cc52002-02-04 05:59:25 +0000603void UltraSparcRegInfo::colorCallArgs(const MachineInstr *CallMI,
604 LiveRangeInfo &LRI,
605 AddedInstrns *CallAI,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000606 PhyRegAlloc &PRA,
607 const BasicBlock *BB) const {
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000608
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000609 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
610
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000611 // Reset the optional args area in the stack frame
612 // since that is reused for each call
613 //
614 PRA.mcInfo.resetOptionalArgs(target);
615
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000616 // First color the return value of the call.
617 // If there is a LR for the return value, it means this
618 // method returns a value
619
620 MachineInstr *AdMI;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000621
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000622 const Value *RetVal = getCallInstRetVal( CallMI );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000623
Chris Lattner30e8fb62002-02-05 01:43:49 +0000624 if (RetVal) {
625 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000626
Chris Lattner30e8fb62002-02-05 01:43:49 +0000627 if (!RetValLR) {
628 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
629 assert(0 && "ERR:No LR for non-void return value");
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000630 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000631
632 unsigned RegClassID = (RetValLR->getRegClass())->getID();
633 bool recvCorrectColor = false;
634
635 unsigned CorrectCol; // correct color for ret value
636 if(RegClassID == IntRegClassID)
637 CorrectCol = SparcIntRegOrder::o0;
638 else if(RegClassID == FloatRegClassID)
639 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000640 else {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000641 assert( 0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000642 return;
643 }
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000644
645 // if the LR received the correct color, NOTHING to do
646
647 if( RetValLR->hasColor() )
648 if( RetValLR->getColor() == CorrectCol )
649 recvCorrectColor = true;
650
651
652 // if we didn't receive the correct color for some reason,
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000653 // put copy instruction
654
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000655 if( !recvCorrectColor ) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000656
657 unsigned RegType = getRegType( RetValLR );
658
659 // the reg that LR must be colored with
660 unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol);
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000661
662 if( RetValLR->hasColor() ) {
663
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000664 unsigned
665 UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000666
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000667 // the return value is coming in UniRetReg but has to go into
668 // the UniRetLRReg
669
670 AdMI = cpReg2RegMI( UniRetReg, UniRetLRReg, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000671
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000672 } // if LR has color
673 else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000674
675 // if the LR did NOT receive a color, we have to move the return
676 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000677
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000678 AdMI = cpReg2MemMI(UniRetReg, getFramePointer(),
679 RetValLR->getSpillOffFromFP(), RegType );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000680 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000681
682 CallAI->InstrnsAfter.push_back( AdMI );
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000683
684 } // the LR didn't receive the suggested color
685
686 } // if there a return value
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000687
688
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000689 //-------------------------------------------
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000690 // Now color all args of the call instruction
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000691 //-------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000692
Chris Lattner7f74a562002-01-20 22:54:45 +0000693 std::vector<MachineInstr *> AddedInstrnsBefore;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000694
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000695 unsigned NumOfCallArgs = getCallInstNumArgs( CallMI );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000696
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000697 bool VarArgCall = isVarArgCall( CallMI );
698
699 if(VarArgCall) cerr << "\nVar arg call found!!\n";
700
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000701 for(unsigned argNo=0, i=0; i < NumOfCallArgs; ++i, ++argNo ) {
702
703 const Value *CallArg = CallMI->getImplicitRef(i);
704
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000705 // get the LR of call operand (parameter)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000706 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000707
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000708 unsigned RegType = getRegType( CallArg );
709 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000710
711 // find whether this argument is coming in a register (if not, on stack)
712
713 bool isArgInReg = false;
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000714 unsigned UniArgReg = InvalidRegNum; // reg that LR must be colored with
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000715
716 if( (RegType== IntRegType && argNo < NumOfIntArgRegs)) {
717 isArgInReg = true;
718 UniArgReg = getUnifiedRegNum(RegClassID, SparcIntRegOrder::o0 + argNo );
719 }
720 else if(RegType == FPSingleRegType && argNo < NumOfFloatArgRegs) {
721 isArgInReg = true;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000722
723 if( !VarArgCall )
724 UniArgReg = getUnifiedRegNum(RegClassID,
725 SparcFloatRegOrder::f0 + (argNo*2 + 1) );
726 else {
727 // a variable argument call - must pass float arg in %o's
728 if( argNo < NumOfIntArgRegs)
729 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
730 else
731 isArgInReg = false;
732 }
733
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000734 }
735 else if(RegType == FPDoubleRegType && argNo < NumOfFloatArgRegs) {
736 isArgInReg = true;
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000737
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000738 if( !VarArgCall )
739 UniArgReg =getUnifiedRegNum(RegClassID,SparcFloatRegOrder::f0+argNo*2);
740 else {
741 // a variable argument call - must pass float arg in %o's
742 if( argNo < NumOfIntArgRegs)
743 UniArgReg=getUnifiedRegNum(IntRegClassID,SparcIntRegOrder::o0+argNo);
744 else
745 isArgInReg = false;
746 }
747 }
Chris Lattnerb0ddffa2001-09-14 03:47:57 +0000748
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000749 // not possible to have a null LR since all args (even consts)
750 // must be defined before
Chris Lattner30e8fb62002-02-05 01:43:49 +0000751 if (!LR) {
752 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000753 assert(0 && "NO LR for call arg");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000754 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000755
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000756
Chris Lattner5216cc52002-02-04 05:59:25 +0000757 if (LR->hasColor()) {
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000758 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
759
760 // if LR received the correct color, nothing to do
761 if( UniLRReg == UniArgReg )
762 continue;
763
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000764 // We are here because though the LR is allocated a register, it
765 // was not allocated the suggested register. So, we have to copy %ix reg
766 // (or stack pos of arg) to the register it was colored with
767
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000768 // the LR is colored with UniLRReg but has to go into UniArgReg
769 // to pass it as an argument
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000770
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000771 if( isArgInReg ) {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000772
773 if( VarArgCall && RegClassID == FloatRegClassID ) {
774
775
776 // for a variable argument call, the float reg must go in a %o reg.
777 // We have to move a float reg to an int reg via memory.
778 // The store instruction will be directly added to
779 // CallAI->InstrnsBefore since it does not need reordering
780 //
781 int TmpOff = PRA.mcInfo.pushTempValue(target,
782 getSpilledRegSize(RegType));
783
784 AdMI = cpReg2MemMI(UniLRReg, getFramePointer(), TmpOff, RegType );
785 CallAI->InstrnsBefore.push_back( AdMI );
786
787 AdMI = cpMem2RegMI(getFramePointer(), TmpOff, UniArgReg, IntRegType);
788 AddedInstrnsBefore.push_back( AdMI );
789 }
790
791 else {
792 AdMI = cpReg2RegMI(UniLRReg, UniArgReg, RegType );
793 AddedInstrnsBefore.push_back( AdMI );
794 }
795
Chris Lattner5216cc52002-02-04 05:59:25 +0000796 } else {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000797 // Now, we have to pass the arg on stack. Since LR received a register
798 // we just have to move that register to the stack position where
799 // the argument must be passed
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000800
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000801 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000802
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000803 AdMI = cpReg2MemMI(UniLRReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000804
805 // Now add the instruction. We can directly add to
806 // CallAI->InstrnsBefore since we are just saving a reg on stack
807 //
808 CallAI->InstrnsBefore.push_back( AdMI );
809
810 //cerr << "\nCaution: Passing a reg on stack";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000811 }
812
Ruchira Sasanka20e105f2001-11-12 20:54:19 +0000813
Chris Lattner5216cc52002-02-04 05:59:25 +0000814 } else { // LR is not colored (i.e., spilled)
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000815
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000816 if( isArgInReg ) {
817
818 // Now the LR did NOT recieve a register but has a stack poistion.
819 // Since, the outgoing arg goes in a register we just have to insert
820 // a load instruction to load the LR to outgoing register
821
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000822 if( VarArgCall && RegClassID == FloatRegClassID )
823 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
824 UniArgReg, IntRegType );
825 else
826 AdMI = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
827 UniArgReg, RegType );
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000828
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000829 cerr << "\nCaution: Loading a spilled val to a reg as a call arg";
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000830 AddedInstrnsBefore.push_back( AdMI ); // Now add the instruction
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000831 }
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000832
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000833 else {
834 // Now, we have to pass the arg on stack. Since LR also did NOT
835 // receive a register we have to move an argument in memory to
836 // outgoing parameter on stack.
837
838 // Optoimize: Optimize when reverse pointers in MahineInstr are
839 // introduced.
840 // call PRA.getUnusedRegAtMI(....) to get an unused reg. Only if this
841 // fails, then use the following code. Currently, we cannot call the
842 // above method since we cannot find LVSetBefore without the BB
843
Ruchira Sasankac97ccc52001-11-15 20:25:07 +0000844 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000845
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000846 int TmpOff = PRA.mcInfo.pushTempValue(target,
847 getSpilledRegSize(getRegType(LR)) );
848
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000849
850 int argOffset = PRA.mcInfo.allocateOptionalArg(target, LR->getType());
851
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000852 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000853
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000854 // Sequence:
855 // (1) Save TReg on stack
856 // (2) Load LR value into TReg from stack pos of LR
857 // (3) Store Treg on outgoing Arg pos on stack
858 // (4) Load the old value of TReg from stack to TReg (restore it)
859
860 Ad1 = cpReg2MemMI(TReg, getFramePointer(), TmpOff, RegType );
861 Ad2 = cpMem2RegMI(getFramePointer(), LR->getSpillOffFromFP(),
862 TReg, RegType );
Ruchira Sasanka80fc4342001-11-11 22:37:51 +0000863 Ad3 = cpReg2MemMI(TReg, getStackPointer(), argOffset, RegType );
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000864 Ad4 = cpMem2RegMI(getFramePointer(), TmpOff, TReg, RegType );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000865
866 // We directly add to CallAI->InstrnsBefore instead of adding to
867 // AddedInstrnsBefore since these instructions must not be
868 // reordered.
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000869
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000870 CallAI->InstrnsBefore.push_back( Ad1 );
871 CallAI->InstrnsBefore.push_back( Ad2 );
872 CallAI->InstrnsBefore.push_back( Ad3 );
873 CallAI->InstrnsBefore.push_back( Ad4 );
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000874
Ruchira Sasanka24e29432001-11-12 20:31:47 +0000875 cerr << "\nCaution: Call arg moved from stack2stack for: " << *CallMI ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000876 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000877 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000878 } // for each parameter in call instruction
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000879
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000880
881 // if we added any instruction before the call instruction, verify
882 // that they are in the proper order and if not, reorder them
883
Chris Lattner5216cc52002-02-04 05:59:25 +0000884 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000885
Chris Lattner5216cc52002-02-04 05:59:25 +0000886 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000887 cerr << "\nCalling reorder with instrns: \n";
888 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
889 cerr << *(AddedInstrnsBefore[i]);
890 }
891
Chris Lattner7f74a562002-01-20 22:54:45 +0000892 std::vector<MachineInstr *> TmpVec;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000893 OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000894
Chris Lattner5216cc52002-02-04 05:59:25 +0000895 if (DEBUG_RA) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000896 cerr << "\nAfter reordering instrns: \n";
Chris Lattner5216cc52002-02-04 05:59:25 +0000897 for(unsigned i = 0; i < TmpVec.size(); i++)
898 cerr << *TmpVec[i];
Ruchira Sasankad0d294a2001-11-09 23:49:14 +0000899 }
900
901 // copy the results back from TmpVec to InstrnsBefore
902 for(unsigned i=0; i < TmpVec.size(); i++)
903 CallAI->InstrnsBefore.push_back( TmpVec[i] );
904 }
905
906
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000907 // now insert caller saving code for this call instruction
908 //
909 insertCallerSavingCode(CallMI, BB, PRA);
910
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000911 // Reset optional args area again to be safe
Vikram S. Adve7a1524f2001-11-08 04:56:41 +0000912 PRA.mcInfo.resetOptionalArgs(target);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000913}
914
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000915//---------------------------------------------------------------------------
916// This method is called for an LLVM return instruction to identify which
917// values will be returned from this method and to suggest colors.
918//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000919void UltraSparcRegInfo::suggestReg4RetValue(const MachineInstr *RetMI,
920 LiveRangeInfo &LRI) const {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000921
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000922 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000923
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000924 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000925
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000926 // if there is an implicit ref, that has to be the ret value
927 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000928
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000929 // The first implicit operand is the return value of a return instr
930 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000931
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000932 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000933
Chris Lattner30e8fb62002-02-05 01:43:49 +0000934 if (!LR) {
935 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
936 assert(0 && "No LR for return value of non-void method");
937 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000938
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000939 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000940
Chris Lattner5216cc52002-02-04 05:59:25 +0000941 if (RegClassID == IntRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000942 LR->setSuggestedColor(SparcIntRegOrder::i0);
Chris Lattner5216cc52002-02-04 05:59:25 +0000943 else if (RegClassID == FloatRegClassID)
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000944 LR->setSuggestedColor(SparcFloatRegOrder::f0);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000945 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000946}
947
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000948
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000949
950//---------------------------------------------------------------------------
951// Colors the return value of a method to %i0 or %f0, if possible. If it is
952// not possilbe to directly color the LR, insert a copy instruction to move
953// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
954// have to put a load instruction.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000955//---------------------------------------------------------------------------
Chris Lattner5216cc52002-02-04 05:59:25 +0000956void UltraSparcRegInfo::colorRetValue(const MachineInstr *RetMI,
957 LiveRangeInfo &LRI,
958 AddedInstrns *RetAI) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000959
Chris Lattner5216cc52002-02-04 05:59:25 +0000960 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000961
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000962 // if there is an implicit ref, that has to be the ret value
Chris Lattner5216cc52002-02-04 05:59:25 +0000963 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000964
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000965 // The first implicit operand is the return value of a return instr
966 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000967
Chris Lattner5216cc52002-02-04 05:59:25 +0000968 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000969
Chris Lattner30e8fb62002-02-05 01:43:49 +0000970 if (!LR) {
971 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
972 // assert( LR && "No LR for return value of non-void method");
973 return;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000974 }
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000975
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000976 unsigned RegClassID = getRegClassIDOfValue(RetVal);
977 unsigned RegType = getRegType( RetVal );
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000978
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000979 unsigned CorrectCol;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000980 if(RegClassID == IntRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000981 CorrectCol = SparcIntRegOrder::i0;
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000982 else if(RegClassID == FloatRegClassID)
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000983 CorrectCol = SparcFloatRegOrder::f0;
Chris Lattnere147d062001-11-07 14:01:59 +0000984 else {
Chris Lattner5216cc52002-02-04 05:59:25 +0000985 assert (0 && "Unknown RegClass");
Chris Lattnere147d062001-11-07 14:01:59 +0000986 return;
987 }
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000988
Ruchira Sasanka36bcd792001-10-24 15:56:58 +0000989 // if the LR received the correct color, NOTHING to do
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000990
Chris Lattner5216cc52002-02-04 05:59:25 +0000991 if (LR->hasColor() && LR->getColor() == CorrectCol)
992 return;
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000993
Chris Lattner5216cc52002-02-04 05:59:25 +0000994 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000995
Chris Lattner5216cc52002-02-04 05:59:25 +0000996 if (LR->hasColor()) {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +0000997
Ruchira Sasanka6a7f0202001-10-23 21:40:39 +0000998 // We are here because the LR was allocted a regiter
999 // It may be the suggested register or not
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001000
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001001 // copy the LR of retun value to i0 or f0
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001002
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +00001003 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001004
Ruchira Sasanka36bcd792001-10-24 15:56:58 +00001005 // the LR received UniLRReg but must be colored with UniRetReg
1006 // to pass as the return value
Chris Lattner7f74a562002-01-20 22:54:45 +00001007 RetAI->InstrnsBefore.push_back(cpReg2RegMI(UniLRReg, UniRetReg, RegType));
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001008 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001009 else { // if the LR is spilled
Chris Lattner7f74a562002-01-20 22:54:45 +00001010 MachineInstr *AdMI = cpMem2RegMI(getFramePointer(),
1011 LR->getSpillOffFromFP(),
1012 UniRetReg, RegType);
1013 RetAI->InstrnsBefore.push_back(AdMI);
1014 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001015 }
1016
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001017 } // if there is a return value
1018
1019}
1020
1021
1022//---------------------------------------------------------------------------
1023// Copy from a register to register. Register number must be the unified
1024// register number
1025//---------------------------------------------------------------------------
1026
Chris Lattner5216cc52002-02-04 05:59:25 +00001027MachineInstr * UltraSparcRegInfo::cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
1028 int RegType) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001029
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001030 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001031 "Invalid Register");
1032
1033 MachineInstr * MI = NULL;
1034
1035 switch( RegType ) {
1036
1037 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001038 case IntCCRegType:
1039 case FloatCCRegType:
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001040 MI = new MachineInstr(ADD, 3);
1041 MI->SetMachineOperand(0, SrcReg, false);
1042 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1043 MI->SetMachineOperand(2, DestReg, true);
1044 break;
1045
1046 case FPSingleRegType:
1047 MI = new MachineInstr(FMOVS, 2);
1048 MI->SetMachineOperand(0, SrcReg, false);
1049 MI->SetMachineOperand(1, DestReg, true);
1050 break;
1051
1052 case FPDoubleRegType:
1053 MI = new MachineInstr(FMOVD, 2);
1054 MI->SetMachineOperand(0, SrcReg, false);
1055 MI->SetMachineOperand(1, DestReg, true);
1056 break;
1057
1058 default:
1059 assert(0 && "Unknow RegType");
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001060 }
1061
1062 return MI;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001063}
Chris Lattnerb0ddffa2001-09-14 03:47:57 +00001064
1065
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001066//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001067// Copy from a register to memory (i.e., Store). Register number must
1068// be the unified register number
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001069//---------------------------------------------------------------------------
1070
1071
Chris Lattner5216cc52002-02-04 05:59:25 +00001072MachineInstr * UltraSparcRegInfo::cpReg2MemMI(unsigned SrcReg,
1073 unsigned DestPtrReg,
1074 int Offset, int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001075 MachineInstr * MI = NULL;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001076 switch( RegType ) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001077 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001078 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001079 MI = new MachineInstr(STX, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001080 MI->SetMachineOperand(0, SrcReg, false);
1081 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001082 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1083 (int64_t) Offset, false);
1084 break;
1085
1086 case FPSingleRegType:
1087 MI = new MachineInstr(ST, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001088 MI->SetMachineOperand(0, SrcReg, false);
1089 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001090 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1091 (int64_t) Offset, false);
1092 break;
1093
1094 case FPDoubleRegType:
1095 MI = new MachineInstr(STD, 3);
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001096 MI->SetMachineOperand(0, SrcReg, false);
1097 MI->SetMachineOperand(1, DestPtrReg, false);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001098 MI->SetMachineOperand(2, MachineOperand:: MO_SignExtendedImmed,
1099 (int64_t) Offset, false);
1100 break;
1101
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001102 case IntCCRegType:
1103 assert( 0 && "Cannot directly store %ccr to memory");
1104
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001105 default:
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001106 assert(0 && "Unknow RegType in cpReg2MemMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001107 }
1108
1109 return MI;
1110}
1111
1112
1113//---------------------------------------------------------------------------
Ruchira Sasanka0863c162001-10-24 22:05:34 +00001114// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001115// register number
1116//---------------------------------------------------------------------------
1117
1118
Chris Lattner5216cc52002-02-04 05:59:25 +00001119MachineInstr * UltraSparcRegInfo::cpMem2RegMI(unsigned SrcPtrReg,
1120 int Offset,
1121 unsigned DestReg,
1122 int RegType) const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001123 MachineInstr * MI = NULL;
Chris Lattner5216cc52002-02-04 05:59:25 +00001124 switch (RegType) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001125 case IntRegType:
Ruchira Sasanka5f629312001-10-18 22:38:52 +00001126 case FloatCCRegType:
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001127 MI = new MachineInstr(LDX, 3);
1128 MI->SetMachineOperand(0, SrcPtrReg, false);
1129 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1130 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001131 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001132 break;
1133
1134 case FPSingleRegType:
1135 MI = new MachineInstr(LD, 3);
1136 MI->SetMachineOperand(0, SrcPtrReg, false);
1137 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1138 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001139 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001140
1141 break;
1142
1143 case FPDoubleRegType:
1144 MI = new MachineInstr(LDD, 3);
1145 MI->SetMachineOperand(0, SrcPtrReg, false);
1146 MI->SetMachineOperand(1, MachineOperand:: MO_SignExtendedImmed,
1147 (int64_t) Offset, false);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001148 MI->SetMachineOperand(2, DestReg, true);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001149 break;
1150
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001151 case IntCCRegType:
1152 assert( 0 && "Cannot directly load into %ccr from memory");
1153
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001154 default:
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001155 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001156 }
1157
1158 return MI;
1159}
1160
1161
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001162
1163
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001164
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001165//---------------------------------------------------------------------------
1166// Generate a copy instruction to copy a value to another. Temporarily
1167// used by PhiElimination code.
1168//---------------------------------------------------------------------------
1169
1170
Chris Lattner5216cc52002-02-04 05:59:25 +00001171MachineInstr *UltraSparcRegInfo::cpValue2Value(Value *Src, Value *Dest) const {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001172 int RegType = getRegType( Src );
1173
1174 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001175
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001176 MachineInstr * MI = NULL;
1177
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001178 switch( RegType ) {
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001179 case IntRegType:
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001180 MI = new MachineInstr(ADD, 3);
1181 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1182 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1183 MI->SetMachineOperand(2, MachineOperand:: MO_VirtualRegister, Dest, true);
1184 break;
1185
1186 case FPSingleRegType:
1187 MI = new MachineInstr(FMOVS, 2);
1188 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1189 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1190 break;
1191
1192
1193 case FPDoubleRegType:
1194 MI = new MachineInstr(FMOVD, 2);
1195 MI->SetMachineOperand(0, MachineOperand:: MO_VirtualRegister, Src, false);
1196 MI->SetMachineOperand(1, MachineOperand:: MO_VirtualRegister, Dest, true);
1197 break;
1198
1199 default:
1200 assert(0 && "Unknow RegType in CpValu2Value");
1201 }
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001202
1203 return MI;
Ruchira Sasankab7a39722001-11-03 17:13:27 +00001204}
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001205
1206
1207
Ruchira Sasankafcdc2ff2001-11-12 14:45:33 +00001208
1209
1210
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001211//----------------------------------------------------------------------------
1212// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001213// a call machine instruction. The caller saving/restoring instructions are
1214// inserted like:
1215//
1216// ** caller saving instructions
1217// other instructions inserted for the call by ColorCallArg
1218// CALL instruction
1219// other instructions inserted for the call ColorCallArg
1220// ** caller restoring instructions
1221//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001222//----------------------------------------------------------------------------
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +00001223
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001224
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001225void UltraSparcRegInfo::insertCallerSavingCode(const MachineInstr *MInst,
1226 const BasicBlock *BB,
1227 PhyRegAlloc &PRA) const {
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001228
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001229 // has set to record which registers were saved/restored
1230 //
Chris Lattner7f74a562002-01-20 22:54:45 +00001231 std::hash_set<unsigned> PushedRegSet;
Ruchira Sasankaf4c2ddd2002-01-07 21:03:42 +00001232
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001233 // Now find the LR of the return value of the call
1234 // The last *implicit operand* is the return value of a call
1235 // Insert it to to he PushedRegSet since we must not save that register
1236 // and restore it after the call.
1237 // We do this because, we look at the LV set *after* the instruction
1238 // to determine, which LRs must be saved across calls. The return value
1239 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001240
1241
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001242 const Value *RetVal = getCallInstRetVal( MInst );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001243
Chris Lattner5216cc52002-02-04 05:59:25 +00001244 if (RetVal) {
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001245 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner5216cc52002-02-04 05:59:25 +00001246 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001247
Chris Lattner5216cc52002-02-04 05:59:25 +00001248 if (RetValLR->hasColor())
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001249 PushedRegSet.insert(
1250 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001251 RetValLR->getColor() ) );
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001252 }
1253
1254
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001255 const LiveVarSet *LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(MInst, BB);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001256 LiveVarSet::const_iterator LIt = LVSetAft->begin();
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001257
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001258 // for each live var in live variable set after machine inst
1259 for( ; LIt != LVSetAft->end(); ++LIt) {
1260
1261 // get the live range corresponding to live var
1262 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1263
1264 // LR can be null if it is a const since a const
1265 // doesn't have a dominating def - see Assumptions above
1266 if( LR ) {
1267
1268 if( LR->hasColor() ) {
1269
1270 unsigned RCID = (LR->getRegClass())->getID();
1271 unsigned Color = LR->getColor();
1272
1273 if ( isRegVolatile(RCID, Color) ) {
1274
1275 // if the value is in both LV sets (i.e., live before and after
1276 // the call machine instruction)
1277
1278 unsigned Reg = getUnifiedRegNum(RCID, Color);
1279
1280 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1281
1282 // if we haven't already pushed that register
1283
1284 unsigned RegType = getRegType( LR );
1285
1286 // Now get two instructions - to push on stack and pop from stack
1287 // and add them to InstrnsBefore and InstrnsAfter of the
1288 // call instruction
1289
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001290
1291 int StackOff = PRA.mcInfo.pushTempValue(target,
1292 getSpilledRegSize(RegType));
1293
Vikram S. Adve7a1524f2001-11-08 04:56:41 +00001294
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001295 MachineInstr *AdIBefCC, *AdIAftCC, *AdICpCC;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001296 MachineInstr *AdIBef, *AdIAft;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001297
1298
1299 //---- Insert code for pushing the reg on stack ----------
1300
1301 if( RegType == IntCCRegType ) {
1302
1303 // Handle IntCCRegType specially since we cannot directly
1304 // push %ccr on to the stack
1305
1306 const LiveVarSet *LVSetBef =
1307 PRA.LVI->getLiveVarSetBeforeMInst(MInst, BB);
1308
1309 // get a free INTEGER register
1310 int FreeIntReg =
Ruchira Sasankac97ccc52001-11-15 20:25:07 +00001311 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001312 LVSetBef, AdIBefCC, AdIAftCC);
1313
1314 // insert the instructions in reverse order since we are
1315 // adding them to the front of InstrnsBefore
1316
1317 if(AdIAftCC)
1318 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIAftCC);
1319
1320 AdICpCC = cpCCR2IntMI(FreeIntReg);
1321 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdICpCC);
1322
1323 if(AdIBefCC)
1324 (PRA.AddedInstrMap[MInst]->InstrnsBefore).push_front(AdIBefCC);
1325
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001326 if(DEBUG_RA) {
1327 cerr << "\n!! Inserted caller saving (push) inst for %ccr:";
1328 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1329 cerr << "\t" << *AdICpCC;
1330 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1331 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001332
1333 } else {
1334 // for any other register type, just add the push inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001335 AdIBef = cpReg2MemMI(Reg, getFramePointer(), StackOff, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001336 ((PRA.AddedInstrMap[MInst])->InstrnsBefore).push_front(AdIBef);
1337 }
1338
1339
1340 //---- Insert code for popping the reg from the stack ----------
1341
1342 if( RegType == IntCCRegType ) {
1343
1344 // Handle IntCCRegType specially since we cannot directly
1345 // pop %ccr on from the stack
1346
1347 // get a free INT register
1348 int FreeIntReg =
Ruchira Sasankac97ccc52001-11-15 20:25:07 +00001349 PRA.getUsableUniRegAtMI(LR->getRegClass(), IntRegType, MInst,
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001350 LVSetAft, AdIBefCC, AdIAftCC);
1351
1352 if(AdIBefCC)
1353 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIBefCC);
1354
1355 AdICpCC = cpInt2CCRMI(FreeIntReg);
1356 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdICpCC);
1357
1358 if(AdIAftCC)
1359 (PRA.AddedInstrMap[MInst]->InstrnsAfter).push_back(AdIAftCC);
1360
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001361 if(DEBUG_RA) {
1362
1363 cerr << "\n!! Inserted caller saving (pop) inst for %ccr:";
1364 if(AdIBefCC) cerr << "\t" << *(AdIBefCC);
1365 cerr << "\t" << *AdICpCC;
1366 if(AdIAftCC) cerr << "\t" << *(AdIAftCC);
1367 }
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001368
1369 } else {
1370 // for any other register type, just add the pop inst
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001371 AdIAft = cpMem2RegMI(getFramePointer(), StackOff, Reg, RegType );
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001372 ((PRA.AddedInstrMap[MInst])->InstrnsAfter).push_back(AdIAft);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001373 }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001374
1375 PushedRegSet.insert( Reg );
1376
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001377 if(DEBUG_RA) {
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001378 cerr << "\nFor call inst:" << *MInst;
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001379 cerr << " -inserted caller saving instrs:\n\t ";
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001380 if( RegType == IntCCRegType )
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001381 cerr << *AdIBefCC << "\t" << *AdIAftCC ;
Vikram S. Advef5b4f472001-11-06 05:01:54 +00001382 else
Ruchira Sasanka1812fc42001-11-10 00:26:55 +00001383 cerr << *AdIBef << "\t" << *AdIAft ;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001384 }
1385 } // if not already pushed
1386
1387 } // if LR has a volatile color
1388
1389 } // if LR has color
1390
1391 } // if there is a LR for Var
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001392
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001393 } // for each value in the LV set after instruction
1394
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001395}
1396
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001397//---------------------------------------------------------------------------
1398// Copies %ccr into an integer register. IntReg is the UNIFIED register
1399// number.
1400//---------------------------------------------------------------------------
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001401
Chris Lattner5216cc52002-02-04 05:59:25 +00001402MachineInstr * UltraSparcRegInfo::cpCCR2IntMI(unsigned IntReg) const {
1403 MachineInstr * MI = new MachineInstr(RDCCR, 2);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001404 MI->SetMachineOperand(0, SparcIntCCRegOrder::ccr, false);
1405 MI->SetMachineOperand(1, IntReg, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001406 return MI;
1407}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001408
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001409//---------------------------------------------------------------------------
1410// Copies an integer register into %ccr. IntReg is the UNIFIED register
1411// number.
1412//---------------------------------------------------------------------------
1413
Chris Lattner5216cc52002-02-04 05:59:25 +00001414MachineInstr *UltraSparcRegInfo::cpInt2CCRMI(unsigned IntReg) const {
1415 MachineInstr *MI = new MachineInstr(WRCCR, 3);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001416 MI->SetMachineOperand(0, IntReg, false);
1417 MI->SetMachineOperand(1, SparcIntRegOrder::g0, false);
1418 MI->SetMachineOperand(2, SparcIntCCRegOrder::ccr, true);
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +00001419 return MI;
1420}
Ruchira Sasanka5867c7a2001-09-30 23:16:47 +00001421
1422
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +00001423
1424
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001425//---------------------------------------------------------------------------
1426// Print the register assigned to a LR
1427//---------------------------------------------------------------------------
1428
Chris Lattner5216cc52002-02-04 05:59:25 +00001429void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001430 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001431 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001432
Chris Lattner5216cc52002-02-04 05:59:25 +00001433 if (!LR->hasColor()) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001434 cerr << " - could not find a color\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001435 return;
1436 }
1437
1438 // if a color is found
1439
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001440 cerr << " colored with color "<< LR->getColor();
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001441
Chris Lattner5216cc52002-02-04 05:59:25 +00001442 if (RegClassID == IntRegClassID) {
Chris Lattner7f74a562002-01-20 22:54:45 +00001443 cerr<< " [" << SparcIntRegOrder::getRegName(LR->getColor()) << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001444
Chris Lattner5216cc52002-02-04 05:59:25 +00001445 } else if (RegClassID == FloatRegClassID) {
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001446 cerr << "[" << SparcFloatRegOrder::getRegName(LR->getColor());
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001447 if( LR->getTypeID() == Type::DoubleTyID )
Chris Lattnerf3f1e452001-10-15 18:15:27 +00001448 cerr << "+" << SparcFloatRegOrder::getRegName(LR->getColor()+1);
Chris Lattner7f74a562002-01-20 22:54:45 +00001449 cerr << "]\n";
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001450 }
Ruchira Sasankadfc6c882001-09-18 22:52:44 +00001451}
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001452
1453//---------------------------------------------------------------------------
1454// This method examines instructions inserted by RegAlloc code before a
1455// machine instruction to detect invalid orders that destroy values before
1456// they are used. If it detects such conditions, it reorders the instructions.
1457//
1458// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001459// instructions inserted by RegAlloc. All such instruction MUST have
1460// their USES BEFORE THE DEFS after reordering.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001461
1462// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1463// this method is called.
1464
1465// This method uses two vectors for efficiency in accessing
1466
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001467// Since instructions are inserted in RegAlloc, this assumes that the
1468// first operand is the source reg and the last operand is the dest reg.
1469
1470// All the uses are before THE def to a register
1471
1472
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001473//---------------------------------------------------------------------------
Chris Lattner7f74a562002-01-20 22:54:45 +00001474void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
1475 std::vector<MachineInstr *> &OrdVec,
1476 PhyRegAlloc &PRA) const{
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001477
1478 /*
1479 Problem: We can have instructions inserted by RegAlloc like
1480 1. add %ox %g0 %oy
1481 2. add %oy %g0 %oz, where z!=x or z==x
1482
1483 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001484
1485 Solution:
1486 We re-order the instructions so that the uses are before the defs
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001487
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001488 Algorithm:
1489
1490 do
1491 for each instruction 'DefInst' in the UnOrdVec
1492 for each instruction 'UseInst' that follows the DefInst
1493 if the reg defined by DefInst is used by UseInst
1494 mark DefInst as not movable in this iteration
1495 If DefInst is not marked as not-movable, move DefInst to OrdVec
1496 while all instructions in DefInst are moved to OrdVec
1497
1498 For moving, we call the move2OrdVec(). It checks whether there is a def
1499 in it for the uses in the instruction to be added to OrdVec. If there
1500 are no preceding defs, it just appends the instruction. If there is a
1501 preceding def, it puts two instructions to save the reg on stack before
1502 the load and puts a restore at use.
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001503
1504 */
1505
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001506 bool CouldMoveAll;
1507 bool DebugPrint = false;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001508
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001509 do {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001510 CouldMoveAll = true;
Chris Lattner7f74a562002-01-20 22:54:45 +00001511 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001512
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001513 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001514
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001515 // for each instruction in the UnordVec do ...
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001516
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001517 MachineInstr *DefInst = *DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001518
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001519 if( DefInst == NULL) continue;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001520
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001521 //cerr << "\nInst in UnordVec = " << *DefInst;
1522
1523 // last operand is the def (unless for a store which has no def reg)
1524 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1525
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001526 if( DefOp.opIsDef() &&
1527 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001528
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001529 // If the operand in DefInst is a def ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001530
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001531 bool DefEqUse = false;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001532
Chris Lattner7f74a562002-01-20 22:54:45 +00001533 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001534 UseIt++;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001535
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001536 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1537
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001538 MachineInstr *UseInst = *UseIt;
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001539 if( UseInst == NULL) continue;
1540
1541 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001542 MachineOperand& UseOp = UseInst->getOperand(0);
1543
1544 if( ! UseOp.opIsDef() &&
1545 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1546
1547 // if use is a register ...
1548
1549 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1550
1551 // if Def and this use are the same, it means that this use
1552 // is destroyed by a def before it is used
1553
1554 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001555
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001556 DefEqUse = true;
1557 CouldMoveAll = false;
1558 DebugPrint = true;
1559 break;
1560 } // if two registers are equal
1561
1562 } // if use is a register
1563
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001564 }// for all use instructions
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001565
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001566 if( ! DefEqUse ) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001567
1568 // after examining all the instructions that follow the DefInst
1569 // if there are no dependencies, we can move it to the OrdVec
1570
1571 // cerr << "Moved to Ord: " << *DefInst;
1572
1573 moveInst2OrdVec(OrdVec, DefInst, PRA);
1574
1575 //OrdVec.push_back(DefInst);
1576
1577 // mark the pos of DefInst with NULL to indicate that it is
1578 // empty
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001579 *DefIt = NULL;
1580 }
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001581
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001582 } // if Def is a machine register
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001583
1584 } // for all instructions in the UnordVec
1585
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001586
Chris Lattner5216cc52002-02-04 05:59:25 +00001587 } while(!CouldMoveAll);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001588
Chris Lattner5216cc52002-02-04 05:59:25 +00001589 if (DebugPrint) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001590 cerr << "\nAdded instructions were reordered to:\n";
1591 for(unsigned int i=0; i < OrdVec.size(); i++)
1592 cerr << *(OrdVec[i]);
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001593 }
Ruchira Sasankad0d294a2001-11-09 23:49:14 +00001594}
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001595
1596
1597
1598
1599
Chris Lattner7f74a562002-01-20 22:54:45 +00001600void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001601 MachineInstr *UnordInst,
Chris Lattner5216cc52002-02-04 05:59:25 +00001602 PhyRegAlloc &PRA) const {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001603 MachineOperand& UseOp = UnordInst->getOperand(0);
1604
1605 if( ! UseOp.opIsDef() &&
1606 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1607
1608 // for the use of UnordInst, see whether there is a defining instr
1609 // before in the OrdVec
1610 bool DefEqUse = false;
1611
Chris Lattner7f74a562002-01-20 22:54:45 +00001612 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001613
1614 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1615
1616 MachineInstr *OrdInst = *OrdIt ;
1617
1618 MachineOperand& DefOp =
1619 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1620
1621 if( DefOp.opIsDef() &&
1622 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1623
1624 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1625
1626 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1627
1628 // we are here because there is a preceding def in the OrdVec
1629 // for the use in this intr we are going to insert. This
1630 // happened because the original code was like:
1631 // 1. add %ox %g0 %oy
1632 // 2. add %oy %g0 %ox
1633 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1634 // Now we are processing %ox of 1.
1635 // We have to
1636
1637 const int UReg = DefOp.getMachineRegNum();
1638 const int RegType = getRegType(UReg);
1639 MachineInstr *AdIBef, *AdIAft;
1640
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +00001641 const int StackOff = PRA.mcInfo.pushTempValue(target,
1642 getSpilledRegSize(RegType));
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001643
1644 // Save the UReg (%ox) on stack before it's destroyed
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001645 AdIBef=cpReg2MemMI(UReg, getFramePointer(), StackOff, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001646 OrdIt = OrdVec.insert( OrdIt, AdIBef);
1647 OrdIt++; // points to current instr we processed
1648
1649 // Load directly into DReg (%oy)
1650 MachineOperand& DOp=
1651 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1652 assert(DOp.opIsDef() && "Last operand is not the def");
1653 const int DReg = DOp.getMachineRegNum();
1654
Ruchira Sasanka2d5c48f2001-11-11 21:49:37 +00001655 AdIAft=cpMem2RegMI(getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001656 OrdVec.push_back(AdIAft);
1657
1658 cerr << "\nFixed CIRCULAR references by reordering";
1659
1660 if( DEBUG_RA ) {
1661 cerr << "\nBefore CIRCULAR Reordering:\n";
1662 cerr << *UnordInst;
1663 cerr << *OrdInst;
1664
1665 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1666 for(unsigned i=0; i < OrdVec.size(); i++)
1667 cerr << *(OrdVec[i]);
1668 }
1669
1670 // Do not copy the UseInst to OrdVec
1671 DefEqUse = true;
1672 break;
1673
1674 }// if two registers are equal
1675
1676 } // if Def is a register
1677
1678 } // for each instr in OrdVec
1679
Chris Lattner5216cc52002-02-04 05:59:25 +00001680 if(!DefEqUse) {
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001681
1682 // We didn't find a def in the OrdVec, so just append this inst
1683 OrdVec.push_back( UnordInst );
1684 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1685 }
1686
1687 }// if the operand in UnordInst is a use
Ruchira Sasanka0c085982001-11-10 21:20:43 +00001688}