blob: 32951769e00a20cd14bafa1d18ed3b9b926743a0 [file] [log] [blame]
Ruchira Sasanka8e604792001-09-14 21:18:34 +00001#include "llvm/CodeGen/LiveRangeInfo.h"
Chris Lattner0a8ed942002-02-04 05:56:09 +00002#include "llvm/CodeGen/RegClass.h"
3#include "llvm/CodeGen/MachineInstr.h"
4#include "llvm/Target/TargetMachine.h"
5#include "llvm/Method.h"
Chris Lattner221d6882002-02-12 21:07:25 +00006#include "llvm/BasicBlock.h"
Chris Lattner7471a7b2002-02-05 03:35:53 +00007#include "Support/SetOperations.h"
Chris Lattner697954c2002-01-20 22:54:45 +00008#include <iostream>
9using std::cerr;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000010
Chris Lattner2f898d22002-02-05 06:02:59 +000011LiveRangeInfo::LiveRangeInfo(const Method *M, const TargetMachine &tm,
Chris Lattner697954c2002-01-20 22:54:45 +000012 std::vector<RegClass *> &RCL)
Chris Lattner2f898d22002-02-05 06:02:59 +000013 : Meth(M), TM(tm), RegClassList(RCL), MRI(tm.getRegInfo()) { }
Ruchira Sasanka8e604792001-09-14 21:18:34 +000014
15
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000016LiveRangeInfo::~LiveRangeInfo() {
Chris Lattner2f898d22002-02-05 06:02:59 +000017 for (LiveRangeMapType::iterator MI = LiveRangeMap.begin();
18 MI != LiveRangeMap.end(); ++MI) {
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000019
Chris Lattner697954c2002-01-20 22:54:45 +000020 if (MI->first && MI->second) {
21 LiveRange *LR = MI->second;
22
23 // we need to be careful in deleting LiveRanges in LiveRangeMap
24 // since two/more Values in the live range map can point to the same
25 // live range. We have to make the other entries NULL when we delete
26 // a live range.
27
Chris Lattner2f898d22002-02-05 06:02:59 +000028 for(LiveRange::iterator LI = LR->begin(); LI != LR->end(); ++LI)
Chris Lattner697954c2002-01-20 22:54:45 +000029 LiveRangeMap[*LI] = 0;
30
31 delete LR;
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000032 }
33 }
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000034}
35
36
37//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000038// union two live ranges into one. The 2nd LR is deleted. Used for coalescing.
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000039// Note: the caller must make sure that L1 and L2 are distinct and both
40// LRs don't have suggested colors
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000041//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000042
Chris Lattner296b7732002-02-05 02:52:05 +000043void LiveRangeInfo::unionAndUpdateLRs(LiveRange *L1, LiveRange *L2) {
44 assert(L1 != L2 && (!L1->hasSuggestedColor() || !L2->hasSuggestedColor()));
45 set_union(*L1, *L2); // add elements of L2 to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000046
Chris Lattner296b7732002-02-05 02:52:05 +000047 for(ValueSet::iterator L2It = L2->begin(); L2It != L2->end(); ++L2It) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +000048 //assert(( L1->getTypeID() == L2->getTypeID()) && "Merge:Different types");
49
Chris Lattner30adeb62002-02-04 16:36:59 +000050 L1->insert(*L2It); // add the var in L2 to L1
Chris Lattner296b7732002-02-05 02:52:05 +000051 LiveRangeMap[*L2It] = L1; // now the elements in L2 should map
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000052 //to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000053 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000054
55
56 // Now if LROfDef(L1) has a suggested color, it will remain.
57 // But, if LROfUse(L2) has a suggested color, the new range
58 // must have the same color.
59
60 if(L2->hasSuggestedColor())
Chris Lattner296b7732002-02-05 02:52:05 +000061 L1->setSuggestedColor(L2->getSuggestedColor());
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000062
Ruchira Sasanka958faf32001-10-19 17:21:03 +000063
Chris Lattner296b7732002-02-05 02:52:05 +000064 if (L2->isCallInterference())
Ruchira Sasanka958faf32001-10-19 17:21:03 +000065 L1->setCallInterference();
66
Chris Lattner296b7732002-02-05 02:52:05 +000067 // add the spill costs
68 L1->addSpillCost(L2->getSpillCost());
69
Chris Lattner697954c2002-01-20 22:54:45 +000070 delete L2; // delete L2 as it is no longer needed
Ruchira Sasanka8e604792001-09-14 21:18:34 +000071}
72
73
74
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000075//---------------------------------------------------------------------------
76// Method for constructing all live ranges in a method. It creates live
77// ranges for all values defined in the instruction stream. Also, it
78// creates live ranges for all incoming arguments of the method.
79//---------------------------------------------------------------------------
Chris Lattner2f898d22002-02-05 06:02:59 +000080void LiveRangeInfo::constructLiveRanges() {
Ruchira Sasanka8e604792001-09-14 21:18:34 +000081
Chris Lattner2f898d22002-02-05 06:02:59 +000082 if (DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +000083 cerr << "Consturcting Live Ranges ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +000084
85 // first find the live ranges for all incoming args of the method since
86 // those LRs start from the start of the method
87
88 // get the argument list
89 const Method::ArgumentListType& ArgList = Meth->getArgumentList();
90 // get an iterator to arg list
91 Method::ArgumentListType::const_iterator ArgIt = ArgList.begin();
92
93
94 for( ; ArgIt != ArgList.end() ; ++ArgIt) { // for each argument
Ruchira Sasanka8e604792001-09-14 21:18:34 +000095 LiveRange * ArgRange = new LiveRange(); // creates a new LR and
Chris Lattner30adeb62002-02-04 16:36:59 +000096 const Value *Val = (const Value *) *ArgIt;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000097
Chris Lattner30adeb62002-02-04 16:36:59 +000098 ArgRange->insert(Val); // add the arg (def) to it
Chris Lattner697954c2002-01-20 22:54:45 +000099 LiveRangeMap[Val] = ArgRange;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000100
101 // create a temp machine op to find the register class of value
102 //const MachineOperand Op(MachineOperand::MO_VirtualRegister);
103
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000104 unsigned rcid = MRI.getRegClassIDOfValue( Val );
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000105 ArgRange->setRegClass(RegClassList[ rcid ] );
106
107
108 if( DEBUG_RA > 1) {
Chris Lattner0665a5f2002-02-05 01:43:49 +0000109 cerr << " adding LiveRange for argument "
110 << RAV((const Value *)*ArgIt) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000111 }
112 }
113
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000114 // Now suggest hardware registers for these method args
115 MRI.suggestRegs4MethodArgs(Meth, *this);
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000116
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000117
118
119 // Now find speical LLVM instructions (CALL, RET) and LRs in machine
120 // instructions.
Chris Lattner2f898d22002-02-05 06:02:59 +0000121 //
122 for (Method::const_iterator BBI = Meth->begin(); BBI != Meth->end(); ++BBI) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000123 // Now find all LRs for machine the instructions. A new LR will be created
124 // only for defs in the machine instr since, we assume that all Values are
125 // defined before they are used. However, there can be multiple defs for
126 // the same Value in machine instructions.
127
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000128 // get the iterator for machine instructions
129 const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000130
131 // iterate over all the machine instructions in BB
Chris Lattner2f898d22002-02-05 06:02:59 +0000132 for(MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
133 MInstIterator != MIVec.end(); ++MInstIterator) {
134 const MachineInstr *MInst = *MInstIterator;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000135
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000136 // Now if the machine instruction is a call/return instruction,
137 // add it to CallRetInstrList for processing its implicit operands
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000138
Chris Lattner697954c2002-01-20 22:54:45 +0000139 if(TM.getInstrInfo().isReturn(MInst->getOpCode()) ||
140 TM.getInstrInfo().isCall(MInst->getOpCode()))
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000141 CallRetInstrList.push_back( MInst );
142
143
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000144 // iterate over MI operands to find defs
Chris Lattner2f898d22002-02-05 06:02:59 +0000145 for (MachineInstr::const_val_op_iterator OpI = MInst->begin(),
146 OpE = MInst->end(); OpI != OpE; ++OpI) {
Chris Lattner697954c2002-01-20 22:54:45 +0000147 if(DEBUG_RA) {
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000148 MachineOperand::MachineOperandType OpTyp =
149 OpI.getMachineOperand().getOperandType();
Ruchira Sasankae727f852001-09-18 22:43:57 +0000150
Chris Lattner0665a5f2002-02-05 01:43:49 +0000151 if (OpTyp == MachineOperand::MO_CCRegister)
152 cerr << "\n**CC reg found. Is Def=" << OpI.isDef() << " Val:"
153 << RAV(OpI.getMachineOperand().getVRegValue()) << "\n";
Ruchira Sasankae727f852001-09-18 22:43:57 +0000154 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000155
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000156 // create a new LR iff this operand is a def
Chris Lattner30adeb62002-02-04 16:36:59 +0000157 if (OpI.isDef()) {
158 const Value *Def = *OpI;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000159
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000160 // Only instruction values are accepted for live ranges here
Chris Lattner0665a5f2002-02-05 01:43:49 +0000161 if (Def->getValueType() != Value::InstructionVal ) {
162 cerr << "\n**%%Error: Def is not an instruction val. Def="
163 << RAV(Def) << "\n";
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000164 continue;
165 }
166
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000167 LiveRange *DefRange = LiveRangeMap[Def];
168
169 // see LR already there (because of multiple defs)
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000170 if( !DefRange) { // if it is not in LiveRangeMap
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000171 DefRange = new LiveRange(); // creates a new live range and
Chris Lattner30adeb62002-02-04 16:36:59 +0000172 DefRange->insert(Def); // add the instruction (def) to it
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000173 LiveRangeMap[ Def ] = DefRange; // update the map
174
Chris Lattner0665a5f2002-02-05 01:43:49 +0000175 if (DEBUG_RA > 1)
176 cerr << " creating a LR for def: " << RAV(Def) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000177
178 // set the register class of the new live range
179 //assert( RegClassList.size() );
180 MachineOperand::MachineOperandType OpTy =
181 OpI.getMachineOperand().getOperandType();
182
183 bool isCC = ( OpTy == MachineOperand::MO_CCRegister);
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000184 unsigned rcid = MRI.getRegClassIDOfValue(
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000185 OpI.getMachineOperand().getVRegValue(), isCC );
186
187
Chris Lattner0665a5f2002-02-05 01:43:49 +0000188 if (isCC && DEBUG_RA)
189 cerr << "\a**created a LR for a CC reg:"
190 << RAV(OpI.getMachineOperand().getVRegValue());
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000191
Chris Lattner0665a5f2002-02-05 01:43:49 +0000192 DefRange->setRegClass(RegClassList[rcid]);
193 } else {
Chris Lattner30adeb62002-02-04 16:36:59 +0000194 DefRange->insert(Def); // add the opearand to def range
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000195 // update the map - Operand points
196 // to the merged set
Chris Lattner0665a5f2002-02-05 01:43:49 +0000197 LiveRangeMap[Def] = DefRange;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000198
Chris Lattner0665a5f2002-02-05 01:43:49 +0000199 if (DEBUG_RA > 1)
200 cerr << " added to an existing LR for def: "
201 << RAV(Def) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000202 }
203
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000204 } // if isDef()
205
206 } // for all opereands in machine instructions
207
208 } // for all machine instructions in the BB
209
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000210 } // for all BBs in method
211
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000212
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000213 // Now we have to suggest clors for call and return arg live ranges.
214 // Also, if there are implicit defs (e.g., retun value of a call inst)
215 // they must be added to the live range list
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000216
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000217 suggestRegs4CallRets();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000218
219 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000220 cerr << "Initial Live Ranges constructed!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000221
222}
223
224
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000225//---------------------------------------------------------------------------
226// If some live ranges must be colored with specific hardware registers
227// (e.g., for outgoing call args), suggesting of colors for such live
228// ranges is done using target specific method. Those methods are called
229// from this function. The target specific methods must:
230// 1) suggest colors for call and return args.
231// 2) create new LRs for implicit defs in machine instructions
232//---------------------------------------------------------------------------
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000233void LiveRangeInfo::suggestRegs4CallRets()
234{
235
236 CallRetInstrListType::const_iterator It = CallRetInstrList.begin();
237
238 for( ; It != CallRetInstrList.end(); ++It ) {
239
240 const MachineInstr *MInst = *It;
241 MachineOpCode OpCode = MInst->getOpCode();
242
243 if( (TM.getInstrInfo()).isReturn(OpCode) )
244 MRI.suggestReg4RetValue( MInst, *this);
245
246 else if( (TM.getInstrInfo()).isCall( OpCode ) )
247 MRI.suggestRegs4CallArgs( MInst, *this, RegClassList );
248
249 else
250 assert( 0 && "Non call/ret instr in CallRetInstrList" );
251 }
252
253}
254
255
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000256//--------------------------------------------------------------------------
257// The following method coalesces live ranges when possible. This method
258// must be called after the interference graph has been constructed.
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000259
260
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000261/* Algorithm:
262 for each BB in method
263 for each machine instruction (inst)
264 for each definition (def) in inst
265 for each operand (op) of inst that is a use
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000266 if the def and op are of the same register type
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000267 if the def and op do not interfere //i.e., not simultaneously live
268 if (degree(LR of def) + degree(LR of op)) <= # avail regs
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000269 if both LRs do not have suggested colors
270 merge2IGNodes(def, op) // i.e., merge 2 LRs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000271
272*/
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000273//---------------------------------------------------------------------------
274void LiveRangeInfo::coalesceLRs()
275{
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000276 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000277 cerr << "\nCoalscing LRs ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000278
279 Method::const_iterator BBI = Meth->begin(); // random iterator for BBs
280
281 for( ; BBI != Meth->end(); ++BBI) { // traverse BBs in random order
282
283 // get the iterator for machine instructions
284 const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
Chris Lattner697954c2002-01-20 22:54:45 +0000285 MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000286
287 // iterate over all the machine instructions in BB
288 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
289
290 const MachineInstr * MInst = *MInstIterator;
291
292 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000293 cerr << " *Iterating over machine instr ";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000294 MInst->dump();
Chris Lattner697954c2002-01-20 22:54:45 +0000295 cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000296 }
297
298
299 // iterate over MI operands to find defs
Chris Lattner2f898d22002-02-05 06:02:59 +0000300 for(MachineInstr::const_val_op_iterator DefI = MInst->begin(),
301 DefE = MInst->end(); DefI != DefE; ++DefI) {
302 if (DefI.isDef()) { // iff this operand is a def
303 LiveRange *LROfDef = getLiveRangeForValue( *DefI );
304 RegClass *RCOfDef = LROfDef->getRegClass();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000305
Chris Lattner2f898d22002-02-05 06:02:59 +0000306 MachineInstr::const_val_op_iterator UseI = MInst->begin(),
307 UseE = MInst->end();
308 for( ; UseI != UseE; ++UseI){ // for all uses
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000309
Chris Lattner2f898d22002-02-05 06:02:59 +0000310 LiveRange *LROfUse = getLiveRangeForValue( *UseI );
311 if (!LROfUse) { // if LR of use is not found
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000312 //don't warn about labels
Chris Lattner37730942002-02-05 03:52:29 +0000313 if (!isa<BasicBlock>(*UseI) && DEBUG_RA)
Chris Lattner0665a5f2002-02-05 01:43:49 +0000314 cerr << " !! Warning: No LR for use " << RAV(*UseI) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000315 continue; // ignore and continue
316 }
317
Chris Lattner2f898d22002-02-05 06:02:59 +0000318 if (LROfUse == LROfDef) // nothing to merge if they are same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000319 continue;
320
Chris Lattner37730942002-02-05 03:52:29 +0000321 if (MRI.getRegType(LROfDef) == MRI.getRegType(LROfUse)) {
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000322
323 // If the two RegTypes are the same
Chris Lattner37730942002-02-05 03:52:29 +0000324 if (!RCOfDef->getInterference(LROfDef, LROfUse) ) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000325
326 unsigned CombinedDegree =
327 LROfDef->getUserIGNode()->getNumOfNeighbors() +
328 LROfUse->getUserIGNode()->getNumOfNeighbors();
329
Chris Lattner37730942002-02-05 03:52:29 +0000330 if (CombinedDegree <= RCOfDef->getNumOfAvailRegs()) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000331 // if both LRs do not have suggested colors
Chris Lattner37730942002-02-05 03:52:29 +0000332 if (!(LROfDef->hasSuggestedColor() &&
333 LROfUse->hasSuggestedColor())) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000334
335 RCOfDef->mergeIGNodesOfLRs(LROfDef, LROfUse);
336 unionAndUpdateLRs(LROfDef, LROfUse);
337 }
338
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000339 } // if combined degree is less than # of regs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000340 } // if def and use do not interfere
Ruchira Sasankad33238b2001-10-12 17:48:18 +0000341 }// if reg classes are the same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000342 } // for all uses
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000343 } // if def
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000344 } // for all defs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000345 } // for all machine instructions
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000346 } // for all BBs
347
Chris Lattner2f898d22002-02-05 06:02:59 +0000348 if (DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000349 cerr << "\nCoalscing Done!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000350}
351
352
353
354
355
356/*--------------------------- Debug code for printing ---------------*/
357
358
Chris Lattner0665a5f2002-02-05 01:43:49 +0000359void LiveRangeInfo::printLiveRanges() {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000360 LiveRangeMapType::iterator HMI = LiveRangeMap.begin(); // hash map iterator
Chris Lattner697954c2002-01-20 22:54:45 +0000361 cerr << "\nPrinting Live Ranges from Hash Map:\n";
Chris Lattner0665a5f2002-02-05 01:43:49 +0000362 for( ; HMI != LiveRangeMap.end(); ++HMI) {
363 if (HMI->first && HMI->second) {
364 cerr << " " << RAV(HMI->first) << "\t: ";
Chris Lattner296b7732002-02-05 02:52:05 +0000365 printSet(*HMI->second); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000366 }
367 }
368}