blob: 9df824abc310ed74fe7269de68364f90f8508171 [file] [log] [blame]
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00001//===-- RegAllocLinearScan.cpp - Linear Scan register allocator -----------===//
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 a linear scan register allocator.
11//
12//===----------------------------------------------------------------------===//
13#define DEBUG_TYPE "regalloc"
14#include "llvm/Function.h"
15#include "llvm/CodeGen/LiveIntervals.h"
16#include "llvm/CodeGen/LiveVariables.h"
17#include "llvm/CodeGen/MachineFrameInfo.h"
18#include "llvm/CodeGen/MachineFunctionPass.h"
19#include "llvm/CodeGen/MachineInstr.h"
20#include "llvm/CodeGen/Passes.h"
21#include "llvm/CodeGen/SSARegMap.h"
22#include "llvm/Target/MRegisterInfo.h"
23#include "llvm/Target/TargetInstrInfo.h"
24#include "llvm/Target/TargetMachine.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000025#include "llvm/Support/CFG.h"
26#include "Support/Debug.h"
27#include "Support/DepthFirstIterator.h"
28#include "Support/Statistic.h"
29#include "Support/STLExtras.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000030using namespace llvm;
31
32namespace {
33 Statistic<> numSpilled ("ra-linearscan", "Number of registers spilled");
Chris Lattner5e46b512003-12-18 20:25:31 +000034 Statistic<> numReloaded("ra-linearscan", "Number of registers reloaded");
Alkis Evlogimenose88280a2004-01-22 23:08:45 +000035 Statistic<> numPeep ("ra-linearscan",
36 "Number of identity moves eliminated");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000037
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +000038 class PhysRegTracker {
39 private:
40 const MRegisterInfo* mri_;
41 std::vector<bool> reserved_;
42 std::vector<unsigned> regUse_;
43
44 public:
45 PhysRegTracker(MachineFunction* mf)
46 : mri_(mf ? mf->getTarget().getRegisterInfo() : NULL) {
47 if (mri_) {
48 reserved_.assign(mri_->getNumRegs(), false);
49 regUse_.assign(mri_->getNumRegs(), 0);
50 }
51 }
52
53 PhysRegTracker(const PhysRegTracker& rhs)
54 : mri_(rhs.mri_),
55 reserved_(rhs.reserved_),
56 regUse_(rhs.regUse_) {
57 }
58
59 const PhysRegTracker& operator=(const PhysRegTracker& rhs) {
60 mri_ = rhs.mri_;
61 reserved_ = rhs.reserved_;
62 regUse_ = rhs.regUse_;
63 return *this;
64 }
65
66 void reservePhysReg(unsigned physReg) {
67 reserved_[physReg] = true;
68 }
69
70 void addPhysRegUse(unsigned physReg) {
71 ++regUse_[physReg];
72 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
73 physReg = *as;
74 ++regUse_[physReg];
75 }
76 }
77
78 void delPhysRegUse(unsigned physReg) {
79 assert(regUse_[physReg] != 0);
80 --regUse_[physReg];
81 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
82 physReg = *as;
83 assert(regUse_[physReg] != 0);
84 --regUse_[physReg];
85 }
86 }
87
88 bool isPhysRegReserved(unsigned physReg) const {
89 return reserved_[physReg];
90 }
91
92 bool isPhysRegAvail(unsigned physReg) const {
93 return regUse_[physReg] == 0 && !isPhysRegReserved(physReg);
94 }
95
96 bool isReservedPhysRegAvail(unsigned physReg) const {
97 return regUse_[physReg] == 0 && isPhysRegReserved(physReg);
98 }
99 };
100
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000101 class RA : public MachineFunctionPass {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000102 private:
103 MachineFunction* mf_;
104 const TargetMachine* tm_;
105 const MRegisterInfo* mri_;
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000106 LiveIntervals* li_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000107 MachineFunction::iterator currentMbb_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000108 MachineBasicBlock::iterator currentInstr_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000109 typedef std::vector<const LiveIntervals::Interval*> IntervalPtrs;
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000110 IntervalPtrs unhandled_, fixed_, active_, inactive_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000111
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000112 PhysRegTracker prt_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000113
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000114 typedef std::map<unsigned, unsigned> Virt2PhysMap;
115 Virt2PhysMap v2pMap_;
116
117 typedef std::map<unsigned, int> Virt2StackSlotMap;
118 Virt2StackSlotMap v2ssMap_;
119
120 int instrAdded_;
121
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000122 typedef std::vector<float> SpillWeights;
123 SpillWeights spillWeights_;
124
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000125 public:
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000126 RA()
127 : prt_(NULL) {
128
129 }
130
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000131 virtual const char* getPassName() const {
132 return "Linear Scan Register Allocator";
133 }
134
135 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
136 AU.addRequired<LiveVariables>();
137 AU.addRequired<LiveIntervals>();
138 MachineFunctionPass::getAnalysisUsage(AU);
139 }
140
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000141 /// runOnMachineFunction - register allocate the whole function
142 bool runOnMachineFunction(MachineFunction&);
143
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000144 void releaseMemory();
145
146 private:
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000147 /// initIntervalSets - initializa the four interval sets:
148 /// unhandled, fixed, active and inactive
149 void initIntervalSets(const LiveIntervals::Intervals& li);
150
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000151 /// processActiveIntervals - expire old intervals and move
152 /// non-overlapping ones to the incative list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000153 void processActiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000154
155 /// processInactiveIntervals - expire old intervals and move
156 /// overlapping ones to the active list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000157 void processInactiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000158
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000159 /// updateSpillWeights - updates the spill weights of the
160 /// specifed physical register and its weight
161 void updateSpillWeights(unsigned reg, SpillWeights::value_type weight);
162
163 /// assignRegOrStackSlotAtInterval - assign a register if one
164 /// is available, or spill.
165 void assignRegOrStackSlotAtInterval(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000166
167 ///
168 /// register handling helpers
169 ///
170
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000171 /// getFreePhysReg - return a free physical register for this
172 /// virtual register interval if we have one, otherwise return
173 /// 0
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000174 unsigned getFreePhysReg(IntervalPtrs::value_type cur);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000175
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000176 /// getFreeTempPhysReg - return a free temprorary physical
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000177 /// register for this virtual register if we have one (should
178 /// never return 0)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000179 unsigned getFreeTempPhysReg(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000180
181 /// assignVirt2PhysReg - assigns the free physical register to
182 /// the virtual register passed as arguments
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000183 Virt2PhysMap::iterator
184 assignVirt2PhysReg(unsigned virtReg, unsigned physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000185
186 /// clearVirtReg - free the physical register associated with this
187 /// virtual register and disassociate virtual->physical and
188 /// physical->virtual mappings
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000189 void clearVirtReg(Virt2PhysMap::iterator it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000190
191 /// assignVirt2StackSlot - assigns this virtual register to a
192 /// stack slot
193 void assignVirt2StackSlot(unsigned virtReg);
194
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000195 /// getStackSlot - returns the offset of the specified
196 /// register on the stack
197 int getStackSlot(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000198
199 /// spillVirtReg - spills the virtual register
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000200 void spillVirtReg(Virt2PhysMap::iterator it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000201
202 /// loadPhysReg - loads to the physical register the value of
203 /// the virtual register specifed. Virtual register must have
204 /// an assigned stack slot
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000205 Virt2PhysMap::iterator
206 loadVirt2PhysReg(unsigned virtReg, unsigned physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000207
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000208 void printVirtRegAssignment() const {
209 std::cerr << "register assignment:\n";
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000210
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000211 for (Virt2PhysMap::const_iterator
212 i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000213 assert(i->second != 0);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000214 std::cerr << '[' << i->first << ','
215 << mri_->getName(i->second) << "]\n";
216 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000217 for (Virt2StackSlotMap::const_iterator
218 i = v2ssMap_.begin(), e = v2ssMap_.end(); i != e; ++i) {
219 std::cerr << '[' << i->first << ",ss#" << i->second << "]\n";
220 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000221 std::cerr << '\n';
222 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000223
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000224 void printIntervals(const char* const str,
225 RA::IntervalPtrs::const_iterator i,
226 RA::IntervalPtrs::const_iterator e) const {
227 if (str) std::cerr << str << " intervals:\n";
228 for (; i != e; ++i) {
229 std::cerr << "\t\t" << **i << " -> ";
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000230 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000231 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000232 Virt2PhysMap::const_iterator it = v2pMap_.find(reg);
233 reg = (it == v2pMap_.end() ? 0 : it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000234 }
Alkis Evlogimenosa12c7bb2004-01-16 20:33:13 +0000235 std::cerr << mri_->getName(reg) << '\n';
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000236 }
237 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000238
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000239// void printFreeRegs(const char* const str,
240// const TargetRegisterClass* rc) const {
241// if (str) std::cerr << str << ':';
242// for (TargetRegisterClass::iterator i =
243// rc->allocation_order_begin(*mf_);
244// i != rc->allocation_order_end(*mf_); ++i) {
245// unsigned reg = *i;
246// if (!regUse_[reg]) {
247// std::cerr << ' ' << mri_->getName(reg);
248// if (reserved_[reg]) std::cerr << "*";
249// }
250// }
251// std::cerr << '\n';
252// }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000253 };
254}
255
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000256void RA::releaseMemory()
257{
258 v2pMap_.clear();
259 v2ssMap_.clear();
260 unhandled_.clear();
261 active_.clear();
262 inactive_.clear();
263 fixed_.clear();
264
265}
266
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000267bool RA::runOnMachineFunction(MachineFunction &fn) {
268 mf_ = &fn;
269 tm_ = &fn.getTarget();
270 mri_ = tm_->getRegisterInfo();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000271 li_ = &getAnalysis<LiveIntervals>();
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000272 prt_ = PhysRegTracker(mf_);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000273
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000274 initIntervalSets(li_->getIntervals());
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000275
276 // FIXME: this will work only for the X86 backend. I need to
277 // device an algorthm to select the minimal (considering register
278 // aliasing) number of temp registers to reserve so that we have 2
279 // registers for each register class available.
280
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000281 // reserve R8: CH, CL
282 // R16: CX, DI,
283 // R32: ECX, EDI,
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000284 // RFP: FP5, FP6
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000285 prt_.reservePhysReg( 8); /* CH */
286 prt_.reservePhysReg( 9); /* CL */
287 prt_.reservePhysReg(10); /* CX */
288 prt_.reservePhysReg(12); /* DI */
289 prt_.reservePhysReg(18); /* ECX */
290 prt_.reservePhysReg(19); /* EDI */
291 prt_.reservePhysReg(28); /* FP5 */
292 prt_.reservePhysReg(29); /* FP6 */
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000293
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000294 // linear scan algorithm
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000295 DEBUG(std::cerr << "Machine Function\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000296
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000297 DEBUG(printIntervals("\tunhandled", unhandled_.begin(), unhandled_.end()));
298 DEBUG(printIntervals("\tfixed", fixed_.begin(), fixed_.end()));
299 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
300 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end()));
301
302 while (!unhandled_.empty() || !fixed_.empty()) {
303 // pick the interval with the earliest start point
304 IntervalPtrs::value_type cur;
305 if (fixed_.empty()) {
306 cur = unhandled_.front();
307 unhandled_.erase(unhandled_.begin());
308 }
309 else if (unhandled_.empty()) {
310 cur = fixed_.front();
311 fixed_.erase(fixed_.begin());
312 }
313 else if (unhandled_.front()->start() < fixed_.front()->start()) {
314 cur = unhandled_.front();
315 unhandled_.erase(unhandled_.begin());
316 }
317 else {
318 cur = fixed_.front();
319 fixed_.erase(fixed_.begin());
320 }
321
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000322 DEBUG(std::cerr << *cur << '\n');
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000323
324 processActiveIntervals(cur);
325 processInactiveIntervals(cur);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000326
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000327 // if this register is fixed we are done
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000328 if (MRegisterInfo::isPhysicalRegister(cur->reg)) {
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000329 prt_.addPhysRegUse(cur->reg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000330 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000331 }
332 // otherwise we are allocating a virtual register. try to find
333 // a free physical register or spill an interval in order to
334 // assign it one (we could spill the current though).
335 else {
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000336 assignRegOrStackSlotAtInterval(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000337 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000338
339 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
340 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end())); }
341
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000342 // expire any remaining active intervals
343 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ++i) {
344 unsigned reg = (*i)->reg;
345 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000346 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000347 reg = v2pMap_[reg];
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000348 }
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000349 prt_.delPhysRegUse(reg);
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000350 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000351
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000352 typedef LiveIntervals::Reg2RegMap Reg2RegMap;
353 const Reg2RegMap& r2rMap = li_->getJoinedRegMap();
354
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000355 DEBUG(printVirtRegAssignment());
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000356 DEBUG(std::cerr << "Performing coalescing on joined intervals\n");
357 // perform coalescing if we were passed joined intervals
358 for(Reg2RegMap::const_iterator i = r2rMap.begin(), e = r2rMap.end();
359 i != e; ++i) {
360 unsigned reg = i->first;
361 unsigned rep = li_->rep(reg);
362
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000363 assert((MRegisterInfo::isPhysicalRegister(rep) ||
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000364 v2pMap_.count(rep) || v2ssMap_.count(rep)) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000365 "representative register is not allocated!");
366
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000367 assert(MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000368 !v2pMap_.count(reg) && !v2ssMap_.count(reg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000369 "coalesced register is already allocated!");
370
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000371 if (MRegisterInfo::isPhysicalRegister(rep)) {
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000372 v2pMap_.insert(std::make_pair(reg, rep));
373 }
374 else {
375 Virt2PhysMap::const_iterator pr = v2pMap_.find(rep);
376 if (pr != v2pMap_.end()) {
377 v2pMap_.insert(std::make_pair(reg, pr->second));
378 }
379 else {
380 Virt2StackSlotMap::const_iterator ss = v2ssMap_.find(rep);
381 assert(ss != v2ssMap_.end());
382 v2ssMap_.insert(std::make_pair(reg, ss->second));
383 }
384 }
385 }
386
387 DEBUG(printVirtRegAssignment());
388 DEBUG(std::cerr << "finished register allocation\n");
389
390 const TargetInstrInfo& tii = tm_->getInstrInfo();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000391
392 DEBUG(std::cerr << "Rewrite machine code:\n");
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000393 for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000394 instrAdded_ = 0;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000395
396 for (currentInstr_ = currentMbb_->begin();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000397 currentInstr_ != currentMbb_->end(); ) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000398 DEBUG(std::cerr << "\tinstruction: ";
399 (*currentInstr_)->print(std::cerr, *tm_););
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000400
401 // use our current mapping and actually replace and
402 // virtual register with its allocated physical registers
403 DEBUG(std::cerr << "\t\treplacing virtual registers with mapped "
404 "physical registers:\n");
405 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
406 i != e; ++i) {
407 MachineOperand& op = (*currentInstr_)->getOperand(i);
Chris Lattner1cbe4d02004-02-10 21:12:22 +0000408 if (op.isRegister() &&
409 MRegisterInfo::isVirtualRegister(op.getReg())) {
410 unsigned virtReg = op.getReg();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000411 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
412 if (it != v2pMap_.end()) {
Alkis Evlogimenoscc6a1292004-02-02 22:00:32 +0000413 DEBUG(std::cerr << "\t\t\t%reg" << it->first
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000414 << " -> " << mri_->getName(it->second) << '\n');
415 (*currentInstr_)->SetMachineOperandReg(i, it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000416 }
417 }
418 }
419
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000420 unsigned srcReg, dstReg;
421 if (tii.isMoveInstr(**currentInstr_, srcReg, dstReg) &&
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000422 ((MRegisterInfo::isPhysicalRegister(srcReg) &&
423 MRegisterInfo::isPhysicalRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000424 srcReg == dstReg) ||
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000425 (MRegisterInfo::isVirtualRegister(srcReg) &&
426 MRegisterInfo::isVirtualRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000427 v2ssMap_[srcReg] == v2ssMap_[dstReg]))) {
428 delete *currentInstr_;
429 currentInstr_ = currentMbb_->erase(currentInstr_);
430 ++numPeep;
431 DEBUG(std::cerr << "\t\tdeleting instruction\n");
432 continue;
433 }
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000434
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000435 typedef std::vector<Virt2PhysMap::iterator> Regs;
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000436 Regs toClear;
437 Regs toSpill;
438
439 const unsigned numOperands = (*currentInstr_)->getNumOperands();
440
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000441 DEBUG(std::cerr << "\t\tloading temporarily used operands to "
442 "registers:\n");
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000443 for (unsigned i = 0; i != numOperands; ++i) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000444 MachineOperand& op = (*currentInstr_)->getOperand(i);
Chris Lattner1cbe4d02004-02-10 21:12:22 +0000445 if (op.isRegister() && op.isUse() &&
446 MRegisterInfo::isVirtualRegister(op.getReg())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000447 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000448 unsigned physReg = 0;
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000449 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000450 if (it != v2pMap_.end()) {
451 physReg = it->second;
452 }
453 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000454 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000455 it = loadVirt2PhysReg(virtReg, physReg);
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000456 // we will clear uses that are not also defs
457 // before we allocate registers the defs
458 if (op.isDef())
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000459 toSpill.push_back(it);
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000460 else
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000461 toClear.push_back(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000462 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000463 (*currentInstr_)->SetMachineOperandReg(i, physReg);
464 }
465 }
466
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000467 DEBUG(std::cerr << "\t\tclearing temporarily used but not defined "
468 "operands:\n");
469 std::for_each(toClear.begin(), toClear.end(),
470 std::bind1st(std::mem_fun(&RA::clearVirtReg), this));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000471
472 DEBUG(std::cerr << "\t\tassigning temporarily defined operands to "
473 "registers:\n");
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000474 for (unsigned i = 0; i != numOperands; ++i) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000475 MachineOperand& op = (*currentInstr_)->getOperand(i);
Chris Lattner1cbe4d02004-02-10 21:12:22 +0000476 if (op.isRegister() &&
477 MRegisterInfo::isVirtualRegister(op.getReg())) {
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000478 assert(!op.isUse() && "we should not have uses here!");
Chris Lattner1cbe4d02004-02-10 21:12:22 +0000479 unsigned virtReg = op.getReg();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000480 unsigned physReg = 0;
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000481 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000482 if (it != v2pMap_.end()) {
483 physReg = it->second;
484 }
485 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000486 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000487 it = assignVirt2PhysReg(virtReg, physReg);
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000488 // need to spill this after we are done with
489 // this instruction
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000490 toSpill.push_back(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000491 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000492 (*currentInstr_)->SetMachineOperandReg(i, physReg);
493 }
494 }
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000495 ++currentInstr_; // spills will go after this instruction
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000496
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000497 DEBUG(std::cerr << "\t\tspilling temporarily defined operands:\n");
498 std::for_each(toSpill.begin(), toSpill.end(),
499 std::bind1st(std::mem_fun(&RA::spillVirtReg), this));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000500 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000501 }
502
503 return true;
504}
505
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000506void RA::initIntervalSets(const LiveIntervals::Intervals& li)
507{
508 assert(unhandled_.empty() && fixed_.empty() &&
509 active_.empty() && inactive_.empty() &&
510 "interval sets should be empty on initialization");
511
512 for (LiveIntervals::Intervals::const_iterator i = li.begin(), e = li.end();
513 i != e; ++i) {
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000514 if (MRegisterInfo::isPhysicalRegister(i->reg))
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000515 fixed_.push_back(&*i);
516 else
517 unhandled_.push_back(&*i);
518 }
519}
520
521void RA::processActiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000522{
523 DEBUG(std::cerr << "\tprocessing active intervals:\n");
524 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
525 unsigned reg = (*i)->reg;
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000526 // remove expired intervals
527 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000528 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000529 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000530 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000531 }
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000532 prt_.delPhysRegUse(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000533 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000534 i = active_.erase(i);
535 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000536 // move inactive intervals to inactive list
537 else if (!(*i)->liveAt(cur->start())) {
538 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000539 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000540 reg = v2pMap_[reg];
541 }
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000542 prt_.delPhysRegUse(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000543 // add to inactive
544 inactive_.push_back(*i);
545 // remove from active
546 i = active_.erase(i);
547 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000548 else {
549 ++i;
550 }
551 }
552}
553
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000554void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000555{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000556 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
557 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
558 unsigned reg = (*i)->reg;
559
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000560 // remove expired intervals
561 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000562 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000563 // remove from inactive
564 i = inactive_.erase(i);
565 }
566 // move re-activated intervals in active list
567 else if ((*i)->liveAt(cur->start())) {
568 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000569 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000570 reg = v2pMap_[reg];
571 }
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000572 prt_.addPhysRegUse(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000573 // add to active
574 active_.push_back(*i);
575 // remove from inactive
576 i = inactive_.erase(i);
577 }
578 else {
579 ++i;
580 }
581 }
582}
583
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000584void RA::updateSpillWeights(unsigned reg, SpillWeights::value_type weight)
585{
586 spillWeights_[reg] += weight;
587 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
588 spillWeights_[*as] += weight;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000589}
590
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000591void RA::assignRegOrStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000592{
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000593 DEBUG(std::cerr << "\tallocating current interval:\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000594
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000595 PhysRegTracker backupPrt = prt_;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000596
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000597 spillWeights_.assign(mri_->getNumRegs(), 0.0);
598
599 // for each interval in active update spill weights
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000600 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
601 i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000602 unsigned reg = (*i)->reg;
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000603 if (MRegisterInfo::isVirtualRegister(reg))
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000604 reg = v2pMap_[reg];
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000605 updateSpillWeights(reg, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000606 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000607
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000608 // for every interval in inactive we overlap with, mark the
609 // register as not free and update spill weights
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000610 for (IntervalPtrs::const_iterator i = inactive_.begin(),
611 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000612 if (cur->overlaps(**i)) {
613 unsigned reg = (*i)->reg;
614 if (MRegisterInfo::isVirtualRegister(reg))
615 reg = v2pMap_[reg];
616 prt_.addPhysRegUse(reg);
617 updateSpillWeights(reg, (*i)->weight);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000618 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000619 }
620
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000621 // for every interval in fixed we overlap with,
622 // mark the register as not free and update spill weights
623 for (IntervalPtrs::const_iterator i = fixed_.begin(),
624 e = fixed_.end(); i != e; ++i) {
625 if (cur->overlaps(**i)) {
626 unsigned reg = (*i)->reg;
627 prt_.addPhysRegUse(reg);
628 updateSpillWeights(reg, (*i)->weight);
629 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000630 }
631
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000632 unsigned physReg = getFreePhysReg(cur);
633 // if we find a free register, we are done: restore original
634 // register tracker, assign this virtual to the free physical
635 // register and add this interval to the active list.
636 if (physReg) {
637 prt_ = backupPrt;
638 assignVirt2PhysReg(cur->reg, physReg);
639 active_.push_back(cur);
640 return;
641 }
642
643 DEBUG(std::cerr << "\t\tassigning stack slot at interval "<< *cur << ":\n");
644
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000645 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000646 unsigned minReg = 0;
647 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
648 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
649 i != rc->allocation_order_end(*mf_); ++i) {
650 unsigned reg = *i;
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000651 if (!prt_.isPhysRegReserved(reg) && minWeight > spillWeights_[reg]) {
652 minWeight = spillWeights_[reg];
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000653 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000654 }
655 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000656 DEBUG(std::cerr << "\t\t\tregister with min weight: "
657 << mri_->getName(minReg) << " (" << minWeight << ")\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000658
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000659 // if the current has the minimum weight, we are done: restore
660 // original register tracker and assign a stack slot to this
661 // virtual register
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000662 if (cur->weight < minWeight) {
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000663 prt_ = backupPrt;
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000664 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000665 assignVirt2StackSlot(cur->reg);
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000666 return;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000667 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000668
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000669 std::vector<bool> toSpill(mri_->getNumRegs(), false);
670 toSpill[minReg] = true;
671 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
672 toSpill[*as] = true;
673
674 std::vector<unsigned> spilled;
675 for (IntervalPtrs::iterator i = active_.begin();
676 i != active_.end(); ) {
677 unsigned reg = (*i)->reg;
678 if (MRegisterInfo::isVirtualRegister(reg) &&
679 toSpill[v2pMap_[reg]] &&
680 cur->overlaps(**i)) {
681 spilled.push_back(v2pMap_[reg]);
682 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
683 assignVirt2StackSlot(reg);
684 i = active_.erase(i);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000685 }
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000686 else {
687 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000688 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000689 }
Alkis Evlogimenosf5eaf162004-02-06 18:08:18 +0000690 for (IntervalPtrs::iterator i = inactive_.begin();
691 i != inactive_.end(); ) {
692 unsigned reg = (*i)->reg;
693 if (MRegisterInfo::isVirtualRegister(reg) &&
694 toSpill[v2pMap_[reg]] &&
695 cur->overlaps(**i)) {
696 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
697 assignVirt2StackSlot(reg);
698 i = inactive_.erase(i);
699 }
700 else {
701 ++i;
702 }
703 }
704
705 physReg = getFreePhysReg(cur);
706 assert(physReg && "no free physical register after spill?");
707
708 prt_ = backupPrt;
709 for (unsigned i = 0; i < spilled.size(); ++i)
710 prt_.delPhysRegUse(spilled[i]);
711
712 assignVirt2PhysReg(cur->reg, physReg);
713 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000714}
715
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000716unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000717{
718 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000719 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000720
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000721 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
722 i != rc->allocation_order_end(*mf_); ++i) {
723 unsigned reg = *i;
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000724 if (prt_.isPhysRegAvail(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000725 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000726 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000727 }
728 }
729
730 DEBUG(std::cerr << "no free register\n");
731 return 0;
732}
733
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000734unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000735{
736 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
737
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000738 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
739 // go in reverse allocation order for the temp registers
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000740 typedef std::reverse_iterator<TargetRegisterClass::iterator> TRCRevIter;
741 for (TRCRevIter
742 i(rc->allocation_order_end(*mf_)),
743 e(rc->allocation_order_begin(*mf_)); i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000744 unsigned reg = *i;
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000745 if (prt_.isReservedPhysRegAvail(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000746 DEBUG(std::cerr << mri_->getName(reg) << '\n');
747 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000748 }
749 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000750
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000751 assert(0 && "no free temporary physical register?");
752 return 0;
753}
754
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000755RA::Virt2PhysMap::iterator
756RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000757{
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000758 bool inserted;
759 Virt2PhysMap::iterator it;
760 tie(it, inserted) = v2pMap_.insert(std::make_pair(virtReg, physReg));
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000761 assert(inserted && "attempting to assign a virt->phys mapping to an "
762 "already mapped register");
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000763 prt_.addPhysRegUse(physReg);
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000764 return it;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000765}
766
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000767void RA::clearVirtReg(Virt2PhysMap::iterator it)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000768{
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000769 assert(it != v2pMap_.end() &&
770 "attempting to clear a not allocated virtual register");
771 unsigned physReg = it->second;
Alkis Evlogimenos22b7e442004-02-02 07:30:36 +0000772 prt_.delPhysRegUse(physReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000773 v2pMap_.erase(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000774 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
775 << "\n");
776}
777
778void RA::assignVirt2StackSlot(unsigned virtReg)
779{
780 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
781 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
782
783 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
784 assert(inserted &&
785 "attempt to assign stack slot to already assigned register?");
786 // if the virtual register was previously assigned clear the mapping
787 // and free the virtual register
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000788 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
789 if (it != v2pMap_.end()) {
790 clearVirtReg(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000791 }
792}
793
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000794int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000795{
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000796 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
797 assert(it != v2ssMap_.end() &&
798 "attempt to get stack slot on register that does not live on the stack");
799 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000800}
801
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000802void RA::spillVirtReg(Virt2PhysMap::iterator it)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000803{
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000804 assert(it != v2pMap_.end() &&
805 "attempt to spill a not allocated virtual register");
806 unsigned virtReg = it->first;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000807 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
808 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000809 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000810 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
811 ++numSpilled;
812 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000813 it->second, frameIndex, rc);
814 clearVirtReg(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000815}
816
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000817RA::Virt2PhysMap::iterator
818RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000819{
820 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
821 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000822 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000823 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000824 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000825 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
826 physReg, frameIndex, rc);
Alkis Evlogimenos54d23c72004-02-06 03:15:40 +0000827 return assignVirt2PhysReg(virtReg, physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000828}
829
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000830FunctionPass* llvm::createLinearScanRegisterAllocator() {
831 return new RA();
832}