blob: ccb52c2c981988424246466d957d8f53e826a227 [file] [log] [blame]
Vikram S. Adve70bc4b52001-07-21 12:41:50 +00001// $Id$
2//***************************************************************************
3// File:
4// MachineInstr.cpp
5//
6// Purpose:
7//
8//
9// Strategy:
10//
11// History:
12// 7/2/01 - Vikram Adve - Created
13//**************************************************************************/
14
Vikram S. Adve5b795912001-08-28 23:02:39 +000015
Chris Lattner822b4fb2001-09-07 17:18:30 +000016#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advebe495262001-11-08 04:47:06 +000017#include "llvm/Target/MachineFrameInfo.h"
Vikram S. Adve6e447182001-09-18 12:56:28 +000018#include "llvm/Target/MachineRegInfo.h"
Vikram S. Adve7c47c722001-11-15 15:22:26 +000019#include "llvm/Target/MachineCacheInfo.h"
Vikram S. Adve5b795912001-08-28 23:02:39 +000020#include "llvm/Method.h"
Vikram S. Advebe495262001-11-08 04:47:06 +000021#include "llvm/iOther.h"
Chris Lattner68498ce2001-07-21 23:24:48 +000022#include "llvm/Instruction.h"
Chris Lattner697954c2002-01-20 22:54:45 +000023#include <iostream>
24using std::cerr;
Vikram S. Adve5b795912001-08-28 23:02:39 +000025
Vikram S. Advebe495262001-11-08 04:47:06 +000026AnnotationID MachineCodeForMethod::AID(
27 AnnotationManager::getID("MachineCodeForMethodAnnotation"));
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000028
Ruchira Sasanka69917e22001-10-18 22:40:02 +000029
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000030//************************ Class Implementations **************************/
31
Vikram S. Adve1885da42001-07-31 21:49:28 +000032// Constructor for instructions with fixed #operands (nearly all)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000033MachineInstr::MachineInstr(MachineOpCode _opCode,
34 OpCodeMask _opCodeMask)
35 : opCode(_opCode),
36 opCodeMask(_opCodeMask),
Vikram S. Adve6a175e02001-07-28 04:06:37 +000037 operands(TargetInstrDescriptors[_opCode].numOperands)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000038{
Vikram S. Adve1885da42001-07-31 21:49:28 +000039 assert(TargetInstrDescriptors[_opCode].numOperands >= 0);
40}
41
42// Constructor for instructions with variable #operands
43MachineInstr::MachineInstr(MachineOpCode _opCode,
44 unsigned numOperands,
45 OpCodeMask _opCodeMask)
46 : opCode(_opCode),
47 opCodeMask(_opCodeMask),
48 operands(numOperands)
49{
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000050}
51
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000052void
53MachineInstr::SetMachineOperand(unsigned int i,
54 MachineOperand::MachineOperandType operandType,
Ruchira Sasanka45c171e2001-08-07 20:16:52 +000055 Value* _val, bool isdef=false)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000056{
Vikram S. Adve6a175e02001-07-28 04:06:37 +000057 assert(i < operands.size());
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000058 operands[i].Initialize(operandType, _val);
Vikram S. Adve149977b2001-08-13 16:32:45 +000059 operands[i].isDef = isdef ||
Vikram S. Adve6e447182001-09-18 12:56:28 +000060 TargetInstrDescriptors[opCode].resultPos == (int) i;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000061}
62
63void
64MachineInstr::SetMachineOperand(unsigned int i,
65 MachineOperand::MachineOperandType operandType,
Ruchira Sasanka45c171e2001-08-07 20:16:52 +000066 int64_t intValue, bool isdef=false)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000067{
Vikram S. Adve6a175e02001-07-28 04:06:37 +000068 assert(i < operands.size());
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000069 operands[i].InitializeConst(operandType, intValue);
Vikram S. Adve149977b2001-08-13 16:32:45 +000070 operands[i].isDef = isdef ||
Vikram S. Adve6e447182001-09-18 12:56:28 +000071 TargetInstrDescriptors[opCode].resultPos == (int) i;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000072}
73
74void
75MachineInstr::SetMachineOperand(unsigned int i,
Vikram S. Advedf1c3b82001-11-05 03:56:02 +000076 int regNum, bool isdef=false)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000077{
Vikram S. Adve6a175e02001-07-28 04:06:37 +000078 assert(i < operands.size());
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000079 operands[i].InitializeReg(regNum);
Vikram S. Adve149977b2001-08-13 16:32:45 +000080 operands[i].isDef = isdef ||
Vikram S. Adve6e447182001-09-18 12:56:28 +000081 TargetInstrDescriptors[opCode].resultPos == (int) i;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000082}
83
84void
Ruchira Sasanka0b03c6a2001-08-07 21:01:23 +000085MachineInstr::dump(unsigned int indent) const
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000086{
87 for (unsigned i=0; i < indent; i++)
Chris Lattner697954c2002-01-20 22:54:45 +000088 cerr << " ";
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000089
Chris Lattner697954c2002-01-20 22:54:45 +000090 cerr << *this;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000091}
92
Chris Lattner697954c2002-01-20 22:54:45 +000093std::ostream &operator<<(std::ostream& os, const MachineInstr& minstr)
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000094{
Vikram S. Adve6a175e02001-07-28 04:06:37 +000095 os << TargetInstrDescriptors[minstr.opCode].opCodeString;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000096
Ruchira Sasanka8d243372001-11-14 20:05:23 +000097 for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) {
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000098 os << "\t" << minstr.getOperand(i);
Ruchira Sasanka07c70862001-11-15 20:46:40 +000099 if( minstr.getOperand(i).opIsDef() )
100 os << "*";
Ruchira Sasanka8d243372001-11-14 20:05:23 +0000101 }
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000102
Vikram S. Adve6a175e02001-07-28 04:06:37 +0000103#undef DEBUG_VAL_OP_ITERATOR
104#ifdef DEBUG_VAL_OP_ITERATOR
Chris Lattner697954c2002-01-20 22:54:45 +0000105 os << "\n\tValue operands are: ";
Chris Lattner7a176752001-12-04 00:03:30 +0000106 for (MachineInstr::val_const_op_iterator vo(&minstr); ! vo.done(); ++vo)
Vikram S. Adve6a175e02001-07-28 04:06:37 +0000107 {
108 const Value* val = *vo;
109 os << val << (vo.isDef()? "(def), " : ", ");
110 }
Vikram S. Adve6a175e02001-07-28 04:06:37 +0000111#endif
112
Ruchira Sasanka69917e22001-10-18 22:40:02 +0000113
114
115#if 1
116 // code for printing implict references
117
118 unsigned NumOfImpRefs = minstr.getNumImplicitRefs();
119 if( NumOfImpRefs > 0 ) {
120
121 os << "\tImplicit:";
122
123 for(unsigned z=0; z < NumOfImpRefs; z++) {
124 os << minstr.getImplicitRef(z);
Ruchira Sasanka8d243372001-11-14 20:05:23 +0000125 if( minstr.implicitRefIsDefined(z)) os << "*";
Ruchira Sasanka07c70862001-11-15 20:46:40 +0000126 os << "\t";
Ruchira Sasanka69917e22001-10-18 22:40:02 +0000127 }
128 }
129
130#endif
Chris Lattner697954c2002-01-20 22:54:45 +0000131 return os << "\n";
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000132}
133
Chris Lattner697954c2002-01-20 22:54:45 +0000134static inline std::ostream &OutputOperand(std::ostream &os,
135 const MachineOperand &mop)
Vikram S. Adve6e447182001-09-18 12:56:28 +0000136{
Vikram S. Adved9beb972001-11-12 14:19:47 +0000137 Value* val;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000138 switch (mop.getOperandType())
139 {
140 case MachineOperand::MO_CCRegister:
141 case MachineOperand::MO_VirtualRegister:
Vikram S. Adved9beb972001-11-12 14:19:47 +0000142 val = mop.getVRegValue();
143 os << "(val ";
144 if (val && val->hasName())
Chris Lattner697954c2002-01-20 22:54:45 +0000145 os << val->getName();
Vikram S. Adved9beb972001-11-12 14:19:47 +0000146 else
147 os << val;
148 return os << ")";
Vikram S. Adve6e447182001-09-18 12:56:28 +0000149 case MachineOperand::MO_MachineRegister:
150 return os << "(" << mop.getMachineRegNum() << ")";
151 default:
152 assert(0 && "Unknown operand type");
153 return os;
154 }
Chris Lattnere6fdb112001-09-09 22:26:29 +0000155}
156
157
Chris Lattner697954c2002-01-20 22:54:45 +0000158std::ostream &operator<<(std::ostream &os, const MachineOperand &mop)
Vikram S. Adve6e447182001-09-18 12:56:28 +0000159{
160 switch(mop.opType)
161 {
162 case MachineOperand::MO_VirtualRegister:
163 case MachineOperand::MO_MachineRegister:
164 os << "%reg";
165 return OutputOperand(os, mop);
166 case MachineOperand::MO_CCRegister:
167 os << "%ccreg";
168 return OutputOperand(os, mop);
169 case MachineOperand::MO_SignExtendedImmed:
Chris Lattner697954c2002-01-20 22:54:45 +0000170 return os << (long)mop.immedVal;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000171 case MachineOperand::MO_UnextendedImmed:
Chris Lattner697954c2002-01-20 22:54:45 +0000172 return os << (long)mop.immedVal;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000173 case MachineOperand::MO_PCRelativeDisp:
Vikram S. Advee949da52001-09-30 23:44:19 +0000174 {
175 const Value* opVal = mop.getVRegValue();
Chris Lattner1d87bcf2001-10-01 20:11:19 +0000176 bool isLabel = isa<Method>(opVal) || isa<BasicBlock>(opVal);
Vikram S. Adved9beb972001-11-12 14:19:47 +0000177 os << "%disp(" << (isLabel? "label " : "addr-of-val ");
178 if (opVal->hasName())
Chris Lattner697954c2002-01-20 22:54:45 +0000179 os << opVal->getName();
Vikram S. Adved9beb972001-11-12 14:19:47 +0000180 else
181 os << opVal;
182 return os << ")";
Vikram S. Advee949da52001-09-30 23:44:19 +0000183 }
Vikram S. Adve6e447182001-09-18 12:56:28 +0000184 default:
185 assert(0 && "Unrecognized operand type");
186 break;
187 }
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000188
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000189 return os;
190}
191
Vikram S. Adve7c47c722001-11-15 15:22:26 +0000192// Align data larger than one L1 cache line on L1 cache line boundaries.
193// Align all smaller data on the next higher 2^x boundary (4, 8, ...).
194//
195// THIS FUNCTION HAS BEEN COPIED FROM EMITASSEMBLY.CPP AND
196// SHOULD BE USED DIRECTLY THERE
197//
198inline unsigned int
199SizeToAlignment(unsigned int size, const TargetMachine& target)
200{
201 unsigned short cacheLineSize = target.getCacheInfo().getCacheLineSize(1);
202 if (size > (unsigned) cacheLineSize / 2)
203 return cacheLineSize;
204 else
205 for (unsigned sz=1; /*no condition*/; sz *= 2)
206 if (sz >= size)
207 return sz;
208}
209
Vikram S. Advebe495262001-11-08 04:47:06 +0000210static unsigned int
211ComputeMaxOptionalArgsSize(const TargetMachine& target, const Method* method)
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000212{
Vikram S. Advebe495262001-11-08 04:47:06 +0000213 const MachineFrameInfo& frameInfo = target.getFrameInfo();
214
215 unsigned int maxSize = 0;
216
Chris Lattner7a176752001-12-04 00:03:30 +0000217 for (Method::const_inst_iterator I=method->inst_begin(),E=method->inst_end();
Vikram S. Advebe495262001-11-08 04:47:06 +0000218 I != E; ++I)
219 if ((*I)->getOpcode() == Instruction::Call)
220 {
221 CallInst* callInst = cast<CallInst>(*I);
222 unsigned int numOperands = callInst->getNumOperands() - 1;
Vikram S. Advef1a0a102001-11-11 21:23:33 +0000223 int numExtra = (int) numOperands - frameInfo.getNumFixedOutgoingArgs();
224 if (numExtra <= 0)
225 continue;
Vikram S. Advebe495262001-11-08 04:47:06 +0000226
227 unsigned int sizeForThisCall;
228 if (frameInfo.argsOnStackHaveFixedSize())
229 {
230 int argSize = frameInfo.getSizeOfEachArgOnStack();
231 sizeForThisCall = numExtra * (unsigned) argSize;
232 }
233 else
234 {
235 assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual arg sizes to compute MaxOptionalArgsSize");
236 sizeForThisCall = 0;
237 for (unsigned i=0; i < numOperands; ++i)
238 sizeForThisCall += target.findOptimalStorageSize(callInst->
239 getOperand(i)->getType());
240 }
241
242 if (maxSize < sizeForThisCall)
243 maxSize = sizeForThisCall;
244 }
245
246 return maxSize;
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000247}
248
249
Vikram S. Advebe495262001-11-08 04:47:06 +0000250/*ctor*/
251MachineCodeForMethod::MachineCodeForMethod(const Method* _M,
252 const TargetMachine& target)
253 : Annotation(AID),
254 method(_M), compiledAsLeaf(false), staticStackSize(0),
255 automaticVarsSize(0), regSpillsSize(0),
256 currentOptionalArgsSize(0), maxOptionalArgsSize(0),
257 currentTmpValuesSize(0)
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000258{
Vikram S. Advebe495262001-11-08 04:47:06 +0000259 maxOptionalArgsSize = ComputeMaxOptionalArgsSize(target, method);
260 staticStackSize = maxOptionalArgsSize +
261 target.getFrameInfo().getMinStackFrameSize();
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000262}
263
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000264int
Vikram S. Advebe495262001-11-08 04:47:06 +0000265MachineCodeForMethod::allocateLocalVar(const TargetMachine& target,
Vikram S. Adve7c47c722001-11-15 15:22:26 +0000266 const Value* val,
267 unsigned int size)
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000268{
Vikram S. Advebe495262001-11-08 04:47:06 +0000269 // Check if we've allocated a stack slot for this value already
270 //
271 int offset = getOffset(val);
272 if (offset == INVALID_FRAME_OFFSET)
273 {
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000274 bool growUp;
275 int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
276 growUp);
Vikram S. Adve7c47c722001-11-15 15:22:26 +0000277 unsigned char align;
278 if (size == 0)
279 {
280 size = target.findOptimalStorageSize(val->getType());
281 // align = target.DataLayout.getTypeAlignment(val->getType());
282 }
Vikram S. Adve5567e942001-11-12 05:17:23 +0000283
Vikram S. Adve7c47c722001-11-15 15:22:26 +0000284 align = SizeToAlignment(size, target);
285
Vikram S. Adve5567e942001-11-12 05:17:23 +0000286 offset = getAutomaticVarsSize();
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000287 if (! growUp)
288 offset += size;
289
Vikram S. Adve5567e942001-11-12 05:17:23 +0000290 if (unsigned int mod = offset % align)
291 {
292 offset += align - mod;
293 size += align - mod;
294 }
295
Vikram S. Adve5567e942001-11-12 05:17:23 +0000296 offset = growUp? firstOffset + offset
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000297 : firstOffset - offset;
Vikram S. Advef1a0a102001-11-11 21:23:33 +0000298
Vikram S. Advebe495262001-11-08 04:47:06 +0000299 offsets[val] = offset;
300
Vikram S. Advebe495262001-11-08 04:47:06 +0000301 incrementAutomaticVarsSize(size);
302 }
303 return offset;
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000304}
305
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000306int
Vikram S. Advebe495262001-11-08 04:47:06 +0000307MachineCodeForMethod::allocateSpilledValue(const TargetMachine& target,
308 const Type* type)
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000309{
Vikram S. Adve5567e942001-11-12 05:17:23 +0000310 unsigned int size = target.findOptimalStorageSize(type);
311 unsigned char align = target.DataLayout.getTypeAlignment(type);
312
Vikram S. Advebe495262001-11-08 04:47:06 +0000313 bool growUp;
314 int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp);
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000315
316 int offset = getRegSpillsSize();
317 if (! growUp)
318 offset += size;
319
320 if (unsigned int mod = offset % align)
321 {
322 offset += align - mod;
323 size += align - mod;
324 }
325
Vikram S. Adve5567e942001-11-12 05:17:23 +0000326 offset = growUp? firstOffset + offset
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000327 : firstOffset - offset;
Vikram S. Advef1a0a102001-11-11 21:23:33 +0000328
Vikram S. Advebe495262001-11-08 04:47:06 +0000329 incrementRegSpillsSize(size);
330
331 return offset;
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000332}
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000333
Vikram S. Advebe495262001-11-08 04:47:06 +0000334int
335MachineCodeForMethod::allocateOptionalArg(const TargetMachine& target,
336 const Type* type)
337{
338 const MachineFrameInfo& frameInfo = target.getFrameInfo();
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000339
Vikram S. Advebe495262001-11-08 04:47:06 +0000340 int size = MAXINT;
341 if (frameInfo.argsOnStackHaveFixedSize())
342 size = frameInfo.getSizeOfEachArgOnStack();
343 else
344 {
Vikram S. Advebe495262001-11-08 04:47:06 +0000345 size = target.findOptimalStorageSize(type);
Vikram S. Advef1a0a102001-11-11 21:23:33 +0000346 assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets");
Vikram S. Advebe495262001-11-08 04:47:06 +0000347 }
Vikram S. Adve5567e942001-11-12 05:17:23 +0000348 unsigned char align = target.DataLayout.getTypeAlignment(type);
Vikram S. Advebe495262001-11-08 04:47:06 +0000349
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000350 bool growUp;
351 int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp);
352
Vikram S. Adve5567e942001-11-12 05:17:23 +0000353 int offset = getCurrentOptionalArgsSize();
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000354 if (! growUp)
355 offset += size;
356
Vikram S. Adve5567e942001-11-12 05:17:23 +0000357 if (unsigned int mod = offset % align)
358 {
359 offset += align - mod;
360 size += align - mod;
361 }
362
Vikram S. Adve5567e942001-11-12 05:17:23 +0000363 offset = growUp? firstOffset + offset
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000364 : firstOffset - offset;
Vikram S. Adve5567e942001-11-12 05:17:23 +0000365
Vikram S. Advebe495262001-11-08 04:47:06 +0000366 incrementCurrentOptionalArgsSize(size);
367
368 return offset;
369}
370
371void
372MachineCodeForMethod::resetOptionalArgs(const TargetMachine& target)
373{
374 currentOptionalArgsSize = 0;
375}
376
377int
378MachineCodeForMethod::pushTempValue(const TargetMachine& target,
379 unsigned int size)
380{
Vikram S. Adve5567e942001-11-12 05:17:23 +0000381 // Compute a power-of-2 alignment according to the possible sizes,
382 // but not greater than the alignment of the largest type we support
383 // (currently a double word -- see class TargetData).
384 unsigned char align = 1;
385 for (; align < size && align < target.DataLayout.getDoubleAlignment();
386 align = 2*align)
387 ;
388
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000389 bool growUp;
390 int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp);
391
Vikram S. Adve5567e942001-11-12 05:17:23 +0000392 int offset = currentTmpValuesSize;
Vikram S. Advee492c9d2001-11-12 23:26:23 +0000393 if (! growUp)
394 offset += size;
395
Vikram S. Adve5567e942001-11-12 05:17:23 +0000396 if (unsigned int mod = offset % align)
397 {
398 offset += align - mod;
399 size += align - mod;
400 }
401
Chris Lattner697954c2002-01-20 22:54:45 +0000402 offset = growUp ? firstTmpOffset + offset : firstTmpOffset - offset;
Vikram S. Adve5567e942001-11-12 05:17:23 +0000403
Vikram S. Advebe495262001-11-08 04:47:06 +0000404 currentTmpValuesSize += size;
405 return offset;
406}
407
408void
409MachineCodeForMethod::popAllTempValues(const TargetMachine& target)
410{
411 currentTmpValuesSize = 0;
412}
413
Vikram S. Advebe495262001-11-08 04:47:06 +0000414int
415MachineCodeForMethod::getOffset(const Value* val) const
416{
Chris Lattner697954c2002-01-20 22:54:45 +0000417 std::hash_map<const Value*, int>::const_iterator pair = offsets.find(val);
418 return (pair == offsets.end())? INVALID_FRAME_OFFSET : pair->second;
Vikram S. Advebe495262001-11-08 04:47:06 +0000419}
420
Vikram S. Adve1d6158f2001-10-22 13:51:33 +0000421void
422MachineCodeForMethod::dump() const
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000423{
Chris Lattner697954c2002-01-20 22:54:45 +0000424 cerr << "\n" << method->getReturnType()
425 << " \"" << method->getName() << "\"\n";
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000426
427 for (Method::const_iterator BI = method->begin(); BI != method->end(); ++BI)
428 {
429 BasicBlock* bb = *BI;
Chris Lattner697954c2002-01-20 22:54:45 +0000430 cerr << "\n"
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000431 << (bb->hasName()? bb->getName() : "Label")
Chris Lattner697954c2002-01-20 22:54:45 +0000432 << " (" << bb << ")" << ":\n";
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000433
434 MachineCodeForBasicBlock& mvec = bb->getMachineInstrVec();
435 for (unsigned i=0; i < mvec.size(); i++)
Chris Lattner697954c2002-01-20 22:54:45 +0000436 cerr << "\t" << *mvec[i];
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000437 }
Chris Lattner697954c2002-01-20 22:54:45 +0000438 cerr << "\nEnd method \"" << method->getName() << "\"\n\n";
Ruchira Sasankaed8f6742001-09-15 19:07:45 +0000439}