blob: 4625773a13347322f6c2c4bce05f10a67b1da200 [file] [log] [blame]
Chris Lattnered5171e2002-02-03 07:52:04 +00001//===-- SparcRegInfo.cpp - Sparc Target Register Information --------------===//
2//
3// This file contains implementation of Sparc specific helper methods
4// used for register allocation.
5//
6//===----------------------------------------------------------------------===//
7
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00008#include "SparcInternals.h"
Chris Lattner699683c2002-02-04 05:59:25 +00009#include "SparcRegClassInfo.h"
10#include "llvm/Target/Sparc.h"
Chris Lattnered5171e2002-02-03 07:52:04 +000011#include "llvm/CodeGen/MachineCodeForMethod.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/CodeGen/PhyRegAlloc.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000013#include "llvm/CodeGen/InstrSelection.h"
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000014#include "llvm/CodeGen/InstrSelectionSupport.h"
Chris Lattner699683c2002-02-04 05:59:25 +000015#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve242a8082002-05-19 15:25:51 +000016#include "llvm/CodeGen/MachineInstrAnnot.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +000017#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner483e14e2002-04-27 07:27:19 +000018#include "llvm/Analysis/LiveVar/FunctionLiveVarInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000019#include "llvm/iTerminators.h"
20#include "llvm/iOther.h"
Chris Lattner0ac54292002-04-09 19:08:28 +000021#include "llvm/Function.h"
Ruchira Sasankad00982a2002-01-07 19:20:28 +000022#include "llvm/DerivedTypes.h"
Chris Lattner697954c2002-01-20 22:54:45 +000023#include <iostream>
Vikram S. Adve31f78c42002-04-25 04:42:21 +000024#include <values.h>
Chris Lattner697954c2002-01-20 22:54:45 +000025using std::cerr;
Anand Shuklacfb22d32002-06-25 20:55:50 +000026using std::vector;
Chris Lattner20b1ea02001-09-14 03:47:57 +000027
Chris Lattner699683c2002-02-04 05:59:25 +000028UltraSparcRegInfo::UltraSparcRegInfo(const UltraSparc &tgt)
29 : MachineRegInfo(tgt), UltraSparcInfo(&tgt), NumOfIntArgRegs(6),
30 NumOfFloatArgRegs(32), InvalidRegNum(1000) {
31
32 MachineRegClassArr.push_back(new SparcIntRegClass(IntRegClassID));
33 MachineRegClassArr.push_back(new SparcFloatRegClass(FloatRegClassID));
34 MachineRegClassArr.push_back(new SparcIntCCRegClass(IntCCRegClassID));
35 MachineRegClassArr.push_back(new SparcFloatCCRegClass(FloatCCRegClassID));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +000036
Chris Lattner95685682002-08-12 21:25:05 +000037 assert(SparcFloatRegClass::StartOfNonVolatileRegs == 32 &&
Chris Lattner699683c2002-02-04 05:59:25 +000038 "32 Float regs are used for float arg passing");
39}
40
41
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000042// getZeroRegNum - returns the register that contains always zero.
43// this is the unified register number
Chris Lattner699683c2002-02-04 05:59:25 +000044//
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000045int UltraSparcRegInfo::getZeroRegNum() const {
Chris Lattner95685682002-08-12 21:25:05 +000046 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
47 SparcIntRegClass::g0);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +000048}
Chris Lattner699683c2002-02-04 05:59:25 +000049
50// getCallAddressReg - returns the reg used for pushing the address when a
51// method is called. This can be used for other purposes between calls
52//
53unsigned UltraSparcRegInfo::getCallAddressReg() const {
Chris Lattner95685682002-08-12 21:25:05 +000054 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
55 SparcIntRegClass::o7);
Chris Lattner699683c2002-02-04 05:59:25 +000056}
57
58// Returns the register containing the return address.
59// It should be made sure that this register contains the return
60// value when a return instruction is reached.
61//
62unsigned UltraSparcRegInfo::getReturnAddressReg() const {
Chris Lattner95685682002-08-12 21:25:05 +000063 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
64 SparcIntRegClass::i7);
65}
66
67// Register get name implementations...
68
69// Int register names in same order as enum in class SparcIntRegClass
70static const char * const IntRegNames[] = {
71 "o0", "o1", "o2", "o3", "o4", "o5", "o7",
72 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
73 "i0", "i1", "i2", "i3", "i4", "i5",
74 "i6", "i7",
75 "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
76 "o6"
77};
78
79const char * const SparcIntRegClass::getRegName(unsigned reg) {
80 assert(reg < NumOfAllRegs);
81 return IntRegNames[reg];
82}
83
84static const char * const FloatRegNames[] = {
85 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9",
86 "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19",
87 "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29",
88 "f30", "f31", "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
89 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", "f48", "f49",
90 "f50", "f51", "f52", "f53", "f54", "f55", "f56", "f57", "f58", "f59",
91 "f60", "f61", "f62", "f63"
92};
93
94const char * const SparcFloatRegClass::getRegName(unsigned reg) {
95 assert (reg < NumOfAllRegs);
96 return FloatRegNames[reg];
97}
98
99
100static const char * const IntCCRegNames[] = {
101 "xcc", "ccr"
102};
103
104const char * const SparcIntCCRegClass::getRegName(unsigned reg) {
105 assert(reg < 2);
106 return IntCCRegNames[reg];
107}
108
109static const char * const FloatCCRegNames[] = {
110 "fcc0", "fcc1", "fcc2", "fcc3"
111};
112
113const char * const SparcFloatCCRegClass::getRegName(unsigned reg) {
114 assert (reg < 4);
115 return FloatCCRegNames[reg];
Chris Lattner699683c2002-02-04 05:59:25 +0000116}
117
118// given the unified register number, this gives the name
119// for generating assembly code or debugging.
120//
Chris Lattner95685682002-08-12 21:25:05 +0000121const char * const UltraSparcRegInfo::getUnifiedRegName(int reg) const {
Chris Lattner699683c2002-02-04 05:59:25 +0000122 if( reg < 32 )
Chris Lattner95685682002-08-12 21:25:05 +0000123 return SparcIntRegClass::getRegName(reg);
Chris Lattner699683c2002-02-04 05:59:25 +0000124 else if ( reg < (64 + 32) )
Chris Lattner95685682002-08-12 21:25:05 +0000125 return SparcFloatRegClass::getRegName( reg - 32);
Chris Lattner699683c2002-02-04 05:59:25 +0000126 else if( reg < (64+32+4) )
Chris Lattner95685682002-08-12 21:25:05 +0000127 return SparcFloatCCRegClass::getRegName( reg -32 - 64);
Chris Lattner699683c2002-02-04 05:59:25 +0000128 else if( reg < (64+32+4+2) ) // two names: %xcc and %ccr
Chris Lattner95685682002-08-12 21:25:05 +0000129 return SparcIntCCRegClass::getRegName( reg -32 - 64 - 4);
Chris Lattner699683c2002-02-04 05:59:25 +0000130 else if (reg== InvalidRegNum) //****** TODO: Remove */
131 return "<*NoReg*>";
132 else
133 assert(0 && "Invalid register number");
134 return "";
135}
136
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000137// Get unified reg number for frame pointer
Chris Lattner699683c2002-02-04 05:59:25 +0000138unsigned UltraSparcRegInfo::getFramePointer() const {
Chris Lattner95685682002-08-12 21:25:05 +0000139 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
140 SparcIntRegClass::i6);
Chris Lattner699683c2002-02-04 05:59:25 +0000141}
142
Vikram S. Advef1c15ee2002-03-18 03:12:16 +0000143// Get unified reg number for stack pointer
Chris Lattner699683c2002-02-04 05:59:25 +0000144unsigned UltraSparcRegInfo::getStackPointer() const {
Chris Lattner95685682002-08-12 21:25:05 +0000145 return getUnifiedRegNum(UltraSparcRegInfo::IntRegClassID,
146 SparcIntRegClass::o6);
Chris Lattner699683c2002-02-04 05:59:25 +0000147}
148
149
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000150//---------------------------------------------------------------------------
151// Finds whether a call is an indirect call
152//---------------------------------------------------------------------------
153
154inline bool
155isVarArgsFunction(const Type *funcType) {
156 return cast<FunctionType>(cast<PointerType>(funcType)
157 ->getElementType())->isVarArg();
158}
159
160inline bool
161isVarArgsCall(const MachineInstr *CallMI) {
162 Value* callee = CallMI->getOperand(0).getVRegValue();
163 // const Type* funcType = isa<Function>(callee)? callee->getType()
164 // : cast<PointerType>(callee->getType())->getElementType();
165 const Type* funcType = callee->getType();
166 return isVarArgsFunction(funcType);
167}
168
169
170// Get the register number for the specified integer arg#,
171// assuming there are argNum total args, intArgNum int args,
172// and fpArgNum FP args preceding (and not including) this one.
173// Use INT regs for FP args if this is a varargs call.
174//
175// Return value:
176// InvalidRegNum, if there is no int register available for the arg.
177// regNum, otherwise (this is NOT the unified reg. num).
178//
179inline int
180UltraSparcRegInfo::regNumForIntArg(bool inCallee, bool isVarArgsCall,
181 unsigned argNo,
182 unsigned intArgNo, unsigned fpArgNo,
183 unsigned& regClassId) const
184{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000185 regClassId = IntRegClassID;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000186 if (argNo >= NumOfIntArgRegs)
187 return InvalidRegNum;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000188 else
Chris Lattner95685682002-08-12 21:25:05 +0000189 return argNo + (inCallee? SparcIntRegClass::i0 : SparcIntRegClass::o0);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000190}
191
192// Get the register number for the specified FP arg#,
193// assuming there are argNum total args, intArgNum int args,
194// and fpArgNum FP args preceding (and not including) this one.
195// Use INT regs for FP args if this is a varargs call.
196//
197// Return value:
198// InvalidRegNum, if there is no int register available for the arg.
199// regNum, otherwise (this is NOT the unified reg. num).
200//
201inline int
202UltraSparcRegInfo::regNumForFPArg(unsigned regType,
203 bool inCallee, bool isVarArgsCall,
204 unsigned argNo,
205 unsigned intArgNo, unsigned fpArgNo,
206 unsigned& regClassId) const
207{
Vikram S. Adve242a8082002-05-19 15:25:51 +0000208 if (isVarArgsCall)
209 return regNumForIntArg(inCallee, isVarArgsCall, argNo, intArgNo, fpArgNo,
210 regClassId);
211 else
212 {
213 regClassId = FloatRegClassID;
214 if (regType == FPSingleRegType)
215 return (argNo*2+1 >= NumOfFloatArgRegs)?
Chris Lattner95685682002-08-12 21:25:05 +0000216 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2 + 1);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000217 else if (regType == FPDoubleRegType)
218 return (argNo*2 >= NumOfFloatArgRegs)?
Chris Lattner95685682002-08-12 21:25:05 +0000219 InvalidRegNum : SparcFloatRegClass::f0 + (argNo * 2);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000220 else
221 assert(0 && "Illegal FP register type");
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000222 return 0;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000223 }
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000224}
225
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000226
227//---------------------------------------------------------------------------
228// Finds the return address of a call sparc specific call instruction
229//---------------------------------------------------------------------------
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000230
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000231// The following 4 methods are used to find the RegType (SparcInternals.h)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000232// of a LiveRange, a Value, and for a given register unified reg number.
Chris Lattner699683c2002-02-04 05:59:25 +0000233//
Vikram S. Adve242a8082002-05-19 15:25:51 +0000234int UltraSparcRegInfo::getRegType(unsigned regClassID,
235 const Type* type) const {
236 switch (regClassID) {
Chris Lattner699683c2002-02-04 05:59:25 +0000237 case IntRegClassID: return IntRegType;
Chris Lattner37730942002-02-05 03:52:29 +0000238 case FloatRegClassID: {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000239 if (type == Type::FloatTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000240 return FPSingleRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000241 else if (type == Type::DoubleTy)
Chris Lattner699683c2002-02-04 05:59:25 +0000242 return FPDoubleRegType;
243 assert(0 && "Unknown type in FloatRegClass");
Chris Lattner37730942002-02-05 03:52:29 +0000244 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000245 case IntCCRegClassID: return IntCCRegType;
Chris Lattner699683c2002-02-04 05:59:25 +0000246 case FloatCCRegClassID: return FloatCCRegType;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000247 default: assert( 0 && "Unknown reg class ID"); return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000248 }
249}
250
Vikram S. Adve242a8082002-05-19 15:25:51 +0000251int UltraSparcRegInfo::getRegType(const LiveRange *LR) const {
252 return getRegType(LR->getRegClass()->getID(), LR->getType());
253}
254
Chris Lattner699683c2002-02-04 05:59:25 +0000255int UltraSparcRegInfo::getRegType(const Value *Val) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000256 return getRegType(getRegClassIDOfValue(Val), Val->getType());
Chris Lattner699683c2002-02-04 05:59:25 +0000257}
258
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000259int UltraSparcRegInfo::getRegType(int unifiedRegNum) const {
260 if (unifiedRegNum < 32)
Chris Lattner699683c2002-02-04 05:59:25 +0000261 return IntRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000262 else if (unifiedRegNum < (32 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000263 return FPSingleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000264 else if (unifiedRegNum < (64 + 32))
Chris Lattner699683c2002-02-04 05:59:25 +0000265 return FPDoubleRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000266 else if (unifiedRegNum < (64+32+4))
Chris Lattner699683c2002-02-04 05:59:25 +0000267 return FloatCCRegType;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000268 else if (unifiedRegNum < (64+32+4+2))
Chris Lattner699683c2002-02-04 05:59:25 +0000269 return IntCCRegType;
270 else
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000271 assert(0 && "Invalid unified register number in getRegType");
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000272 return 0;
Chris Lattner699683c2002-02-04 05:59:25 +0000273}
274
275
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000276// To find the register class used for a specified Type
277//
278unsigned UltraSparcRegInfo::getRegClassIDOfType(const Type *type,
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000279 bool isCCReg) const {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000280 Type::PrimitiveID ty = type->getPrimitiveID();
281 unsigned res;
282
283 // FIXME: Comparing types like this isn't very safe...
284 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
285 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
286 res = IntRegClassID; // sparc int reg (ty=0: void)
287 else if (ty <= Type::DoubleTyID)
288 res = FloatRegClassID; // sparc float reg class
289 else {
290 //std::cerr << "TypeID: " << ty << "\n";
291 assert(0 && "Cannot resolve register class for type");
292 return 0;
293 }
294
295 if(isCCReg)
296 return res + 2; // corresponidng condition code regiser
297 else
298 return res;
299}
300
301// To find the register class to which a specified register belongs
302//
303unsigned UltraSparcRegInfo::getRegClassIDOfReg(int unifiedRegNum) const {
304 unsigned classId = 0;
305 (void) getClassRegNum(unifiedRegNum, classId);
306 return classId;
307}
308
309unsigned UltraSparcRegInfo::getRegClassIDOfRegType(int regType) const {
310 switch(regType) {
311 case IntRegType: return IntRegClassID;
312 case FPSingleRegType:
313 case FPDoubleRegType: return FloatRegClassID;
314 case IntCCRegType: return IntCCRegClassID;
315 case FloatCCRegType: return FloatCCRegClassID;
316 default:
317 assert(0 && "Invalid register type in getRegClassIDOfRegType");
318 return 0;
319 }
320}
321
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000322//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000323// Suggests a register for the ret address in the RET machine instruction.
324// We always suggest %i7 by convention.
325//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000326void UltraSparcRegInfo::suggestReg4RetAddr(MachineInstr *RetMI,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000327 LiveRangeInfo& LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000328
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000329 assert(target.getInstrInfo().isReturn(RetMI->getOpCode()));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000330
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000331 // return address is always mapped to i7 so set it immediately
332 RetMI->SetRegForOperand(0, getUnifiedRegNum(IntRegClassID,
Chris Lattner95685682002-08-12 21:25:05 +0000333 SparcIntRegClass::i7));
Vikram S. Adve53fec862001-10-22 13:41:12 +0000334
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000335 // Possible Optimization:
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000336 // Instead of setting the color, we can suggest one. In that case,
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000337 // we have to test later whether it received the suggested color.
338 // In that case, a LR has to be created at the start of method.
339 // It has to be done as follows (remove the setRegVal above):
Ruchira Sasanka91442282001-09-30 23:16:47 +0000340
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000341 // MachineOperand & MO = RetMI->getOperand(0);
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000342 // const Value *RetAddrVal = MO.getVRegValue();
343 // assert( RetAddrVal && "LR for ret address must be created at start");
344 // LiveRange * RetAddrLR = LRI.getLiveRangeForValue( RetAddrVal);
345 // RetAddrLR->setSuggestedColor(getUnifiedRegNum( IntRegClassID,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000346 // SparcIntRegOrdr::i7) );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000347}
348
349
350//---------------------------------------------------------------------------
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000351// Suggests a register for the ret address in the JMPL/CALL machine instr.
352// Sparc ABI dictates that %o7 be used for this purpose.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000353//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000354void UltraSparcRegInfo::suggestReg4CallAddr(MachineInstr * CallMI,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000355 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000356 std::vector<RegClass *> RCList) const {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000357 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
358 const Value *RetAddrVal = argDesc->getReturnAddrReg();
359 assert(RetAddrVal && "Return address value is required");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000360
Vikram S. Adve242a8082002-05-19 15:25:51 +0000361 // create a new LR for the return address and color it
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000362 LiveRange * RetAddrLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000363 RetAddrLR->insert( RetAddrVal );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000364 unsigned RegClassID = getRegClassIDOfValue( RetAddrVal );
365 RetAddrLR->setRegClass( RCList[RegClassID] );
Chris Lattner95685682002-08-12 21:25:05 +0000366 RetAddrLR->setColor(getUnifiedRegNum(IntRegClassID,SparcIntRegClass::o7));
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000367 LRI.addLRToMap( RetAddrVal, RetAddrLR);
368
Ruchira Sasanka91442282001-09-30 23:16:47 +0000369}
370
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000371
372
Ruchira Sasanka91442282001-09-30 23:16:47 +0000373
374//---------------------------------------------------------------------------
375// This method will suggest colors to incoming args to a method.
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000376// According to the Sparc ABI, the first 6 incoming args are in
377// %i0 - %i5 (if they are integer) OR in %f0 - %f31 (if they are float).
Ruchira Sasanka91442282001-09-30 23:16:47 +0000378// If the arg is passed on stack due to the lack of regs, NOTHING will be
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000379// done - it will be colored (or spilled) as a normal live range.
Ruchira Sasanka91442282001-09-30 23:16:47 +0000380//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000381void UltraSparcRegInfo::suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000382 LiveRangeInfo& LRI) const
Chris Lattner20b1ea02001-09-14 03:47:57 +0000383{
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000384 // check if this is a varArgs function. needed for choosing regs.
385 bool isVarArgs = isVarArgsFunction(Meth->getType());
386
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000387 // for each argument. count INT and FP arguments separately.
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000388 unsigned argNo=0, intArgNo=0, fpArgNo=0;
389 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
390 I != E; ++I, ++argNo) {
391 // get the LR of arg
392 LiveRange *LR = LRI.getLiveRangeForValue(I);
393 assert(LR && "No live range found for method arg");
394
395 unsigned regType = getRegType(LR);
396 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
397
398 int regNum = (regType == IntRegType)
399 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
400 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
401 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
402 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
403
404 if(regNum != InvalidRegNum)
405 LR->setSuggestedColor(regNum);
406 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000407}
408
Ruchira Sasanka91442282001-09-30 23:16:47 +0000409
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000410//---------------------------------------------------------------------------
411// This method is called after graph coloring to move incoming args to
412// the correct hardware registers if they did not receive the correct
413// (suggested) color through graph coloring.
414//---------------------------------------------------------------------------
Chris Lattnerb7653df2002-04-08 22:03:57 +0000415void UltraSparcRegInfo::colorMethodArgs(const Function *Meth,
Chris Lattner699683c2002-02-04 05:59:25 +0000416 LiveRangeInfo &LRI,
417 AddedInstrns *FirstAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000418
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000419 // check if this is a varArgs function. needed for choosing regs.
420 bool isVarArgs = isVarArgsFunction(Meth->getType());
Ruchira Sasanka91442282001-09-30 23:16:47 +0000421 MachineInstr *AdMI;
422
Ruchira Sasanka91442282001-09-30 23:16:47 +0000423 // for each argument
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000424 // for each argument. count INT and FP arguments separately.
425 unsigned argNo=0, intArgNo=0, fpArgNo=0;
426 for(Function::const_aiterator I = Meth->abegin(), E = Meth->aend();
427 I != E; ++I, ++argNo) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000428 // get the LR of arg
Chris Lattner0b12b5f2002-06-25 16:13:21 +0000429 LiveRange *LR = LRI.getLiveRangeForValue(I);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000430 assert( LR && "No live range found for method arg");
431
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000432 unsigned regType = getRegType( LR );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000433 unsigned RegClassID = (LR->getRegClass())->getID();
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000434
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000435 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000436 // Also find the correct register the argument must use (UniArgReg)
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000437 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000438 bool isArgInReg = false;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000439 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000440 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
441
442 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000443 ? regNumForIntArg(/*inCallee*/ true, isVarArgs,
444 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
445 : regNumForFPArg(regType, /*inCallee*/ true, isVarArgs,
446 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000447
448 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000449 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000450 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000451 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000452
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000453 if( LR->hasColor() ) { // if this arg received a register
Ruchira Sasanka91442282001-09-30 23:16:47 +0000454
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000455 unsigned UniLRReg = getUnifiedRegNum( RegClassID, LR->getColor() );
456
457 // if LR received the correct color, nothing to do
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000458 //
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000459 if( UniLRReg == UniArgReg )
460 continue;
461
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000462 // We are here because the LR did not receive the suggested
463 // but LR received another register.
464 // Now we have to copy the %i reg (or stack pos of arg)
465 // to the register the LR was colored with.
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000466
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000467 // if the arg is coming in UniArgReg register, it MUST go into
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000468 // the UniLRReg register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000469 //
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000470 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000471 if( regClassIDOfArgReg != RegClassID ) {
Vikram S. Adve242a8082002-05-19 15:25:51 +0000472 assert(0 && "This could should work but it is not tested yet");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000473
474 // It is a variable argument call: the float reg must go in a %o reg.
475 // We have to move an int reg to a float reg via memory.
476 //
477 assert(isVarArgs &&
478 RegClassID == FloatRegClassID &&
479 regClassIDOfArgReg == IntRegClassID &&
480 "This should only be an Int register for an FP argument");
481
482 int TmpOff = MachineCodeForMethod::get(Meth).pushTempValue(target,
483 getSpilledRegSize(regType));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000484 cpReg2MemMI(FirstAI->InstrnsBefore,
485 UniArgReg, getFramePointer(), TmpOff, IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000486
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000487 cpMem2RegMI(FirstAI->InstrnsBefore,
488 getFramePointer(), TmpOff, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000489 }
490 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000491 cpReg2RegMI(FirstAI->InstrnsBefore, UniArgReg, UniLRReg, regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000492 }
493 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000494 else {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000495
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000496 // Now the arg is coming on stack. Since the LR recieved a register,
497 // we just have to load the arg on stack into that register
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000498 //
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000499 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000500 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000501 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
502 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000503
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000504 cpMem2RegMI(FirstAI->InstrnsBefore,
505 getFramePointer(), offsetFromFP, UniLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000506 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000507
508 } // if LR received a color
509
510 else {
511
512 // Now, the LR did not receive a color. But it has a stack offset for
513 // spilling.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000514 // So, if the arg is coming in UniArgReg register, we can just move
515 // that on to the stack pos of LR
516
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000517 if( isArgInReg ) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000518
519 if( regClassIDOfArgReg != RegClassID ) {
520 assert(0 &&
521 "FP arguments to a varargs function should be explicitly "
522 "copied to/from int registers by instruction selection!");
523
524 // It must be a float arg for a variable argument call, which
525 // must come in a %o reg. Move the int reg to the stack.
526 //
527 assert(isVarArgs && regClassIDOfArgReg == IntRegClassID &&
528 "This should only be an Int register for an FP argument");
529
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000530 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
531 getFramePointer(), LR->getSpillOffFromFP(), IntRegType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000532 }
533 else {
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000534 cpReg2MemMI(FirstAI->InstrnsBefore, UniArgReg,
535 getFramePointer(), LR->getSpillOffFromFP(), regType);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000536 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000537 }
538
539 else {
540
541 // Now the arg is coming on stack. Since the LR did NOT
542 // recieved a register as well, it is allocated a stack position. We
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000543 // can simply change the stack position of the LR. We can do this,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000544 // since this method is called before any other method that makes
545 // uses of the stack pos of the LR (e.g., updateMachineInstr)
546
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000547 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000548 int offsetFromFP =
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000549 frameInfo.getIncomingArgOffset(MachineCodeForMethod::get(Meth),
550 argNo);
Vikram S. Adve1c0fba62001-11-08 04:56:41 +0000551
552 LR->modifySpillOffFromFP( offsetFromFP );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000553 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000554
555 }
556
Ruchira Sasanka91442282001-09-30 23:16:47 +0000557 } // for each incoming argument
558
559}
560
Chris Lattner20b1ea02001-09-14 03:47:57 +0000561
562
Ruchira Sasanka91442282001-09-30 23:16:47 +0000563//---------------------------------------------------------------------------
564// This method is called before graph coloring to suggest colors to the
565// outgoing call args and the return value of the call.
566//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000567void UltraSparcRegInfo::suggestRegs4CallArgs(MachineInstr *CallMI,
Ruchira Sasanka91442282001-09-30 23:16:47 +0000568 LiveRangeInfo& LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000569 std::vector<RegClass *> RCList) const {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000570 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
Chris Lattner20b1ea02001-09-14 03:47:57 +0000571
Vikram S. Adve242a8082002-05-19 15:25:51 +0000572 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000573
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000574 suggestReg4CallAddr(CallMI, LRI, RCList);
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000575
Ruchira Sasanka91442282001-09-30 23:16:47 +0000576 // First color the return value of the call instruction. The return value
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000577 // will be in %o0 if the value is an integer type, or in %f0 if the
578 // value is a float type.
579
Ruchira Sasanka91442282001-09-30 23:16:47 +0000580 // the return value cannot have a LR in machine instruction since it is
581 // only defined by the call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000582
Ruchira Sasanka91442282001-09-30 23:16:47 +0000583 // if type is not void, create a new live range and set its
584 // register class and add to LRI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000585
Vikram S. Adve242a8082002-05-19 15:25:51 +0000586 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000587
Chris Lattner699683c2002-02-04 05:59:25 +0000588 if (RetVal) {
589 assert ((!LRI.getLiveRangeForValue(RetVal)) &&
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000590 "LR for ret Value of call already definded!");
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000591
Chris Lattner699683c2002-02-04 05:59:25 +0000592 // create a new LR for the return value
593 LiveRange *RetValLR = new LiveRange();
Chris Lattnerd1b60fb2002-02-04 16:37:09 +0000594 RetValLR->insert(RetVal);
Chris Lattner699683c2002-02-04 05:59:25 +0000595 unsigned RegClassID = getRegClassIDOfValue(RetVal);
596 RetValLR->setRegClass(RCList[RegClassID]);
597 LRI.addLRToMap(RetVal, RetValLR);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000598
599 // now suggest a register depending on the register class of ret arg
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000600
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000601 if( RegClassID == IntRegClassID )
Chris Lattner95685682002-08-12 21:25:05 +0000602 RetValLR->setSuggestedColor(SparcIntRegClass::o0);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000603 else if (RegClassID == FloatRegClassID )
Chris Lattner95685682002-08-12 21:25:05 +0000604 RetValLR->setSuggestedColor(SparcFloatRegClass::f0 );
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000605 else assert( 0 && "Unknown reg class for return value of call\n");
Chris Lattner20b1ea02001-09-14 03:47:57 +0000606 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000607
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000608
Ruchira Sasanka91442282001-09-30 23:16:47 +0000609 // Now suggest colors for arguments (operands) of the call instruction.
610 // Colors are suggested only if the arg number is smaller than the
611 // the number of registers allocated for argument passing.
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000612 // Now, go thru call args - implicit operands of the call MI
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000613
Vikram S. Adve242a8082002-05-19 15:25:51 +0000614 unsigned NumOfCallArgs = argDesc->getNumArgs();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000615
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000616 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
617 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000618
Vikram S. Adve242a8082002-05-19 15:25:51 +0000619 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000620
621 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000622 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000623
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000624 // not possible to have a null LR since all args (even consts)
625 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000626 if (!LR) {
627 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) << "\n";
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000628 assert(0 && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000629 }
630
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000631 unsigned regType = getRegType( LR );
632 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg (unused)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000633
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000634 // Choose a register for this arg depending on whether it is
Vikram S. Adve242a8082002-05-19 15:25:51 +0000635 // an INT or FP value. Here we ignore whether or not it is a
636 // varargs calls, because FP arguments will be explicitly copied
637 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000638 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000639 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
640 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
641 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
642 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000643
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000644 // If a register could be allocated, use it.
645 // If not, do NOTHING as this will be colored as a normal value.
646 if(regNum != InvalidRegNum)
647 LR->setSuggestedColor(regNum);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000648
Vikram S. Adve242a8082002-05-19 15:25:51 +0000649 // Repeat for the second copy of the argument, which would be
650 // an FP argument being passed to a function with no prototype
651 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
652 if (argCopy != NULL)
653 {
654 assert(regType != IntRegType && argCopy->getType()->isIntegral()
655 && "Must be passing copy of FP argument in int register");
656 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
657 argNo, intArgNo, fpArgNo-1,
658 regClassIDOfArgReg);
659 assert(copyRegNum != InvalidRegNum);
660 LiveRange *const copyLR = LRI.getLiveRangeForValue(argCopy);
661 copyLR->setSuggestedColor(copyRegNum);
662 }
663
Ruchira Sasanka91442282001-09-30 23:16:47 +0000664 } // for all call arguments
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000665
Chris Lattner20b1ea02001-09-14 03:47:57 +0000666}
667
668
Ruchira Sasanka91442282001-09-30 23:16:47 +0000669//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +0000670// Helper method for UltraSparcRegInfo::colorCallArgs().
671//---------------------------------------------------------------------------
672
673void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000674UltraSparcRegInfo::InitializeOutgoingArg(MachineInstr* CallMI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000675 AddedInstrns *CallAI,
676 PhyRegAlloc &PRA, LiveRange* LR,
677 unsigned regType, unsigned RegClassID,
678 int UniArgRegOrNone, unsigned int argNo,
679 std::vector<MachineInstr *>& AddedInstrnsBefore)
680 const
681{
682 MachineInstr *AdMI;
683 bool isArgInReg = false;
684 unsigned UniArgReg = MAXINT; // unused unless initialized below
685 if (UniArgRegOrNone != InvalidRegNum)
686 {
687 isArgInReg = true;
688 UniArgReg = (unsigned) UniArgRegOrNone;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000689 CallMI->getRegsUsed().insert(UniArgReg); // mark the reg as used
Vikram S. Adve242a8082002-05-19 15:25:51 +0000690 }
691
692 if (LR->hasColor()) {
693 unsigned UniLRReg = getUnifiedRegNum(RegClassID, LR->getColor());
694
695 // if LR received the correct color, nothing to do
696 if( isArgInReg && UniArgReg == UniLRReg )
697 return;
698
699 // The LR is allocated to a register UniLRReg and must be copied
700 // to UniArgReg or to the stack slot.
701 //
702 if( isArgInReg ) {
703 // Copy UniLRReg to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000704 cpReg2RegMI(AddedInstrnsBefore, UniLRReg, UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000705 }
706 else {
707 // Copy UniLRReg to the stack to pass the arg on stack.
708 const MachineFrameInfo& frameInfo = target.getFrameInfo();
709 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000710 cpReg2MemMI(CallAI->InstrnsBefore,
711 UniLRReg, getStackPointer(), argOffset, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000712 }
713
714 } else { // LR is not colored (i.e., spilled)
715
716 if( isArgInReg ) {
717 // Insert a load instruction to load the LR to UniArgReg
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000718 cpMem2RegMI(AddedInstrnsBefore, getFramePointer(),
719 LR->getSpillOffFromFP(), UniArgReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000720 // Now add the instruction
721 }
722
723 else {
724 // Now, we have to pass the arg on stack. Since LR also did NOT
725 // receive a register we have to move an argument in memory to
726 // outgoing parameter on stack.
727 // Use TReg to load and store the value.
728 // Use TmpOff to save TReg, since that may have a live value.
729 //
730 int TReg = PRA.getUniRegNotUsedByThisInst( LR->getRegClass(), CallMI );
731 int TmpOff = PRA.mcInfo.pushTempValue(target,
732 getSpilledRegSize(getRegType(LR)));
733 const MachineFrameInfo& frameInfo = target.getFrameInfo();
734 int argOffset = frameInfo.getOutgoingArgOffset(PRA.mcInfo, argNo);
735
736 MachineInstr *Ad1, *Ad2, *Ad3, *Ad4;
737
738 // Sequence:
739 // (1) Save TReg on stack
740 // (2) Load LR value into TReg from stack pos of LR
741 // (3) Store Treg on outgoing Arg pos on stack
742 // (4) Load the old value of TReg from stack to TReg (restore it)
743 //
744 // OPTIMIZE THIS:
745 // When reverse pointers in MahineInstr are introduced:
746 // Call PRA.getUnusedRegAtMI(....) to get an unused reg. Step 1 is
747 // needed only if this fails. Currently, we cannot call the
748 // above method since we cannot find LVSetBefore without the BB
749 //
750 // NOTE: We directly add to CallAI->InstrnsBefore instead of adding to
751 // AddedInstrnsBefore since these instructions must not be reordered.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000752 cpReg2MemMI(CallAI->InstrnsBefore,
753 TReg, getFramePointer(), TmpOff, regType);
754 cpMem2RegMI(CallAI->InstrnsBefore,
755 getFramePointer(), LR->getSpillOffFromFP(), TReg, regType);
756 cpReg2MemMI(CallAI->InstrnsBefore,
757 TReg, getStackPointer(), argOffset, regType);
758 cpMem2RegMI(CallAI->InstrnsBefore,
759 getFramePointer(), TmpOff, TReg, regType);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000760 }
761 }
762}
763
764//---------------------------------------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000765// After graph coloring, we have call this method to see whehter the return
766// value and the call args received the correct colors. If not, we have
767// to instert copy instructions.
768//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +0000769
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000770void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000771 LiveRangeInfo &LRI,
772 AddedInstrns *CallAI,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000773 PhyRegAlloc &PRA,
774 const BasicBlock *BB) const {
Chris Lattner20b1ea02001-09-14 03:47:57 +0000775
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000776 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
777
Vikram S. Adve242a8082002-05-19 15:25:51 +0000778 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
779
Ruchira Sasanka91442282001-09-30 23:16:47 +0000780 // First color the return value of the call.
781 // If there is a LR for the return value, it means this
782 // method returns a value
783
784 MachineInstr *AdMI;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000785
Vikram S. Adve242a8082002-05-19 15:25:51 +0000786 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000787
Chris Lattner0665a5f2002-02-05 01:43:49 +0000788 if (RetVal) {
789 LiveRange *RetValLR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000790
Chris Lattner0665a5f2002-02-05 01:43:49 +0000791 if (!RetValLR) {
792 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000793 assert(RetValLR && "ERR:No LR for non-void return value");
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000794 }
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000795
796 unsigned RegClassID = (RetValLR->getRegClass())->getID();
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000797 bool recvCorrectColor;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000798 unsigned CorrectCol; // correct color for ret value
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000799 unsigned UniRetReg; // unified number for CorrectCol
800
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000801 if(RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000802 CorrectCol = SparcIntRegClass::o0;
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000803 else if(RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +0000804 CorrectCol = SparcFloatRegClass::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000805 else {
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000806 assert( 0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000807 return;
808 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000809
810 // convert to unified number
Chris Lattner95685682002-08-12 21:25:05 +0000811 UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000812
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000813 // Mark the register as used by this instruction
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000814 CallMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000815
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000816 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000817 recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol
818 : false;
819
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000820 // if we didn't receive the correct color for some reason,
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000821 // put copy instruction
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000822 if( !recvCorrectColor ) {
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000823
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000824 unsigned regType = getRegType( RetValLR );
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000825
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000826 if( RetValLR->hasColor() ) {
827
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000828 unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor());
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000829
Ruchira Sasankac74a7202001-10-24 15:56:58 +0000830 // the return value is coming in UniRetReg but has to go into
831 // the UniRetLRReg
832
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000833 cpReg2RegMI(CallAI->InstrnsAfter, UniRetReg, UniRetLRReg, regType);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000834
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000835 } // if LR has color
836 else {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000837
838 // if the LR did NOT receive a color, we have to move the return
839 // value coming in UniRetReg to the stack pos of spilled LR
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000840
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000841 cpReg2MemMI(CallAI->InstrnsAfter, UniRetReg,
842 getFramePointer(),RetValLR->getSpillOffFromFP(), regType);
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000843 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000844
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000845 } // the LR didn't receive the suggested color
846
847 } // if there a return value
Ruchira Sasanka91442282001-09-30 23:16:47 +0000848
849
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000850 //-------------------------------------------
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000851 // Now color all args of the call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000852 //-------------------------------------------
Ruchira Sasanka91442282001-09-30 23:16:47 +0000853
Chris Lattner697954c2002-01-20 22:54:45 +0000854 std::vector<MachineInstr *> AddedInstrnsBefore;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000855
856 unsigned NumOfCallArgs = argDesc->getNumArgs();
857
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000858 for(unsigned argNo=0, i=0, intArgNo=0, fpArgNo=0;
859 i < NumOfCallArgs; ++i, ++argNo) {
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000860
Vikram S. Adve242a8082002-05-19 15:25:51 +0000861 const Value *CallArg = argDesc->getArgInfo(i).getArgVal();
862
Ruchira Sasanka91442282001-09-30 23:16:47 +0000863 // get the LR of call operand (parameter)
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000864 LiveRange *const LR = LRI.getLiveRangeForValue(CallArg);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000865
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000866 unsigned RegClassID = getRegClassIDOfValue( CallArg);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000867 unsigned regType = getRegType( RegClassID, CallArg->getType() );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000868
Vikram S. Adve242a8082002-05-19 15:25:51 +0000869 // Find whether this argument is coming in a register (if not, on stack)
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000870 // Also find the correct register the argument must use (UniArgReg)
871 //
Ruchira Sasanka91442282001-09-30 23:16:47 +0000872 bool isArgInReg = false;
Vikram S. Adve242a8082002-05-19 15:25:51 +0000873 unsigned UniArgReg = InvalidRegNum; // reg that LR MUST be colored with
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000874 unsigned regClassIDOfArgReg = MAXINT; // reg class of chosen reg
875
Vikram S. Adve242a8082002-05-19 15:25:51 +0000876 // Find the register that must be used for this arg, depending on
877 // whether it is an INT or FP value. Here we ignore whether or not it
878 // is a varargs calls, because FP arguments will be explicitly copied
879 // to an integer Value and handled under (argCopy != NULL) below.
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000880 int regNum = (regType == IntRegType)
Vikram S. Adve242a8082002-05-19 15:25:51 +0000881 ? regNumForIntArg(/*inCallee*/ false, /*isVarArgs*/ false,
882 argNo, intArgNo++, fpArgNo, regClassIDOfArgReg)
883 : regNumForFPArg(regType, /*inCallee*/ false, /*isVarArgs*/ false,
884 argNo, intArgNo, fpArgNo++, regClassIDOfArgReg);
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000885
886 if(regNum != InvalidRegNum) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000887 isArgInReg = true;
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000888 UniArgReg = getUnifiedRegNum( regClassIDOfArgReg, regNum);
Vikram S. Adve242a8082002-05-19 15:25:51 +0000889 assert(regClassIDOfArgReg == RegClassID &&
890 "Moving values between reg classes must happen during selection");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000891 }
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000892
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000893 // not possible to have a null LR since all args (even consts)
894 // must be defined before
Chris Lattner0665a5f2002-02-05 01:43:49 +0000895 if (!LR) {
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000896 cerr << " ERROR: In call instr, no LR for arg: " << RAV(CallArg) <<"\n";
Vikram S. Adve242a8082002-05-19 15:25:51 +0000897 assert(LR && "NO LR for call arg");
Ruchira Sasanka91442282001-09-30 23:16:47 +0000898 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000899
900 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
901 UniArgReg, argNo, AddedInstrnsBefore);
902
903 // Repeat for the second copy of the argument, which would be
904 // an FP argument being passed to a function with no prototype.
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000905 // It may either be passed as a copy in an integer register
906 // (in argCopy), or on the stack (useStackSlot).
Vikram S. Adve242a8082002-05-19 15:25:51 +0000907 const Value *argCopy = argDesc->getArgInfo(i).getArgCopy();
908 if (argCopy != NULL)
909 {
910 assert(regType != IntRegType && argCopy->getType()->isIntegral()
911 && "Must be passing copy of FP argument in int register");
Vikram S. Adve31f78c42002-04-25 04:42:21 +0000912
Vikram S. Adve242a8082002-05-19 15:25:51 +0000913 unsigned copyRegClassID = getRegClassIDOfValue(argCopy);
914 unsigned copyRegType = getRegType(copyRegClassID, argCopy->getType());
915
916 int copyRegNum = regNumForIntArg(/*inCallee*/false, /*isVarArgs*/false,
917 argNo, intArgNo, fpArgNo-1,
918 regClassIDOfArgReg);
919 assert(copyRegNum != InvalidRegNum);
920 assert(regClassIDOfArgReg == copyRegClassID &&
921 "Moving values between reg classes must happen during selection");
922
923 InitializeOutgoingArg(CallMI, CallAI, PRA,
924 LRI.getLiveRangeForValue(argCopy), copyRegType,
925 copyRegClassID, copyRegNum, argNo,
926 AddedInstrnsBefore);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000927 }
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000928
929 if (regNum != InvalidRegNum &&
930 argDesc->getArgInfo(i).usesStackSlot())
931 {
932 // Pass the argument via the stack in addition to regNum
933 assert(regType != IntRegType && "Passing an integer arg. twice?");
934 assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?");
935 InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID,
936 InvalidRegNum, argNo, AddedInstrnsBefore);
937 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000938 } // for each parameter in call instruction
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000939
Vikram S. Adve242a8082002-05-19 15:25:51 +0000940 // If we added any instruction before the call instruction, verify
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000941 // that they are in the proper order and if not, reorder them
Vikram S. Adve242a8082002-05-19 15:25:51 +0000942 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000943 std::vector<MachineInstr *> ReorderedVec;
Chris Lattner699683c2002-02-04 05:59:25 +0000944 if (!AddedInstrnsBefore.empty()) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000945
Chris Lattner699683c2002-02-04 05:59:25 +0000946 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000947 cerr << "\nCalling reorder with instrns: \n";
948 for(unsigned i=0; i < AddedInstrnsBefore.size(); i++)
949 cerr << *(AddedInstrnsBefore[i]);
950 }
951
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000952 OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA);
953 assert(ReorderedVec.size() >= AddedInstrnsBefore.size()
954 && "Dropped some instructions when reordering!");
955
Chris Lattner699683c2002-02-04 05:59:25 +0000956 if (DEBUG_RA) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000957 cerr << "\nAfter reordering instrns: \n";
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000958 for(unsigned i = 0; i < ReorderedVec.size(); i++)
959 cerr << *ReorderedVec[i];
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000960 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +0000961 }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000962
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000963 // Now insert caller saving code for this call instruction
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000964 //
Vikram S. Advedcde95f2002-07-10 21:36:00 +0000965 insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter,
966 CallMI, BB, PRA);
967
968 // Then insert the final reordered code for the call arguments.
969 //
970 for(unsigned i=0; i < ReorderedVec.size(); i++)
971 CallAI->InstrnsBefore.push_back( ReorderedVec[i] );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000972}
973
Ruchira Sasanka91442282001-09-30 23:16:47 +0000974//---------------------------------------------------------------------------
975// This method is called for an LLVM return instruction to identify which
976// values will be returned from this method and to suggest colors.
977//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000978void UltraSparcRegInfo::suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000979 LiveRangeInfo &LRI) const {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000980
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000981 assert( (UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode() ) );
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000982
Vikram S. Adve76ee6f72002-07-08 23:23:12 +0000983 suggestReg4RetAddr(RetMI, LRI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000984
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000985 // if there is an implicit ref, that has to be the ret value
986 if( RetMI->getNumImplicitRefs() > 0 ) {
Ruchira Sasanka91442282001-09-30 23:16:47 +0000987
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000988 // The first implicit operand is the return value of a return instr
989 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +0000990
Ruchira Sasanka91442282001-09-30 23:16:47 +0000991 LiveRange *const LR = LRI.getLiveRangeForValue( RetVal );
Ruchira Sasanka91442282001-09-30 23:16:47 +0000992
Chris Lattner0665a5f2002-02-05 01:43:49 +0000993 if (!LR) {
994 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
995 assert(0 && "No LR for return value of non-void method");
996 }
Ruchira Sasanka91442282001-09-30 23:16:47 +0000997
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000998 unsigned RegClassID = (LR->getRegClass())->getID();
Ruchira Sasanka91442282001-09-30 23:16:47 +0000999
Chris Lattner699683c2002-02-04 05:59:25 +00001000 if (RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001001 LR->setSuggestedColor(SparcIntRegClass::i0);
Chris Lattner699683c2002-02-04 05:59:25 +00001002 else if (RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001003 LR->setSuggestedColor(SparcFloatRegClass::f0);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001004 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001005}
1006
Ruchira Sasanka91442282001-09-30 23:16:47 +00001007
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001008
1009//---------------------------------------------------------------------------
1010// Colors the return value of a method to %i0 or %f0, if possible. If it is
1011// not possilbe to directly color the LR, insert a copy instruction to move
1012// the LR to %i0 or %f0. When the LR is spilled, instead of the copy, we
1013// have to put a load instruction.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001014//---------------------------------------------------------------------------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001015void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +00001016 LiveRangeInfo &LRI,
1017 AddedInstrns *RetAI) const {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001018
Chris Lattner699683c2002-02-04 05:59:25 +00001019 assert((UltraSparcInfo->getInstrInfo()).isReturn( RetMI->getOpCode()));
Ruchira Sasanka91442282001-09-30 23:16:47 +00001020
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001021 // if there is an implicit ref, that has to be the ret value
Chris Lattner699683c2002-02-04 05:59:25 +00001022 if(RetMI->getNumImplicitRefs() > 0) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001023
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001024 // The first implicit operand is the return value of a return instr
1025 const Value *RetVal = RetMI->getImplicitRef(0);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001026
Chris Lattner699683c2002-02-04 05:59:25 +00001027 LiveRange *LR = LRI.getLiveRangeForValue(RetVal);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001028
Chris Lattner0665a5f2002-02-05 01:43:49 +00001029 if (!LR) {
1030 cerr << "\nNo LR for:" << RAV(RetVal) << "\n";
1031 // assert( LR && "No LR for return value of non-void method");
1032 return;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001033 }
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001034
Ruchira Sasanka91442282001-09-30 23:16:47 +00001035 unsigned RegClassID = getRegClassIDOfValue(RetVal);
Vikram S. Adve31f78c42002-04-25 04:42:21 +00001036 unsigned regType = getRegType( RetVal );
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001037
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001038 unsigned CorrectCol;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001039 if(RegClassID == IntRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001040 CorrectCol = SparcIntRegClass::i0;
Ruchira Sasanka91442282001-09-30 23:16:47 +00001041 else if(RegClassID == FloatRegClassID)
Chris Lattner95685682002-08-12 21:25:05 +00001042 CorrectCol = SparcFloatRegClass::f0;
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001043 else {
Chris Lattner699683c2002-02-04 05:59:25 +00001044 assert (0 && "Unknown RegClass");
Chris Lattner8e5c0b42001-11-07 14:01:59 +00001045 return;
1046 }
Ruchira Sasanka91442282001-09-30 23:16:47 +00001047
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001048 // convert to unified number
Chris Lattner95685682002-08-12 21:25:05 +00001049 unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol);
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001050
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001051 // Mark the register as used by this instruction
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001052 RetMI->getRegsUsed().insert(UniRetReg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001053
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001054 // if the LR received the correct color, NOTHING to do
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001055
Chris Lattner699683c2002-02-04 05:59:25 +00001056 if (LR->hasColor() && LR->getColor() == CorrectCol)
1057 return;
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001058
Chris Lattner699683c2002-02-04 05:59:25 +00001059 if (LR->hasColor()) {
Ruchira Sasanka91442282001-09-30 23:16:47 +00001060
Ruchira Sasanka88dedc12001-10-23 21:40:39 +00001061 // We are here because the LR was allocted a regiter
1062 // It may be the suggested register or not
Ruchira Sasanka91442282001-09-30 23:16:47 +00001063
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001064 // copy the LR of retun value to i0 or f0
Ruchira Sasanka91442282001-09-30 23:16:47 +00001065
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +00001066 unsigned UniLRReg =getUnifiedRegNum( RegClassID, LR->getColor());
Ruchira Sasanka91442282001-09-30 23:16:47 +00001067
Ruchira Sasankac74a7202001-10-24 15:56:58 +00001068 // the LR received UniLRReg but must be colored with UniRetReg
1069 // to pass as the return value
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001070 cpReg2RegMI(RetAI->InstrnsBefore, UniLRReg, UniRetReg, regType);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001071 }
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001072 else { // if the LR is spilled
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001073 cpMem2RegMI(RetAI->InstrnsBefore, getFramePointer(),
1074 LR->getSpillOffFromFP(), UniRetReg, regType);
Chris Lattner697954c2002-01-20 22:54:45 +00001075 cerr << "\nCopied the return value from stack\n";
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001076 }
1077
Ruchira Sasanka91442282001-09-30 23:16:47 +00001078 } // if there is a return value
1079
1080}
1081
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001082//---------------------------------------------------------------------------
1083// Check if a specified register type needs a scratch register to be
1084// copied to/from memory. If it does, the reg. type that must be used
1085// for scratch registers is returned in scratchRegType.
1086//
1087// Only the int CC register needs such a scratch register.
1088// The FP CC registers can (and must) be copied directly to/from memory.
1089//---------------------------------------------------------------------------
1090
1091bool
1092UltraSparcRegInfo::regTypeNeedsScratchReg(int RegType,
1093 int& scratchRegType) const
1094{
1095 if (RegType == IntCCRegType)
1096 {
1097 scratchRegType = IntRegType;
1098 return true;
1099 }
1100 return false;
1101}
Ruchira Sasanka91442282001-09-30 23:16:47 +00001102
1103//---------------------------------------------------------------------------
1104// Copy from a register to register. Register number must be the unified
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001105// register number.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001106//---------------------------------------------------------------------------
1107
Vikram S. Adve242a8082002-05-19 15:25:51 +00001108void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001109UltraSparcRegInfo::cpReg2RegMI(vector<MachineInstr*>& mvec,
1110 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001111 unsigned DestReg,
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001112 int RegType) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001113 assert( ((int)SrcReg != InvalidRegNum) && ((int)DestReg != InvalidRegNum) &&
Ruchira Sasanka91442282001-09-30 23:16:47 +00001114 "Invalid Register");
1115
1116 MachineInstr * MI = NULL;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001117
Ruchira Sasanka91442282001-09-30 23:16:47 +00001118 switch( RegType ) {
1119
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001120 case IntCCRegType:
Chris Lattner95685682002-08-12 21:25:05 +00001121 if (getRegType(DestReg) == IntRegType)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001122 { // copy intCC reg to int reg
1123 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1124 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, DestReg);
1125 }
1126 else
1127 { // copy int reg to intCC reg
1128 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
Chris Lattner95685682002-08-12 21:25:05 +00001129 assert(getRegType(SrcReg) == IntRegType
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001130 && "Can only copy CC reg to/from integer reg");
1131 MI = Create2OperandInstr_Reg(WRCCR, SrcReg, DestReg+1);
1132 }
1133 break;
1134
Ruchira Sasanka735d6e32001-10-18 22:38:52 +00001135 case FloatCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001136 assert(0 && "Cannot copy FPCC register to any other register");
Vikram S. Adve242a8082002-05-19 15:25:51 +00001137 break;
1138
1139 case IntRegType:
Chris Lattner95685682002-08-12 21:25:05 +00001140 MI = Create3OperandInstr_Reg(ADD, SrcReg, getZeroRegNum(), DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001141 break;
Vikram S. Adve242a8082002-05-19 15:25:51 +00001142
Ruchira Sasanka91442282001-09-30 23:16:47 +00001143 case FPSingleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001144 MI = Create2OperandInstr_Reg(FMOVS, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001145 break;
1146
1147 case FPDoubleRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001148 MI = Create2OperandInstr_Reg(FMOVD, SrcReg, DestReg);
Ruchira Sasanka91442282001-09-30 23:16:47 +00001149 break;
1150
1151 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001152 assert(0 && "Unknown RegType");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001153 break;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001154 }
Vikram S. Adve242a8082002-05-19 15:25:51 +00001155
1156 if (MI)
1157 mvec.push_back(MI);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001158}
Chris Lattner20b1ea02001-09-14 03:47:57 +00001159
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001160//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001161// Copy from a register to memory (i.e., Store). Register number must
1162// be the unified register number
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001163//---------------------------------------------------------------------------
1164
1165
Vikram S. Adve242a8082002-05-19 15:25:51 +00001166void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001167UltraSparcRegInfo::cpReg2MemMI(vector<MachineInstr*>& mvec,
1168 unsigned SrcReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001169 unsigned DestPtrReg,
1170 int Offset, int RegType,
Chris Lattnerb82d97e2002-07-25 06:08:32 +00001171 int scratchReg) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001172 MachineInstr * MI = NULL;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001173 switch( RegType ) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001174 case IntRegType:
1175 MI = new MachineInstr(STX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001176 MI->SetMachineOperandReg(0, SrcReg, false);
1177 MI->SetMachineOperandReg(1, DestPtrReg, false);
1178 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1179 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001180 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001181 break;
1182
1183 case FPSingleRegType:
1184 MI = new MachineInstr(ST, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001185 MI->SetMachineOperandReg(0, SrcReg, false);
1186 MI->SetMachineOperandReg(1, DestPtrReg, false);
1187 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1188 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001189 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001190 break;
1191
1192 case FPDoubleRegType:
1193 MI = new MachineInstr(STD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001194 MI->SetMachineOperandReg(0, SrcReg, false);
1195 MI->SetMachineOperandReg(1, DestPtrReg, false);
1196 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1197 (int64_t) Offset);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001198 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001199 break;
1200
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001201 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001202 assert(scratchReg >= 0 && "Need scratch reg to store %ccr to memory");
Chris Lattner95685682002-08-12 21:25:05 +00001203 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001204
1205 // Use SrcReg+1 to get the name "%ccr" instead of "%xcc" for RDCCR
1206 MI = Create2OperandInstr_Reg(RDCCR, SrcReg+1, scratchReg);
1207 mvec.push_back(MI);
1208
Chris Lattner95685682002-08-12 21:25:05 +00001209 cpReg2MemMI(mvec, scratchReg, DestPtrReg, Offset, IntRegType);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001210 break;
1211
1212 case FloatCCRegType:
1213 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1214 MI = new MachineInstr(STXFSR, 3);
1215 MI->SetMachineOperandReg(0, SrcReg, false);
1216 MI->SetMachineOperandReg(1, DestPtrReg, false);
1217 MI->SetMachineOperandConst(2, MachineOperand:: MO_SignExtendedImmed,
1218 (int64_t) Offset);
1219 mvec.push_back(MI);
1220 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001221
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001222 default:
Vikram S. Adve242a8082002-05-19 15:25:51 +00001223 assert(0 && "Unknown RegType in cpReg2MemMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001224 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001225}
1226
1227
1228//---------------------------------------------------------------------------
Ruchira Sasanka7dcd6122001-10-24 22:05:34 +00001229// Copy from memory to a reg (i.e., Load) Register number must be the unified
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001230// register number
1231//---------------------------------------------------------------------------
1232
1233
Vikram S. Adve242a8082002-05-19 15:25:51 +00001234void
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001235UltraSparcRegInfo::cpMem2RegMI(vector<MachineInstr*>& mvec,
1236 unsigned SrcPtrReg,
Vikram S. Adve242a8082002-05-19 15:25:51 +00001237 int Offset,
1238 unsigned DestReg,
1239 int RegType,
Chris Lattnerb82d97e2002-07-25 06:08:32 +00001240 int scratchReg) const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001241 MachineInstr * MI = NULL;
Chris Lattner699683c2002-02-04 05:59:25 +00001242 switch (RegType) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001243 case IntRegType:
1244 MI = new MachineInstr(LDX, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001245 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1246 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1247 (int64_t) Offset);
1248 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001249 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001250 break;
1251
1252 case FPSingleRegType:
1253 MI = new MachineInstr(LD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001254 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1255 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1256 (int64_t) Offset);
1257 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001258 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001259 break;
1260
1261 case FPDoubleRegType:
1262 MI = new MachineInstr(LDD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001263 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1264 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1265 (int64_t) Offset);
1266 MI->SetMachineOperandReg(2, DestReg, true);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001267 mvec.push_back(MI);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001268 break;
1269
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001270 case IntCCRegType:
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001271 assert(scratchReg >= 0 && "Need scratch reg to load %ccr from memory");
Chris Lattner95685682002-08-12 21:25:05 +00001272 assert(getRegType(scratchReg) ==IntRegType && "Invalid scratch reg");
1273 cpMem2RegMI(mvec, SrcPtrReg, Offset, scratchReg, IntRegType);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001274
1275 // Use DestReg+1 to get the name "%ccr" instead of "%xcc" for WRCCR
1276 MI = Create2OperandInstr_Reg(WRCCR, scratchReg, DestReg+1);
1277 mvec.push_back(MI);
1278
1279 break;
1280
1281 case FloatCCRegType:
1282 assert(0 && "Tell Vikram if this assertion fails: we may have to mask out the other bits here");
1283 MI = new MachineInstr(LDXFSR, 3);
1284 MI->SetMachineOperandReg(0, SrcPtrReg, false);
1285 MI->SetMachineOperandConst(1, MachineOperand:: MO_SignExtendedImmed,
1286 (int64_t) Offset);
1287 MI->SetMachineOperandReg(2, DestReg, true);
1288 mvec.push_back(MI);
1289 break;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001290
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001291 default:
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001292 assert(0 && "Unknown RegType in cpMem2RegMI");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001293 }
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001294}
1295
1296
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001297//---------------------------------------------------------------------------
1298// Generate a copy instruction to copy a value to another. Temporarily
1299// used by PhiElimination code.
1300//---------------------------------------------------------------------------
1301
1302
Vikram S. Adve242a8082002-05-19 15:25:51 +00001303void
1304UltraSparcRegInfo::cpValue2Value(Value *Src,
1305 Value *Dest,
1306 vector<MachineInstr*>& mvec) const {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001307 int RegType = getRegType( Src );
1308
1309 assert( (RegType==getRegType(Src)) && "Src & Dest are diff types");
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001310
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001311 MachineInstr * MI = NULL;
1312
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001313 switch( RegType ) {
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001314 case IntRegType:
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001315 MI = new MachineInstr(ADD, 3);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001316 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
Chris Lattner95685682002-08-12 21:25:05 +00001317 MI->SetMachineOperandReg(1, getZeroRegNum(), false);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001318 MI->SetMachineOperandVal(2, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001319 break;
1320
1321 case FPSingleRegType:
1322 MI = new MachineInstr(FMOVS, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001323 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1324 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001325 break;
1326
1327
1328 case FPDoubleRegType:
1329 MI = new MachineInstr(FMOVD, 2);
Vikram S. Advef1c15ee2002-03-18 03:12:16 +00001330 MI->SetMachineOperandVal(0, MachineOperand:: MO_VirtualRegister, Src, false);
1331 MI->SetMachineOperandVal(1, MachineOperand:: MO_VirtualRegister, Dest, true);
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001332 break;
1333
1334 default:
1335 assert(0 && "Unknow RegType in CpValu2Value");
1336 }
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001337
Vikram S. Adve242a8082002-05-19 15:25:51 +00001338 if (MI)
1339 mvec.push_back(MI);
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +00001340}
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001341
1342
1343
Ruchira Sasanka67a463a2001-11-12 14:45:33 +00001344
1345
1346
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001347//----------------------------------------------------------------------------
1348// This method inserts caller saving/restoring instructons before/after
Ruchira Sasankabf915522002-01-07 21:03:42 +00001349// a call machine instruction. The caller saving/restoring instructions are
1350// inserted like:
1351//
1352// ** caller saving instructions
1353// other instructions inserted for the call by ColorCallArg
1354// CALL instruction
1355// other instructions inserted for the call ColorCallArg
1356// ** caller restoring instructions
1357//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001358//----------------------------------------------------------------------------
Ruchira Sasankac4d4b762001-10-16 01:23:19 +00001359
Ruchira Sasanka91442282001-09-30 23:16:47 +00001360
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001361void
1362UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore,
1363 vector<MachineInstr*>& instrnsAfter,
1364 MachineInstr *CallMI,
1365 const BasicBlock *BB,
1366 PhyRegAlloc &PRA) const
1367{
Vikram S. Adve242a8082002-05-19 15:25:51 +00001368 assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) );
1369
Ruchira Sasankabf915522002-01-07 21:03:42 +00001370 // has set to record which registers were saved/restored
1371 //
Chris Lattner09ff1122002-07-24 21:21:32 +00001372 hash_set<unsigned> PushedRegSet;
Ruchira Sasankabf915522002-01-07 21:03:42 +00001373
Vikram S. Adve242a8082002-05-19 15:25:51 +00001374 CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
1375
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001376 // Now find the LR of the return value of the call
1377 // The last *implicit operand* is the return value of a call
1378 // Insert it to to he PushedRegSet since we must not save that register
1379 // and restore it after the call.
1380 // We do this because, we look at the LV set *after* the instruction
1381 // to determine, which LRs must be saved across calls. The return value
1382 // of the call is live in this set - but we must not save/restore it.
Ruchira Sasanka91442282001-09-30 23:16:47 +00001383
Vikram S. Adve242a8082002-05-19 15:25:51 +00001384 const Value *RetVal = argDesc->getReturnValue();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001385
Chris Lattner699683c2002-02-04 05:59:25 +00001386 if (RetVal) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001387 LiveRange *RetValLR = PRA.LRI.getLiveRangeForValue( RetVal );
Chris Lattner699683c2002-02-04 05:59:25 +00001388 assert(RetValLR && "No LR for RetValue of call");
Ruchira Sasanka91442282001-09-30 23:16:47 +00001389
Chris Lattner699683c2002-02-04 05:59:25 +00001390 if (RetValLR->hasColor())
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001391 PushedRegSet.insert(
1392 getUnifiedRegNum((RetValLR->getRegClass())->getID(),
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001393 RetValLR->getColor() ) );
Ruchira Sasanka91442282001-09-30 23:16:47 +00001394 }
1395
Vikram S. Adve242a8082002-05-19 15:25:51 +00001396 const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB);
Chris Lattner748697d2002-02-05 04:20:12 +00001397 ValueSet::const_iterator LIt = LVSetAft.begin();
Ruchira Sasanka91442282001-09-30 23:16:47 +00001398
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001399 // for each live var in live variable set after machine inst
Chris Lattner748697d2002-02-05 04:20:12 +00001400 for( ; LIt != LVSetAft.end(); ++LIt) {
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001401
1402 // get the live range corresponding to live var
1403 LiveRange *const LR = PRA.LRI.getLiveRangeForValue(*LIt );
1404
1405 // LR can be null if it is a const since a const
1406 // doesn't have a dominating def - see Assumptions above
1407 if( LR ) {
1408
1409 if( LR->hasColor() ) {
1410
1411 unsigned RCID = (LR->getRegClass())->getID();
1412 unsigned Color = LR->getColor();
1413
1414 if ( isRegVolatile(RCID, Color) ) {
1415
1416 // if the value is in both LV sets (i.e., live before and after
1417 // the call machine instruction)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001418
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001419 unsigned Reg = getUnifiedRegNum(RCID, Color);
1420
1421 if( PushedRegSet.find(Reg) == PushedRegSet.end() ) {
1422
1423 // if we haven't already pushed that register
1424
1425 unsigned RegType = getRegType( LR );
1426
1427 // Now get two instructions - to push on stack and pop from stack
1428 // and add them to InstrnsBefore and InstrnsAfter of the
1429 // call instruction
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001430 //
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001431 int StackOff = PRA.mcInfo.pushTempValue(target,
1432 getSpilledRegSize(RegType));
Vikram S. Adve1c0fba62001-11-08 04:56:41 +00001433
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001434 vector<MachineInstr*> AdIBef, AdIAft;
1435
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001436 //---- Insert code for pushing the reg on stack ----------
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001437
1438 // We may need a scratch register to copy the saved value
1439 // to/from memory. This may itself have to insert code to
1440 // free up a scratch register. Any such code should go before
1441 // the save code.
1442 int scratchRegType = -1;
1443 int scratchReg = -1;
Chris Lattner95685682002-08-12 21:25:05 +00001444 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001445 { // Find a register not live in the LVSet before CallMI
1446 const ValueSet &LVSetBef =
1447 PRA.LVI->getLiveVarSetBeforeMInst(CallMI, BB);
1448 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetBef,
1449 CallMI, AdIBef, AdIAft);
Chris Lattner95685682002-08-12 21:25:05 +00001450 assert(scratchReg != getInvalidRegNum());
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001451 CallMI->getRegsUsed().insert(scratchReg);
1452 }
1453
1454 if (AdIBef.size() > 0)
1455 instrnsBefore.insert(instrnsBefore.end(),
1456 AdIBef.begin(), AdIBef.end());
1457
1458 cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType,
1459 scratchReg);
1460
Vikram S. Advedcde95f2002-07-10 21:36:00 +00001461 if (AdIAft.size() > 0)
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001462 instrnsBefore.insert(instrnsBefore.end(),
1463 AdIAft.begin(), AdIAft.end());
1464
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +00001465 //---- Insert code for popping the reg from the stack ----------
1466
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001467 // We may need a scratch register to copy the saved value
1468 // from memory. This may itself have to insert code to
1469 // free up a scratch register. Any such code should go
1470 // after the save code.
1471 //
1472 scratchRegType = -1;
1473 scratchReg = -1;
Chris Lattner95685682002-08-12 21:25:05 +00001474 if (regTypeNeedsScratchReg(RegType, scratchRegType))
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001475 { // Find a register not live in the LVSet after CallMI
1476 scratchReg = PRA.getUsableUniRegAtMI(scratchRegType, &LVSetAft,
1477 CallMI, AdIBef, AdIAft);
Chris Lattner95685682002-08-12 21:25:05 +00001478 assert(scratchReg != getInvalidRegNum());
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001479 CallMI->getRegsUsed().insert(scratchReg);
1480 }
1481
1482 if (AdIBef.size() > 0)
1483 instrnsAfter.insert(instrnsAfter.end(),
1484 AdIBef.begin(), AdIBef.end());
1485
1486 cpMem2RegMI(instrnsAfter, getFramePointer(), StackOff,Reg,RegType,
1487 scratchReg);
1488
1489 if (AdIAft.size() > 0)
1490 instrnsAfter.insert(instrnsAfter.end(),
1491 AdIAft.begin(), AdIAft.end());
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001492
Chris Lattner748697d2002-02-05 04:20:12 +00001493 PushedRegSet.insert(Reg);
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001494
Ruchira Sasankaaa12a782001-11-10 00:26:55 +00001495 if(DEBUG_RA) {
Vikram S. Adve242a8082002-05-19 15:25:51 +00001496 cerr << "\nFor call inst:" << *CallMI;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001497 cerr << " -inserted caller saving instrs: Before:\n\t ";
1498 for_each(instrnsBefore.begin(), instrnsBefore.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001499 std::mem_fun(&MachineInstr::dump));
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001500 cerr << " -and After:\n\t ";
1501 for_each(instrnsAfter.begin(), instrnsAfter.end(),
Anand Shuklab0ad8b02002-07-09 19:16:59 +00001502 std::mem_fun(&MachineInstr::dump));
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001503 }
1504 } // if not already pushed
1505
1506 } // if LR has a volatile color
1507
1508 } // if LR has color
1509
1510 } // if there is a LR for Var
Ruchira Sasanka91442282001-09-30 23:16:47 +00001511
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001512 } // for each value in the LV set after instruction
Ruchira Sasanka91442282001-09-30 23:16:47 +00001513}
1514
Ruchira Sasanka20c82b12001-10-28 18:15:12 +00001515
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001516//---------------------------------------------------------------------------
1517// Print the register assigned to a LR
1518//---------------------------------------------------------------------------
1519
Chris Lattner699683c2002-02-04 05:59:25 +00001520void UltraSparcRegInfo::printReg(const LiveRange *LR) {
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001521 unsigned RegClassID = (LR->getRegClass())->getID();
Chris Lattner1e23ed72001-10-15 18:15:27 +00001522 cerr << " *Node " << (LR->getUserIGNode())->getIndex();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001523
Chris Lattner699683c2002-02-04 05:59:25 +00001524 if (!LR->hasColor()) {
Chris Lattner697954c2002-01-20 22:54:45 +00001525 cerr << " - could not find a color\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001526 return;
1527 }
1528
1529 // if a color is found
1530
Chris Lattner1e23ed72001-10-15 18:15:27 +00001531 cerr << " colored with color "<< LR->getColor();
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001532
Chris Lattner699683c2002-02-04 05:59:25 +00001533 if (RegClassID == IntRegClassID) {
Chris Lattner95685682002-08-12 21:25:05 +00001534 cerr<< " [" << SparcIntRegClass::getRegName(LR->getColor()) << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001535
Chris Lattner699683c2002-02-04 05:59:25 +00001536 } else if (RegClassID == FloatRegClassID) {
Chris Lattner95685682002-08-12 21:25:05 +00001537 cerr << "[" << SparcFloatRegClass::getRegName(LR->getColor());
Chris Lattner37730942002-02-05 03:52:29 +00001538 if( LR->getType() == Type::DoubleTy)
Chris Lattner95685682002-08-12 21:25:05 +00001539 cerr << "+" << SparcFloatRegClass::getRegName(LR->getColor()+1);
Chris Lattner697954c2002-01-20 22:54:45 +00001540 cerr << "]\n";
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001541 }
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +00001542}
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001543
1544//---------------------------------------------------------------------------
1545// This method examines instructions inserted by RegAlloc code before a
1546// machine instruction to detect invalid orders that destroy values before
1547// they are used. If it detects such conditions, it reorders the instructions.
1548//
1549// The unordered instructions come in the UnordVec. These instructions are
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001550// instructions inserted by RegAlloc. All such instruction MUST have
1551// their USES BEFORE THE DEFS after reordering.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001552//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001553// The UnordVec & OrdVec must be DISTINCT. The OrdVec must be empty when
1554// this method is called.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001555//
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001556// This method uses two vectors for efficiency in accessing
Vikram S. Adve242a8082002-05-19 15:25:51 +00001557//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001558// Since instructions are inserted in RegAlloc, this assumes that the
1559// first operand is the source reg and the last operand is the dest reg.
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001560// It also does not consider operands that are both use and def.
Vikram S. Adve242a8082002-05-19 15:25:51 +00001561//
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001562// All the uses are before THE def to a register
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001563//---------------------------------------------------------------------------
Vikram S. Adve242a8082002-05-19 15:25:51 +00001564
1565void UltraSparcRegInfo::OrderAddedInstrns(std::vector<MachineInstr*> &UnordVec,
1566 std::vector<MachineInstr*> &OrdVec,
Chris Lattner697954c2002-01-20 22:54:45 +00001567 PhyRegAlloc &PRA) const{
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001568
1569 /*
1570 Problem: We can have instructions inserted by RegAlloc like
1571 1. add %ox %g0 %oy
1572 2. add %oy %g0 %oz, where z!=x or z==x
1573
1574 This is wrong since %oy used by 2 is overwritten by 1
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001575
1576 Solution:
1577 We re-order the instructions so that the uses are before the defs
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001578
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001579 Algorithm:
1580
1581 do
1582 for each instruction 'DefInst' in the UnOrdVec
1583 for each instruction 'UseInst' that follows the DefInst
1584 if the reg defined by DefInst is used by UseInst
1585 mark DefInst as not movable in this iteration
1586 If DefInst is not marked as not-movable, move DefInst to OrdVec
1587 while all instructions in DefInst are moved to OrdVec
1588
1589 For moving, we call the move2OrdVec(). It checks whether there is a def
1590 in it for the uses in the instruction to be added to OrdVec. If there
1591 are no preceding defs, it just appends the instruction. If there is a
1592 preceding def, it puts two instructions to save the reg on stack before
1593 the load and puts a restore at use.
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001594
1595 */
1596
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001597 bool CouldMoveAll;
1598 bool DebugPrint = false;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001599
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001600 do {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001601 CouldMoveAll = true;
Chris Lattner697954c2002-01-20 22:54:45 +00001602 std::vector<MachineInstr *>::iterator DefIt = UnordVec.begin();
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001603
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001604 for( ; DefIt != UnordVec.end(); ++DefIt ) {
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001605
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001606 // for each instruction in the UnordVec do ...
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001607
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001608 MachineInstr *DefInst = *DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001609
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001610 if( DefInst == NULL) continue;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001611
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001612 //cerr << "\nInst in UnordVec = " << *DefInst;
1613
1614 // last operand is the def (unless for a store which has no def reg)
1615 MachineOperand& DefOp = DefInst->getOperand(DefInst->getNumOperands()-1);
1616
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001617 if( DefOp.opIsDef() &&
1618 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001619
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001620 // If the operand in DefInst is a def ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001621
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001622 bool DefEqUse = false;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001623
Chris Lattner697954c2002-01-20 22:54:45 +00001624 std::vector<MachineInstr *>::iterator UseIt = DefIt;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001625 UseIt++;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001626
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001627 for( ; UseIt != UnordVec.end(); ++UseIt ) {
1628
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001629 MachineInstr *UseInst = *UseIt;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001630 if( UseInst == NULL) continue;
1631
1632 // for each inst (UseInst) that is below the DefInst do ...
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001633 MachineOperand& UseOp = UseInst->getOperand(0);
1634
1635 if( ! UseOp.opIsDef() &&
1636 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1637
1638 // if use is a register ...
1639
1640 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1641
1642 // if Def and this use are the same, it means that this use
1643 // is destroyed by a def before it is used
1644
1645 // cerr << "\nCouldn't move " << *DefInst;
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001646
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001647 DefEqUse = true;
1648 CouldMoveAll = false;
1649 DebugPrint = true;
1650 break;
1651 } // if two registers are equal
1652
1653 } // if use is a register
1654
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001655 }// for all use instructions
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001656
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001657 if( ! DefEqUse ) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001658
1659 // after examining all the instructions that follow the DefInst
1660 // if there are no dependencies, we can move it to the OrdVec
1661
1662 // cerr << "Moved to Ord: " << *DefInst;
1663
1664 moveInst2OrdVec(OrdVec, DefInst, PRA);
1665
1666 //OrdVec.push_back(DefInst);
1667
1668 // mark the pos of DefInst with NULL to indicate that it is
1669 // empty
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001670 *DefIt = NULL;
1671 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001672
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001673 } // if Def is a machine register
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001674
1675 } // for all instructions in the UnordVec
1676
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001677
Chris Lattner699683c2002-02-04 05:59:25 +00001678 } while(!CouldMoveAll);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001679
Chris Lattner44014412002-06-04 03:09:57 +00001680 if (DebugPrint && DEBUG_RA) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001681 cerr << "\nAdded instructions were reordered to:\n";
1682 for(unsigned int i=0; i < OrdVec.size(); i++)
1683 cerr << *(OrdVec[i]);
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001684 }
Ruchira Sasanka868cf822001-11-09 23:49:14 +00001685}
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001686
1687
1688
1689
1690
Chris Lattner697954c2002-01-20 22:54:45 +00001691void UltraSparcRegInfo::moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001692 MachineInstr *UnordInst,
Chris Lattner699683c2002-02-04 05:59:25 +00001693 PhyRegAlloc &PRA) const {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001694 MachineOperand& UseOp = UnordInst->getOperand(0);
1695
1696 if( ! UseOp.opIsDef() &&
1697 UseOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1698
1699 // for the use of UnordInst, see whether there is a defining instr
1700 // before in the OrdVec
1701 bool DefEqUse = false;
1702
Chris Lattner697954c2002-01-20 22:54:45 +00001703 std::vector<MachineInstr *>::iterator OrdIt = OrdVec.begin();
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001704
1705 for( ; OrdIt != OrdVec.end(); ++OrdIt ) {
1706
1707 MachineInstr *OrdInst = *OrdIt ;
1708
1709 MachineOperand& DefOp =
1710 OrdInst->getOperand(OrdInst->getNumOperands()-1);
1711
1712 if( DefOp.opIsDef() &&
1713 DefOp.getOperandType() == MachineOperand::MO_MachineRegister) {
1714
1715 //cerr << "\nDefining Ord Inst: " << *OrdInst;
1716
1717 if( DefOp.getMachineRegNum() == UseOp.getMachineRegNum() ) {
1718
1719 // we are here because there is a preceding def in the OrdVec
1720 // for the use in this intr we are going to insert. This
1721 // happened because the original code was like:
1722 // 1. add %ox %g0 %oy
1723 // 2. add %oy %g0 %ox
1724 // In Round1, we added 2 to OrdVec but 1 remained in UnordVec
1725 // Now we are processing %ox of 1.
1726 // We have to
1727
1728 const int UReg = DefOp.getMachineRegNum();
1729 const int RegType = getRegType(UReg);
1730 MachineInstr *AdIBef, *AdIAft;
1731
Ruchira Sasankad00982a2002-01-07 19:20:28 +00001732 const int StackOff = PRA.mcInfo.pushTempValue(target,
1733 getSpilledRegSize(RegType));
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001734
1735 // Save the UReg (%ox) on stack before it's destroyed
Vikram S. Adve242a8082002-05-19 15:25:51 +00001736 vector<MachineInstr*> mvec;
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001737 cpReg2MemMI(mvec, UReg, getFramePointer(), StackOff, RegType);
Vikram S. Adve242a8082002-05-19 15:25:51 +00001738 for (vector<MachineInstr*>::iterator MI=mvec.begin(); MI != mvec.end(); ++MI) {
1739 OrdIt = OrdVec.insert(OrdIt, *MI);
1740 ++OrdIt; // OrdIt must still point to current instr we processed
1741 }
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001742
1743 // Load directly into DReg (%oy)
1744 MachineOperand& DOp=
1745 (UnordInst->getOperand(UnordInst->getNumOperands()-1));
1746 assert(DOp.opIsDef() && "Last operand is not the def");
1747 const int DReg = DOp.getMachineRegNum();
1748
Vikram S. Adve76ee6f72002-07-08 23:23:12 +00001749 cpMem2RegMI(OrdVec, getFramePointer(), StackOff, DReg, RegType);
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001750
1751 cerr << "\nFixed CIRCULAR references by reordering";
1752
1753 if( DEBUG_RA ) {
1754 cerr << "\nBefore CIRCULAR Reordering:\n";
1755 cerr << *UnordInst;
1756 cerr << *OrdInst;
1757
1758 cerr << "\nAfter CIRCULAR Reordering - All Inst so far:\n";
1759 for(unsigned i=0; i < OrdVec.size(); i++)
1760 cerr << *(OrdVec[i]);
1761 }
1762
1763 // Do not copy the UseInst to OrdVec
1764 DefEqUse = true;
1765 break;
1766
1767 }// if two registers are equal
1768
1769 } // if Def is a register
1770
1771 } // for each instr in OrdVec
1772
Chris Lattner699683c2002-02-04 05:59:25 +00001773 if(!DefEqUse) {
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001774
1775 // We didn't find a def in the OrdVec, so just append this inst
1776 OrdVec.push_back( UnordInst );
1777 //cerr << "Reordered Inst (Moved Dn): " << *UnordInst;
1778 }
1779
1780 }// if the operand in UnordInst is a use
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +00001781}