blob: 6a992b1ee354ca8614070aaf798342e025d3c601 [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"
Vikram S. Advec9a0ca52002-07-08 23:07:26 +00004#include "llvm/CodeGen/MachineCodeForBasicBlock.h"
Chris Lattner0a8ed942002-02-04 05:56:09 +00005#include "llvm/Target/TargetMachine.h"
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00006#include "llvm/Function.h"
Chris Lattner221d6882002-02-12 21:07:25 +00007#include "llvm/BasicBlock.h"
Chris Lattner7471a7b2002-02-05 03:35:53 +00008#include "Support/SetOperations.h"
Chris Lattnerc6f3ae52002-04-29 17:42:12 +00009#include "llvm/CodeGen/RegAllocCommon.h"
Chris Lattner697954c2002-01-20 22:54:45 +000010using std::cerr;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000011
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000012LiveRangeInfo::LiveRangeInfo(const Function *F, const TargetMachine &tm,
Chris Lattner697954c2002-01-20 22:54:45 +000013 std::vector<RegClass *> &RCL)
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000014 : Meth(F), TM(tm), RegClassList(RCL), MRI(tm.getRegInfo()) { }
Ruchira Sasanka8e604792001-09-14 21:18:34 +000015
16
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000017LiveRangeInfo::~LiveRangeInfo() {
Chris Lattner2f898d22002-02-05 06:02:59 +000018 for (LiveRangeMapType::iterator MI = LiveRangeMap.begin();
19 MI != LiveRangeMap.end(); ++MI) {
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000020
Chris Lattner697954c2002-01-20 22:54:45 +000021 if (MI->first && MI->second) {
22 LiveRange *LR = MI->second;
23
24 // we need to be careful in deleting LiveRanges in LiveRangeMap
25 // since two/more Values in the live range map can point to the same
26 // live range. We have to make the other entries NULL when we delete
27 // a live range.
28
Chris Lattner2f898d22002-02-05 06:02:59 +000029 for(LiveRange::iterator LI = LR->begin(); LI != LR->end(); ++LI)
Chris Lattner697954c2002-01-20 22:54:45 +000030 LiveRangeMap[*LI] = 0;
31
32 delete LR;
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000033 }
34 }
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000035}
36
37
38//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000039// union two live ranges into one. The 2nd LR is deleted. Used for coalescing.
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000040// Note: the caller must make sure that L1 and L2 are distinct and both
41// LRs don't have suggested colors
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000042//---------------------------------------------------------------------------
Ruchira Sasanka8e604792001-09-14 21:18:34 +000043
Chris Lattner296b7732002-02-05 02:52:05 +000044void LiveRangeInfo::unionAndUpdateLRs(LiveRange *L1, LiveRange *L2) {
45 assert(L1 != L2 && (!L1->hasSuggestedColor() || !L2->hasSuggestedColor()));
46 set_union(*L1, *L2); // add elements of L2 to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000047
Chris Lattner296b7732002-02-05 02:52:05 +000048 for(ValueSet::iterator L2It = L2->begin(); L2It != L2->end(); ++L2It) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +000049 //assert(( L1->getTypeID() == L2->getTypeID()) && "Merge:Different types");
50
Chris Lattner30adeb62002-02-04 16:36:59 +000051 L1->insert(*L2It); // add the var in L2 to L1
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000052 LiveRangeMap[*L2It] = L1; // now the elements in L2 should map
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000053 //to L1
Ruchira Sasanka8e604792001-09-14 21:18:34 +000054 }
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000055
56
57 // Now if LROfDef(L1) has a suggested color, it will remain.
58 // But, if LROfUse(L2) has a suggested color, the new range
59 // must have the same color.
60
61 if(L2->hasSuggestedColor())
Chris Lattner296b7732002-02-05 02:52:05 +000062 L1->setSuggestedColor(L2->getSuggestedColor());
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +000063
Ruchira Sasanka958faf32001-10-19 17:21:03 +000064
Chris Lattner296b7732002-02-05 02:52:05 +000065 if (L2->isCallInterference())
Ruchira Sasanka958faf32001-10-19 17:21:03 +000066 L1->setCallInterference();
67
Chris Lattner296b7732002-02-05 02:52:05 +000068 // add the spill costs
69 L1->addSpillCost(L2->getSpillCost());
70
Chris Lattner697954c2002-01-20 22:54:45 +000071 delete L2; // delete L2 as it is no longer needed
Ruchira Sasanka8e604792001-09-14 21:18:34 +000072}
73
74
75
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000076//---------------------------------------------------------------------------
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000077// Method for constructing all live ranges in a function. It creates live
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000078// ranges for all values defined in the instruction stream. Also, it
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000079// creates live ranges for all incoming arguments of the function.
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +000080//---------------------------------------------------------------------------
Chris Lattner2f898d22002-02-05 06:02:59 +000081void LiveRangeInfo::constructLiveRanges() {
Ruchira Sasanka8e604792001-09-14 21:18:34 +000082
Chris Lattner2f898d22002-02-05 06:02:59 +000083 if (DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +000084 cerr << "Consturcting Live Ranges ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +000085
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000086 // first find the live ranges for all incoming args of the function since
87 // those LRs start from the start of the function
Chris Lattner7e708292002-06-25 16:13:24 +000088 for (Function::const_aiterator AI = Meth->abegin(); AI != Meth->aend(); ++AI){
89 LiveRange *ArgRange = new LiveRange(); // creates a new LR and
90 ArgRange->insert(AI); // add the arg (def) to it
91 LiveRangeMap[AI] = ArgRange;
Ruchira Sasanka8e604792001-09-14 21:18:34 +000092
93 // create a temp machine op to find the register class of value
94 //const MachineOperand Op(MachineOperand::MO_VirtualRegister);
95
Chris Lattner7e708292002-06-25 16:13:24 +000096 unsigned rcid = MRI.getRegClassIDOfValue(AI);
97 ArgRange->setRegClass(RegClassList[rcid]);
Ruchira Sasanka8e604792001-09-14 21:18:34 +000098
99
Chris Lattner7e708292002-06-25 16:13:24 +0000100 if( DEBUG_RA > 1)
101 cerr << " adding LiveRange for argument " << RAV(AI) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000102 }
103
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000104 // Now suggest hardware registers for these function args
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000105 MRI.suggestRegs4MethodArgs(Meth, *this);
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000106
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000107
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000108 // Now find speical LLVM instructions (CALL, RET) and LRs in machine
109 // instructions.
Chris Lattner2f898d22002-02-05 06:02:59 +0000110 //
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000111 for (Function::const_iterator BBI=Meth->begin(); BBI != Meth->end(); ++BBI){
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000112 // Now find all LRs for machine the instructions. A new LR will be created
113 // only for defs in the machine instr since, we assume that all Values are
114 // defined before they are used. However, there can be multiple defs for
115 // the same Value in machine instructions.
116
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000117 // get the iterator for machine instructions
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000118 MachineCodeForBasicBlock& MIVec = MachineCodeForBasicBlock::get(BBI);
119
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000120 // iterate over all the machine instructions in BB
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000121 for(MachineCodeForBasicBlock::iterator MInstIterator = MIVec.begin();
Chris Lattner2f898d22002-02-05 06:02:59 +0000122 MInstIterator != MIVec.end(); ++MInstIterator) {
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000123 MachineInstr *MInst = *MInstIterator;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000124
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000125 // Now if the machine instruction is a call/return instruction,
126 // add it to CallRetInstrList for processing its implicit operands
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000127
Chris Lattner697954c2002-01-20 22:54:45 +0000128 if(TM.getInstrInfo().isReturn(MInst->getOpCode()) ||
129 TM.getInstrInfo().isCall(MInst->getOpCode()))
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000130 CallRetInstrList.push_back( MInst );
131
132
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000133 // iterate over MI operands to find defs
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000134 for (MachineInstr::val_op_iterator OpI = MInst->begin(),
Chris Lattner2f898d22002-02-05 06:02:59 +0000135 OpE = MInst->end(); OpI != OpE; ++OpI) {
Chris Lattner697954c2002-01-20 22:54:45 +0000136 if(DEBUG_RA) {
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000137 MachineOperand::MachineOperandType OpTyp =
138 OpI.getMachineOperand().getOperandType();
Ruchira Sasankae727f852001-09-18 22:43:57 +0000139
Chris Lattner0665a5f2002-02-05 01:43:49 +0000140 if (OpTyp == MachineOperand::MO_CCRegister)
141 cerr << "\n**CC reg found. Is Def=" << OpI.isDef() << " Val:"
142 << RAV(OpI.getMachineOperand().getVRegValue()) << "\n";
Ruchira Sasankae727f852001-09-18 22:43:57 +0000143 }
Ruchira Sasankae727f852001-09-18 22:43:57 +0000144
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000145 // create a new LR iff this operand is a def
Chris Lattner30adeb62002-02-04 16:36:59 +0000146 if (OpI.isDef()) {
147 const Value *Def = *OpI;
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000148
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000149 // Only instruction values are accepted for live ranges here
Chris Lattner0665a5f2002-02-05 01:43:49 +0000150 if (Def->getValueType() != Value::InstructionVal ) {
151 cerr << "\n**%%Error: Def is not an instruction val. Def="
152 << RAV(Def) << "\n";
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000153 continue;
154 }
155
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000156 LiveRange *DefRange = LiveRangeMap[Def];
157
158 // see LR already there (because of multiple defs)
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000159 if( !DefRange) { // if it is not in LiveRangeMap
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000160 DefRange = new LiveRange(); // creates a new live range and
Chris Lattner30adeb62002-02-04 16:36:59 +0000161 DefRange->insert(Def); // add the instruction (def) to it
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000162 LiveRangeMap[ Def ] = DefRange; // update the map
163
Chris Lattner0665a5f2002-02-05 01:43:49 +0000164 if (DEBUG_RA > 1)
165 cerr << " creating a LR for def: " << RAV(Def) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000166
167 // set the register class of the new live range
168 //assert( RegClassList.size() );
169 MachineOperand::MachineOperandType OpTy =
170 OpI.getMachineOperand().getOperandType();
171
172 bool isCC = ( OpTy == MachineOperand::MO_CCRegister);
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000173 unsigned rcid = MRI.getRegClassIDOfValue(
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000174 OpI.getMachineOperand().getVRegValue(), isCC );
175
176
Chris Lattner0665a5f2002-02-05 01:43:49 +0000177 if (isCC && DEBUG_RA)
178 cerr << "\a**created a LR for a CC reg:"
179 << RAV(OpI.getMachineOperand().getVRegValue());
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000180
Chris Lattner0665a5f2002-02-05 01:43:49 +0000181 DefRange->setRegClass(RegClassList[rcid]);
182 } else {
Chris Lattner30adeb62002-02-04 16:36:59 +0000183 DefRange->insert(Def); // add the opearand to def range
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000184 // update the map - Operand points
185 // to the merged set
Chris Lattner0665a5f2002-02-05 01:43:49 +0000186 LiveRangeMap[Def] = DefRange;
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000187
Chris Lattner0665a5f2002-02-05 01:43:49 +0000188 if (DEBUG_RA > 1)
189 cerr << " added to an existing LR for def: "
190 << RAV(Def) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000191 }
192
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000193 } // if isDef()
194
195 } // for all opereands in machine instructions
196
197 } // for all machine instructions in the BB
198
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000199 } // for all BBs in function
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000200
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000201
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000202 // Now we have to suggest clors for call and return arg live ranges.
203 // Also, if there are implicit defs (e.g., retun value of a call inst)
204 // they must be added to the live range list
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000205
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000206 suggestRegs4CallRets();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000207
208 if( DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000209 cerr << "Initial Live Ranges constructed!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000210
211}
212
213
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000214//---------------------------------------------------------------------------
215// If some live ranges must be colored with specific hardware registers
216// (e.g., for outgoing call args), suggesting of colors for such live
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000217// ranges is done using target specific function. Those functions are called
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000218// from this function. The target specific methods must:
219// 1) suggest colors for call and return args.
220// 2) create new LRs for implicit defs in machine instructions
221//---------------------------------------------------------------------------
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000222void LiveRangeInfo::suggestRegs4CallRets()
223{
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000224 CallRetInstrListType::iterator It = CallRetInstrList.begin();
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000225 for( ; It != CallRetInstrList.end(); ++It ) {
226
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000227 MachineInstr *MInst = *It;
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000228 MachineOpCode OpCode = MInst->getOpCode();
229
230 if( (TM.getInstrInfo()).isReturn(OpCode) )
231 MRI.suggestReg4RetValue( MInst, *this);
232
233 else if( (TM.getInstrInfo()).isCall( OpCode ) )
234 MRI.suggestRegs4CallArgs( MInst, *this, RegClassList );
235
236 else
237 assert( 0 && "Non call/ret instr in CallRetInstrList" );
238 }
239
240}
241
242
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000243//--------------------------------------------------------------------------
244// The following method coalesces live ranges when possible. This method
245// must be called after the interference graph has been constructed.
Ruchira Sasankaa90e7702001-10-15 16:26:38 +0000246
247
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000248/* Algorithm:
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000249 for each BB in function
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000250 for each machine instruction (inst)
251 for each definition (def) in inst
252 for each operand (op) of inst that is a use
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000253 if the def and op are of the same register type
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000254 if the def and op do not interfere //i.e., not simultaneously live
255 if (degree(LR of def) + degree(LR of op)) <= # avail regs
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000256 if both LRs do not have suggested colors
257 merge2IGNodes(def, op) // i.e., merge 2 LRs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000258
259*/
Ruchira Sasanka4f3eb222002-01-07 19:19:18 +0000260//---------------------------------------------------------------------------
261void LiveRangeInfo::coalesceLRs()
262{
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000263 if(DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000264 cerr << "\nCoalscing LRs ...\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000265
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000266 for(Function::const_iterator BBI = Meth->begin(), BBE = Meth->end();
267 BBI != BBE; ++BBI) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000268
269 // get the iterator for machine instructions
Vikram S. Advec9a0ca52002-07-08 23:07:26 +0000270 const MachineCodeForBasicBlock& MIVec = MachineCodeForBasicBlock::get(BBI);
Chris Lattner697954c2002-01-20 22:54:45 +0000271 MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000272
273 // iterate over all the machine instructions in BB
274 for( ; MInstIterator != MIVec.end(); ++MInstIterator) {
275
276 const MachineInstr * MInst = *MInstIterator;
277
278 if( DEBUG_RA > 1) {
Chris Lattner697954c2002-01-20 22:54:45 +0000279 cerr << " *Iterating over machine instr ";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000280 MInst->dump();
Chris Lattner697954c2002-01-20 22:54:45 +0000281 cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000282 }
283
284
285 // iterate over MI operands to find defs
Chris Lattner2f898d22002-02-05 06:02:59 +0000286 for(MachineInstr::const_val_op_iterator DefI = MInst->begin(),
287 DefE = MInst->end(); DefI != DefE; ++DefI) {
288 if (DefI.isDef()) { // iff this operand is a def
289 LiveRange *LROfDef = getLiveRangeForValue( *DefI );
290 RegClass *RCOfDef = LROfDef->getRegClass();
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000291
Chris Lattner2f898d22002-02-05 06:02:59 +0000292 MachineInstr::const_val_op_iterator UseI = MInst->begin(),
293 UseE = MInst->end();
294 for( ; UseI != UseE; ++UseI){ // for all uses
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000295
Chris Lattner2f898d22002-02-05 06:02:59 +0000296 LiveRange *LROfUse = getLiveRangeForValue( *UseI );
297 if (!LROfUse) { // if LR of use is not found
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000298 //don't warn about labels
Chris Lattner37730942002-02-05 03:52:29 +0000299 if (!isa<BasicBlock>(*UseI) && DEBUG_RA)
Chris Lattner0665a5f2002-02-05 01:43:49 +0000300 cerr << " !! Warning: No LR for use " << RAV(*UseI) << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000301 continue; // ignore and continue
302 }
303
Chris Lattner2f898d22002-02-05 06:02:59 +0000304 if (LROfUse == LROfDef) // nothing to merge if they are same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000305 continue;
306
Chris Lattner37730942002-02-05 03:52:29 +0000307 if (MRI.getRegType(LROfDef) == MRI.getRegType(LROfUse)) {
Ruchira Sasankaefaf9be2001-11-10 00:20:24 +0000308
309 // If the two RegTypes are the same
Chris Lattner37730942002-02-05 03:52:29 +0000310 if (!RCOfDef->getInterference(LROfDef, LROfUse) ) {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000311
312 unsigned CombinedDegree =
313 LROfDef->getUserIGNode()->getNumOfNeighbors() +
314 LROfUse->getUserIGNode()->getNumOfNeighbors();
315
Chris Lattner37730942002-02-05 03:52:29 +0000316 if (CombinedDegree <= RCOfDef->getNumOfAvailRegs()) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000317 // if both LRs do not have suggested colors
Chris Lattner37730942002-02-05 03:52:29 +0000318 if (!(LROfDef->hasSuggestedColor() &&
319 LROfUse->hasSuggestedColor())) {
Ruchira Sasankaa5ab9642001-09-30 23:11:59 +0000320
321 RCOfDef->mergeIGNodesOfLRs(LROfDef, LROfUse);
322 unionAndUpdateLRs(LROfDef, LROfUse);
323 }
324
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000325 } // if combined degree is less than # of regs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000326 } // if def and use do not interfere
Ruchira Sasankad33238b2001-10-12 17:48:18 +0000327 }// if reg classes are the same
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000328 } // for all uses
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000329 } // if def
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000330 } // for all defs
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000331 } // for all machine instructions
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000332 } // for all BBs
333
Chris Lattner2f898d22002-02-05 06:02:59 +0000334 if (DEBUG_RA)
Chris Lattner697954c2002-01-20 22:54:45 +0000335 cerr << "\nCoalscing Done!\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000336}
337
338
339
340
341
342/*--------------------------- Debug code for printing ---------------*/
343
344
Chris Lattner0665a5f2002-02-05 01:43:49 +0000345void LiveRangeInfo::printLiveRanges() {
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000346 LiveRangeMapType::iterator HMI = LiveRangeMap.begin(); // hash map iterator
Chris Lattner697954c2002-01-20 22:54:45 +0000347 cerr << "\nPrinting Live Ranges from Hash Map:\n";
Chris Lattner0665a5f2002-02-05 01:43:49 +0000348 for( ; HMI != LiveRangeMap.end(); ++HMI) {
349 if (HMI->first && HMI->second) {
350 cerr << " " << RAV(HMI->first) << "\t: ";
Chris Lattner296b7732002-02-05 02:52:05 +0000351 printSet(*HMI->second); cerr << "\n";
Ruchira Sasanka8e604792001-09-14 21:18:34 +0000352 }
353 }
354}