blob: ef1858725c5297cd8a64dd8d9ba01a1dee35afb1 [file] [log] [blame]
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00001//===-- LiveIntervals.cpp - Live Interval Analysis ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the LiveInterval analysis pass which is used
11// by the Linear Scan Register allocator. This pass linearizes the
12// basic blocks of the function in DFS order and uses the
13// LiveVariables pass to conservatively compute live intervals for
14// each virtual and physical register.
15//
16//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "liveintervals"
19#include "llvm/CodeGen/LiveIntervals.h"
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +000020#include "llvm/Analysis/LoopInfo.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000021#include "llvm/CodeGen/LiveVariables.h"
22#include "llvm/CodeGen/MachineFrameInfo.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000023#include "llvm/CodeGen/MachineInstr.h"
24#include "llvm/CodeGen/Passes.h"
25#include "llvm/CodeGen/SSARegMap.h"
26#include "llvm/Target/MRegisterInfo.h"
27#include "llvm/Target/TargetInstrInfo.h"
28#include "llvm/Target/TargetMachine.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000029#include "llvm/Support/CFG.h"
Alkis Evlogimenose88280a2004-01-22 23:08:45 +000030#include "Support/CommandLine.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000031#include "Support/Debug.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000032#include "Support/Statistic.h"
33#include <iostream>
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +000034#include <limits>
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000035
36using namespace llvm;
37
38namespace {
39 RegisterAnalysis<LiveIntervals> X("liveintervals",
40 "Live Interval Analysis");
41
42 Statistic<> numIntervals("liveintervals", "Number of intervals");
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +000043 Statistic<> numJoined ("liveintervals", "Number of intervals joined");
Alkis Evlogimenose88280a2004-01-22 23:08:45 +000044
45 cl::opt<bool>
46 join("join-liveintervals",
47 cl::desc("Join compatible live intervals"),
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +000048 cl::init(true));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000049};
50
51void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const
52{
Alkis Evlogimenosf6f91bf2003-12-15 04:55:38 +000053 AU.addPreserved<LiveVariables>();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000054 AU.addRequired<LiveVariables>();
Alkis Evlogimenosf6f91bf2003-12-15 04:55:38 +000055 AU.addPreservedID(PHIEliminationID);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000056 AU.addRequiredID(PHIEliminationID);
Alkis Evlogimenos4c080862003-12-18 22:40:24 +000057 AU.addRequiredID(TwoAddressInstructionPassID);
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +000058 AU.addRequired<LoopInfo>();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000059 MachineFunctionPass::getAnalysisUsage(AU);
60}
61
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +000062void LiveIntervals::releaseMemory()
63{
64 mbbi2mbbMap_.clear();
65 mi2iMap_.clear();
66 r2iMap_.clear();
67 r2iMap_.clear();
68 r2rMap_.clear();
69 intervals_.clear();
70}
71
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000072/// runOnMachineFunction - Register allocate the whole function
73///
74bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
75 DEBUG(std::cerr << "Machine Function\n");
76 mf_ = &fn;
77 tm_ = &fn.getTarget();
78 mri_ = tm_->getRegisterInfo();
79 lv_ = &getAnalysis<LiveVariables>();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000080
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000081 // number MachineInstrs
82 unsigned miIndex = 0;
83 for (MachineFunction::iterator mbb = mf_->begin(), mbbEnd = mf_->end();
84 mbb != mbbEnd; ++mbb) {
85 const std::pair<MachineBasicBlock*, unsigned>& entry =
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +000086 lv_->getMachineBasicBlockInfo(mbb);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000087 bool inserted = mbbi2mbbMap_.insert(std::make_pair(entry.second,
88 entry.first)).second;
89 assert(inserted && "multiple index -> MachineBasicBlock");
90
91 for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
92 mi != miEnd; ++mi) {
93 inserted = mi2iMap_.insert(std::make_pair(*mi, miIndex)).second;
94 assert(inserted && "multiple MachineInstr -> index mappings");
95 ++miIndex;
96 }
97 }
98
99 computeIntervals();
100
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000101 // compute spill weights
102 const LoopInfo& loopInfo = getAnalysis<LoopInfo>();
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000103 const TargetInstrInfo& tii = tm_->getInstrInfo();
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000104
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000105 for (MachineFunction::const_iterator mbbi = mf_->begin(),
106 mbbe = mf_->end(); mbbi != mbbe; ++mbbi) {
107 const MachineBasicBlock* mbb = mbbi;
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000108 unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
109
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000110 if (loopDepth) {
111 for (MachineBasicBlock::const_iterator mii = mbb->begin(),
112 mie = mbb->end(); mii != mie; ++mii) {
113 MachineInstr* mi = *mii;
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000114
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000115 for (int i = mi->getNumOperands() - 1; i >= 0; --i) {
116 MachineOperand& mop = mi->getOperand(i);
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000117
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000118 if (!mop.isVirtualRegister())
119 continue;
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000120
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000121 unsigned reg = mop.getAllocatedRegNum();
122 Reg2IntervalMap::iterator r2iit = r2iMap_.find(reg);
123 assert(r2iit != r2iMap_.end());
124 r2iit->second->weight += pow(10.0F, loopDepth);
125 }
Alkis Evlogimenos7a40eaa2003-12-24 15:44:53 +0000126 }
127 }
128 }
129
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000130 // join intervals if requested
131 if (join) joinIntervals();
132
Alkis Evlogimenosd6e40a62004-01-14 10:44:29 +0000133 numIntervals += intervals_.size();
134
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000135 return true;
136}
137
138void LiveIntervals::printRegName(unsigned reg) const
139{
140 if (reg < MRegisterInfo::FirstVirtualRegister)
141 std::cerr << mri_->getName(reg);
142 else
143 std::cerr << '%' << reg;
144}
145
146void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock* mbb,
147 MachineBasicBlock::iterator mi,
148 unsigned reg)
149{
Alkis Evlogimenosa3a65242004-01-13 21:53:20 +0000150 DEBUG(std::cerr << "\t\tregister: ";printRegName(reg); std::cerr << '\n');
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000151
152 unsigned instrIndex = getInstructionIndex(*mi);
153
154 LiveVariables::VarInfo& vi = lv_->getVarInfo(reg);
155
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000156 Interval* interval = 0;
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000157 Reg2IntervalMap::iterator r2iit = r2iMap_.lower_bound(reg);
158 if (r2iit == r2iMap_.end() || r2iit->first != reg) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000159 // add new interval
160 intervals_.push_back(Interval(reg));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000161 // update interval index for this register
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000162 r2iMap_.insert(r2iit, std::make_pair(reg, --intervals_.end()));
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000163 interval = &intervals_.back();
164 }
165 else {
Alkis Evlogimenosf5f16892004-01-16 16:06:59 +0000166 interval = &*r2iit->second;
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000167 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000168
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000169 // iterate over all of the blocks that the variable is completely
170 // live in, adding them to the live interval
171 for (unsigned i = 0, e = vi.AliveBlocks.size(); i != e; ++i) {
172 if (vi.AliveBlocks[i]) {
173 MachineBasicBlock* mbb = lv_->getIndexMachineBasicBlock(i);
174 if (!mbb->empty()) {
175 interval->addRange(getInstructionIndex(mbb->front()),
176 getInstructionIndex(mbb->back()));
177 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000178 }
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000179 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000180
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000181 bool killedInDefiningBasicBlock = false;
182 for (int i = 0, e = vi.Kills.size(); i != e; ++i) {
183 MachineBasicBlock* killerBlock = vi.Kills[i].first;
184 MachineInstr* killerInstr = vi.Kills[i].second;
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000185 unsigned start = (mbb == killerBlock ?
186 instrIndex :
187 getInstructionIndex(killerBlock->front()));
188 unsigned end = getInstructionIndex(killerInstr) + 1;
Alkis Evlogimenos43f692f2003-12-18 08:53:43 +0000189 if (start < end) {
190 killedInDefiningBasicBlock |= mbb == killerBlock;
191 interval->addRange(start, end);
192 }
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000193 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000194
Alkis Evlogimenosdd2cc652003-12-18 08:48:48 +0000195 if (!killedInDefiningBasicBlock) {
196 unsigned end = getInstructionIndex(mbb->back()) + 1;
197 interval->addRange(instrIndex, end);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000198 }
199}
200
201void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock* mbb,
202 MachineBasicBlock::iterator mi,
203 unsigned reg)
204{
Alkis Evlogimenos1a119e22004-01-13 22:10:43 +0000205 DEBUG(std::cerr << "\t\tregister: "; printRegName(reg));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000206
207 unsigned start = getInstructionIndex(*mi);
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000208 unsigned end = start + 1;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000209
Alkis Evlogimenosaf254732004-01-13 22:26:14 +0000210 // register can be dead by the instruction defining it but it can
211 // only be killed by subsequent instructions
Alkis Evlogimenosaf254732004-01-13 22:26:14 +0000212 for (LiveVariables::killed_iterator
213 ki = lv_->dead_begin(*mi),
214 ke = lv_->dead_end(*mi);
215 ki != ke; ++ki) {
216 if (reg == ki->second) {
Alkis Evlogimenosaf254732004-01-13 22:26:14 +0000217 DEBUG(std::cerr << " dead\n");
218 goto exit;
219 }
220 }
Alkis Evlogimenosaf254732004-01-13 22:26:14 +0000221
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000222 {
223 MachineBasicBlock::iterator e = mbb->end();
224 do {
225 ++mi;
226 for (LiveVariables::killed_iterator
227 ki = lv_->killed_begin(*mi),
228 ke = lv_->killed_end(*mi);
229 ki != ke; ++ki) {
230 if (reg == ki->second) {
231 DEBUG(std::cerr << " killed\n");
232 goto exit;
233 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000234 }
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000235 ++end;
236 } while (mi != e);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000237 }
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000238
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000239exit:
240 assert(start < end && "did not find end of interval?");
241
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000242 Reg2IntervalMap::iterator r2iit = r2iMap_.lower_bound(reg);
243 if (r2iit != r2iMap_.end() && r2iit->first == reg) {
244 r2iit->second->addRange(start, end);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000245 }
246 else {
247 intervals_.push_back(Interval(reg));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000248 // update interval index for this register
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000249 r2iMap_.insert(r2iit, std::make_pair(reg, --intervals_.end()));
250 intervals_.back().addRange(start, end);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000251 }
252}
253
254void LiveIntervals::handleRegisterDef(MachineBasicBlock* mbb,
255 MachineBasicBlock::iterator mi,
256 unsigned reg)
257{
258 if (reg < MRegisterInfo::FirstVirtualRegister) {
Alkis Evlogimenos1a119e22004-01-13 22:10:43 +0000259 if (lv_->getAllocatablePhysicalRegisters()[reg]) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000260 handlePhysicalRegisterDef(mbb, mi, reg);
Alkis Evlogimenos19b64862004-01-13 06:24:30 +0000261 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
262 handlePhysicalRegisterDef(mbb, mi, *as);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000263 }
264 }
265 else {
266 handleVirtualRegisterDef(mbb, mi, reg);
267 }
268}
269
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000270/// computeIntervals - computes the live intervals for virtual
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000271/// registers. for some ordering of the machine instructions [1,N) a
272/// live interval is an interval [i, j) where 1 <= i <= j < N for
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000273/// which a variable is live
274void LiveIntervals::computeIntervals()
275{
276 DEBUG(std::cerr << "computing live intervals:\n");
277
278 for (MbbIndex2MbbMap::iterator
279 it = mbbi2mbbMap_.begin(), itEnd = mbbi2mbbMap_.end();
280 it != itEnd; ++it) {
281 MachineBasicBlock* mbb = it->second;
282 DEBUG(std::cerr << "machine basic block: "
283 << mbb->getBasicBlock()->getName() << "\n");
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000284
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000285 for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd = mbb->end();
286 mi != miEnd; ++mi) {
287 MachineInstr* instr = *mi;
288 const TargetInstrDescriptor& tid =
289 tm_->getInstrInfo().get(instr->getOpcode());
Alkis Evlogimenosa3a65242004-01-13 21:53:20 +0000290 DEBUG(std::cerr << "\t[" << getInstructionIndex(instr) << "] ";
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000291 instr->print(std::cerr, *tm_););
292
293 // handle implicit defs
Alkis Evlogimenos19b64862004-01-13 06:24:30 +0000294 for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
295 handleRegisterDef(mbb, mi, *id);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000296
297 // handle explicit defs
298 for (int i = instr->getNumOperands() - 1; i >= 0; --i) {
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000299 // handle register defs - build intervals
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000300 MachineOperand& mop = instr->getOperand(i);
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000301 if (mop.isRegister() && mop.isDef())
Alkis Evlogimenos19b64862004-01-13 06:24:30 +0000302 handleRegisterDef(mbb, mi, mop.getAllocatedRegNum());
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000303 }
304 }
305 }
306
Alkis Evlogimenosf5f16892004-01-16 16:06:59 +0000307 intervals_.sort(StartPointComp());
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000308 DEBUG(std::copy(intervals_.begin(), intervals_.end(),
309 std::ostream_iterator<Interval>(std::cerr, "\n")));
310}
Alkis Evlogimenosb27ef242003-12-05 10:38:28 +0000311
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000312unsigned LiveIntervals::rep(unsigned reg)
313{
314 Reg2RegMap::iterator it = r2rMap_.find(reg);
315 if (it != r2rMap_.end())
316 return it->second = rep(it->second);
317 return reg;
318}
319
320void LiveIntervals::joinIntervals()
321{
322 DEBUG(std::cerr << "joining compatible intervals:\n");
323
324 const TargetInstrInfo& tii = tm_->getInstrInfo();
325
326 for (MachineFunction::const_iterator mbbi = mf_->begin(),
327 mbbe = mf_->end(); mbbi != mbbe; ++mbbi) {
328 const MachineBasicBlock* mbb = mbbi;
329 DEBUG(std::cerr << "machine basic block: "
330 << mbb->getBasicBlock()->getName() << "\n");
331
332 for (MachineBasicBlock::const_iterator mii = mbb->begin(),
333 mie = mbb->end(); mii != mie; ++mii) {
334 MachineInstr* mi = *mii;
335 const TargetInstrDescriptor& tid =
336 tm_->getInstrInfo().get(mi->getOpcode());
337 DEBUG(std::cerr << "\t\tinstruction["
338 << getInstructionIndex(mi) << "]: ";
339 mi->print(std::cerr, *tm_););
340
341 unsigned srcReg, dstReg;
342 if (tii.isMoveInstr(*mi, srcReg, dstReg) &&
343 (srcReg >= MRegisterInfo::FirstVirtualRegister ||
344 lv_->getAllocatablePhysicalRegisters()[srcReg]) &&
345 (dstReg >= MRegisterInfo::FirstVirtualRegister ||
346 lv_->getAllocatablePhysicalRegisters()[dstReg])) {
347
348 // get representative registers
349 srcReg = rep(srcReg);
350 dstReg = rep(dstReg);
351
352 // if they are already joined we continue
353 if (srcReg == dstReg)
354 continue;
355
356 Reg2IntervalMap::iterator r2iSrc = r2iMap_.find(srcReg);
357 assert(r2iSrc != r2iMap_.end());
358 Reg2IntervalMap::iterator r2iDst = r2iMap_.find(dstReg);
359 assert(r2iDst != r2iMap_.end());
360
361 Intervals::iterator srcInt = r2iSrc->second;
362 Intervals::iterator dstInt = r2iDst->second;
363
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000364 // src is a physical register
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000365 if (srcInt->reg < MRegisterInfo::FirstVirtualRegister) {
366 if (dstInt->reg == srcInt->reg ||
367 (dstInt->reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000368 !srcInt->overlaps(*dstInt) &&
369 !overlapsAliases(*srcInt, *dstInt))) {
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000370 srcInt->join(*dstInt);
371 r2iDst->second = r2iSrc->second;
372 r2rMap_.insert(std::make_pair(dstInt->reg, srcInt->reg));
373 intervals_.erase(dstInt);
374 }
375 }
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000376 // dst is a physical register
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000377 else if (dstInt->reg < MRegisterInfo::FirstVirtualRegister) {
378 if (srcInt->reg == dstInt->reg ||
379 (srcInt->reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000380 !dstInt->overlaps(*srcInt) &&
381 !overlapsAliases(*dstInt, *srcInt))) {
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000382 dstInt->join(*srcInt);
383 r2iSrc->second = r2iDst->second;
384 r2rMap_.insert(std::make_pair(srcInt->reg, dstInt->reg));
385 intervals_.erase(srcInt);
386 }
387 }
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000388 // neither src nor dst are physical registers
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000389 else {
390 const TargetRegisterClass *srcRc, *dstRc;
391 srcRc = mf_->getSSARegMap()->getRegClass(srcInt->reg);
392 dstRc = mf_->getSSARegMap()->getRegClass(dstInt->reg);
393
394 if (srcRc == dstRc && !dstInt->overlaps(*srcInt)) {
395 srcInt->join(*dstInt);
396 r2iDst->second = r2iSrc->second;
397 r2rMap_.insert(std::make_pair(dstInt->reg, srcInt->reg));
398 intervals_.erase(dstInt);
399 }
400 }
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000401 ++numJoined;
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000402 }
403 }
404 }
405
406 intervals_.sort(StartPointComp());
407 DEBUG(std::copy(intervals_.begin(), intervals_.end(),
408 std::ostream_iterator<Interval>(std::cerr, "\n")));
409 DEBUG(for (Reg2RegMap::const_iterator i = r2rMap_.begin(),
410 e = r2rMap_.end(); i != e; ++i)
411 std::cerr << i->first << " -> " << i->second << '\n';);
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000412
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000413}
414
Alkis Evlogimenos79b0c3f2004-01-23 13:37:51 +0000415bool LiveIntervals::overlapsAliases(const Interval& lhs,
416 const Interval& rhs) const
417{
418 assert(lhs.reg < MRegisterInfo::FirstVirtualRegister &&
419 "first interval must describe a physical register");
420
421 for (const unsigned* as = mri_->getAliasSet(lhs.reg); *as; ++as) {
422 Reg2IntervalMap::const_iterator r2i = r2iMap_.find(*as);
423 assert(r2i != r2iMap_.end() && "alias does not have interval?");
424 if (rhs.overlaps(*r2i->second))
425 return true;
426 }
427
428 return false;
429}
430
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000431LiveIntervals::Interval::Interval(unsigned r)
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000432 : reg(r),
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000433 weight((r < MRegisterInfo::FirstVirtualRegister ?
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000434 std::numeric_limits<float>::max() : 0.0F))
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000435{
436
437}
438
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000439// This example is provided becaues liveAt() is non-obvious:
440//
441// this = [1,2), liveAt(1) will return false. The idea is that the
442// variable is defined in 1 and not live after definition. So it was
443// dead to begin with (defined but never used).
444//
445// this = [1,3), liveAt(2) will return false. The variable is used at
446// 2 but 2 is the last use so the variable's allocated register is
447// available for reuse.
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000448bool LiveIntervals::Interval::liveAt(unsigned index) const
449{
450 Ranges::const_iterator r = ranges.begin();
Alkis Evlogimenos1075ecd2004-01-22 19:17:52 +0000451 while (r != ranges.end() && index < (r->second - 1)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000452 if (index >= r->first)
453 return true;
454 ++r;
455 }
456 return false;
457}
458
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000459// This example is provided because overlaps() is non-obvious:
460//
461// 0: A = ...
462// 1: B = ...
463// 2: C = A + B ;; last use of A
464//
465// The live intervals should look like:
466//
467// A = [0, 3)
468// B = [1, x)
469// C = [2, y)
470//
471// A->overlaps(C) should return false since we want to be able to join
472// A and C.
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000473bool LiveIntervals::Interval::overlaps(const Interval& other) const
474{
Alkis Evlogimenos80b378c2004-01-07 01:45:58 +0000475 Ranges::const_iterator i = ranges.begin();
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000476 Ranges::const_iterator ie = ranges.end();
Alkis Evlogimenos80b378c2004-01-07 01:45:58 +0000477 Ranges::const_iterator j = other.ranges.begin();
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000478 Ranges::const_iterator je = other.ranges.end();
Alkis Evlogimenos80b378c2004-01-07 01:45:58 +0000479
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000480 while (i != ie && j != je) {
481 if (i->first == j->first) {
482 return true;
483 }
484 else {
485 if (i->first > j->first) {
486 swap(i, j);
487 swap(ie, je);
488 }
489 assert(i->first < j->first);
490
Alkis Evlogimenos97397362004-01-14 00:20:09 +0000491 if ((i->second - 1) > j->first) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000492 return true;
Alkis Evlogimenos80b378c2004-01-07 01:45:58 +0000493 }
494 else {
495 ++i;
496 }
497 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000498 }
499
500 return false;
501}
502
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000503void LiveIntervals::Interval::addRange(unsigned start, unsigned end)
504{
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000505 assert(start < end && "Invalid range to add!");
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000506 DEBUG(std::cerr << "\t\t\tadding range: [" << start <<','<< end << ") -> ");
507 //assert(start < end && "invalid range?");
508 Range range = std::make_pair(start, end);
509 Ranges::iterator it =
510 ranges.insert(std::upper_bound(ranges.begin(), ranges.end(), range),
511 range);
512
513 it = mergeRangesForward(it);
514 it = mergeRangesBackward(it);
515 DEBUG(std::cerr << "\t\t\t\tafter merging: " << *this << '\n');
516}
517
518void LiveIntervals::Interval::join(const LiveIntervals::Interval& other)
519{
520 DEBUG(std::cerr << "\t\t\t\tjoining intervals: "
521 << other << " and " << *this << '\n');
522 Ranges::iterator cur = ranges.begin();
523
524 for (Ranges::const_iterator i = other.ranges.begin(),
525 e = other.ranges.end(); i != e; ++i) {
526 cur = ranges.insert(std::upper_bound(cur, ranges.end(), *i), *i);
527 cur = mergeRangesForward(cur);
528 cur = mergeRangesBackward(cur);
529 }
530 if (reg >= MRegisterInfo::FirstVirtualRegister)
531 weight += other.weight;
532
533 DEBUG(std::cerr << "\t\t\t\tafter merging: " << *this << '\n');
534}
535
536LiveIntervals::Interval::Ranges::iterator
537LiveIntervals::Interval::mergeRangesForward(Ranges::iterator it)
538{
539 for (Ranges::iterator next = it + 1;
540 next != ranges.end() && it->second >= next->first; ) {
541 it->second = std::max(it->second, next->second);
542 next = ranges.erase(next);
543 }
544 return it;
545}
546
547LiveIntervals::Interval::Ranges::iterator
548LiveIntervals::Interval::mergeRangesBackward(Ranges::iterator it)
549{
Alkis Evlogimenos32bdd4e2004-01-31 04:56:07 +0000550 while (it != ranges.begin()) {
551 Ranges::iterator prev = it - 1;
552 if (it->first > prev->second) break;
553
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000554 it->first = std::min(it->first, prev->first);
555 it->second = std::max(it->second, prev->second);
556 it = ranges.erase(prev);
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000557 }
558
559 return it;
560}
561
Alkis Evlogimenosb27ef242003-12-05 10:38:28 +0000562std::ostream& llvm::operator<<(std::ostream& os,
563 const LiveIntervals::Interval& li)
564{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000565 os << "%reg" << li.reg << ',' << li.weight << " = ";
Alkis Evlogimenosb27ef242003-12-05 10:38:28 +0000566 for (LiveIntervals::Interval::Ranges::const_iterator
567 i = li.ranges.begin(), e = li.ranges.end(); i != e; ++i) {
Alkis Evlogimenos63841bc2004-01-13 21:17:47 +0000568 os << "[" << i->first << "," << i->second << ")";
Alkis Evlogimenosb27ef242003-12-05 10:38:28 +0000569 }
570 return os;
571}