blob: a88c55dd527956c81b06b2b963ce68960ec42a59 [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 Evlogimenosff0cbe12003-11-20 03:32:25 +000035
36 class RA : public MachineFunctionPass {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000037 private:
38 MachineFunction* mf_;
39 const TargetMachine* tm_;
40 const MRegisterInfo* mri_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +000041 MachineFunction::iterator currentMbb_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000042 MachineBasicBlock::iterator currentInstr_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +000043 typedef std::vector<const LiveIntervals::Interval*> IntervalPtrs;
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000044 IntervalPtrs unhandled_, fixed_, active_, inactive_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000045
46 typedef std::vector<unsigned> Regs;
47 Regs tempUseOperands_;
48 Regs tempDefOperands_;
49
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +000050 typedef std::vector<bool> RegMask;
51 RegMask reserved_;
52
53 unsigned regUse_[MRegisterInfo::FirstVirtualRegister];
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +000054 unsigned regUseBackup_[MRegisterInfo::FirstVirtualRegister];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000055
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000056 typedef std::map<unsigned, unsigned> Virt2PhysMap;
57 Virt2PhysMap v2pMap_;
58
59 typedef std::map<unsigned, int> Virt2StackSlotMap;
60 Virt2StackSlotMap v2ssMap_;
61
62 int instrAdded_;
63
64 public:
65 virtual const char* getPassName() const {
66 return "Linear Scan Register Allocator";
67 }
68
69 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
70 AU.addRequired<LiveVariables>();
71 AU.addRequired<LiveIntervals>();
72 MachineFunctionPass::getAnalysisUsage(AU);
73 }
74
75 private:
76 /// runOnMachineFunction - register allocate the whole function
77 bool runOnMachineFunction(MachineFunction&);
78
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000079 /// initIntervalSets - initializa the four interval sets:
80 /// unhandled, fixed, active and inactive
81 void initIntervalSets(const LiveIntervals::Intervals& li);
82
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000083 /// processActiveIntervals - expire old intervals and move
84 /// non-overlapping ones to the incative list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000085 void processActiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000086
87 /// processInactiveIntervals - expire old intervals and move
88 /// overlapping ones to the active list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000089 void processInactiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000090
91 /// assignStackSlotAtInterval - choose and spill
92 /// interval. Currently we spill the interval with the last
93 /// end point in the active and inactive lists and the current
94 /// interval
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000095 void assignStackSlotAtInterval(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000096
97 ///
98 /// register handling helpers
99 ///
100
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000101 /// getFreePhysReg - return a free physical register for this
102 /// virtual register interval if we have one, otherwise return
103 /// 0
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000104 unsigned getFreePhysReg(IntervalPtrs::value_type cur);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000105
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000106 /// physRegAvailable - returns true if the specifed physical
107 /// register is available
108 bool physRegAvailable(unsigned physReg);
109
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000110 /// tempPhysRegAvailable - returns true if the specifed
111 /// temporary physical register is available
112 bool tempPhysRegAvailable(unsigned physReg);
113
114 /// getFreeTempPhysReg - return a free temprorary physical
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000115 /// register for this virtual register if we have one (should
116 /// never return 0)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000117 unsigned getFreeTempPhysReg(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000118
119 /// assignVirt2PhysReg - assigns the free physical register to
120 /// the virtual register passed as arguments
121 void assignVirt2PhysReg(unsigned virtReg, unsigned physReg);
122
123 /// clearVirtReg - free the physical register associated with this
124 /// virtual register and disassociate virtual->physical and
125 /// physical->virtual mappings
126 void clearVirtReg(unsigned virtReg);
127
128 /// assignVirt2StackSlot - assigns this virtual register to a
129 /// stack slot
130 void assignVirt2StackSlot(unsigned virtReg);
131
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000132 /// getStackSlot - returns the offset of the specified
133 /// register on the stack
134 int getStackSlot(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000135
136 /// spillVirtReg - spills the virtual register
137 void spillVirtReg(unsigned virtReg);
138
139 /// loadPhysReg - loads to the physical register the value of
140 /// the virtual register specifed. Virtual register must have
141 /// an assigned stack slot
142 void loadVirt2PhysReg(unsigned virtReg, unsigned physReg);
143
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000144 void markPhysRegFree(unsigned physReg);
145 void markPhysRegNotFree(unsigned physReg);
146
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000147 void backupRegUse() {
148 memcpy(regUseBackup_, regUse_, sizeof(regUseBackup_));
149 }
150
151 void restoreRegUse() {
152 memcpy(regUse_, regUseBackup_, sizeof(regUseBackup_));
153 }
154
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000155 void printVirt2PhysMap() const {
156 std::cerr << "allocated registers:\n";
157 for (Virt2PhysMap::const_iterator
158 i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
159 std::cerr << '[' << i->first << ','
160 << mri_->getName(i->second) << "]\n";
161 }
162 std::cerr << '\n';
163 }
164 void printIntervals(const char* const str,
165 RA::IntervalPtrs::const_iterator i,
166 RA::IntervalPtrs::const_iterator e) const {
167 if (str) std::cerr << str << " intervals:\n";
168 for (; i != e; ++i) {
169 std::cerr << "\t\t" << **i << " -> ";
170 if ((*i)->reg < MRegisterInfo::FirstVirtualRegister) {
171 std::cerr << mri_->getName((*i)->reg);
172 }
173 else {
174 std::cerr << mri_->getName(v2pMap_.find((*i)->reg)->second);
175 }
176 std::cerr << '\n';
177 }
178 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000179 void printFreeRegs(const char* const str,
180 const TargetRegisterClass* rc) const {
181 if (str) std::cerr << str << ':';
182 for (TargetRegisterClass::iterator i =
183 rc->allocation_order_begin(*mf_);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000184 i != rc->allocation_order_end(*mf_); ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000185 unsigned reg = *i;
186 if (!regUse_[reg]) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000187 std::cerr << ' ' << mri_->getName(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000188 if (reserved_[reg]) std::cerr << "*";
189 }
190 }
191 std::cerr << '\n';
192 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000193 };
194}
195
196bool RA::runOnMachineFunction(MachineFunction &fn) {
197 mf_ = &fn;
198 tm_ = &fn.getTarget();
199 mri_ = tm_->getRegisterInfo();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000200
201 initIntervalSets(getAnalysis<LiveIntervals>().getIntervals());
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000202
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000203 v2pMap_.clear();
204 v2ssMap_.clear();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000205 memset(regUse_, 0, sizeof(regUse_));
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000206 memset(regUseBackup_, 0, sizeof(regUseBackup_));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000207
208 // FIXME: this will work only for the X86 backend. I need to
209 // device an algorthm to select the minimal (considering register
210 // aliasing) number of temp registers to reserve so that we have 2
211 // registers for each register class available.
212
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000213 // reserve R8: CH, CL
214 // R16: CX, DI,
215 // R32: ECX, EDI,
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000216 // RFP: FP5, FP6
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000217 reserved_.assign(MRegisterInfo::FirstVirtualRegister, false);
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000218 reserved_[ 8] = true; /* CH */
219 reserved_[ 9] = true; /* CL */
220 reserved_[10] = true; /* CX */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000221 reserved_[12] = true; /* DI */
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000222 reserved_[18] = true; /* ECX */
223 reserved_[19] = true; /* EDI */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000224 reserved_[28] = true; /* FP5 */
225 reserved_[29] = true; /* FP6 */
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000226
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000227 // linear scan algorithm
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000228
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000229 DEBUG(printIntervals("\tunhandled", unhandled_.begin(), unhandled_.end()));
230 DEBUG(printIntervals("\tfixed", fixed_.begin(), fixed_.end()));
231 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
232 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end()));
233
234 while (!unhandled_.empty() || !fixed_.empty()) {
235 // pick the interval with the earliest start point
236 IntervalPtrs::value_type cur;
237 if (fixed_.empty()) {
238 cur = unhandled_.front();
239 unhandled_.erase(unhandled_.begin());
240 }
241 else if (unhandled_.empty()) {
242 cur = fixed_.front();
243 fixed_.erase(fixed_.begin());
244 }
245 else if (unhandled_.front()->start() < fixed_.front()->start()) {
246 cur = unhandled_.front();
247 unhandled_.erase(unhandled_.begin());
248 }
249 else {
250 cur = fixed_.front();
251 fixed_.erase(fixed_.begin());
252 }
253
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000254 DEBUG(std::cerr << *cur << '\n');
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000255
256 processActiveIntervals(cur);
257 processInactiveIntervals(cur);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000258
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000259 // if this register is fixed we are done
260 if (cur->reg < MRegisterInfo::FirstVirtualRegister) {
261 markPhysRegNotFree(cur->reg);
262 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000263 }
264 // otherwise we are allocating a virtual register. try to find
265 // a free physical register or spill an interval in order to
266 // assign it one (we could spill the current though).
267 else {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000268 backupRegUse();
269
270 // for every interval in inactive we overlap with, mark the
271 // register as not free
272 for (IntervalPtrs::const_iterator i = inactive_.begin(),
273 e = inactive_.end(); i != e; ++i) {
274 unsigned reg = (*i)->reg;
275 if (reg >= MRegisterInfo::FirstVirtualRegister)
276 reg = v2pMap_[reg];
277
278 if (cur->overlaps(**i)) {
279 markPhysRegNotFree(reg);
280 }
281 }
282
283 // for every interval in fixed we overlap with,
284 // mark the register as not free
285 for (IntervalPtrs::const_iterator i = fixed_.begin(),
286 e = fixed_.end(); i != e; ++i) {
287 assert((*i)->reg < MRegisterInfo::FirstVirtualRegister &&
288 "virtual register interval in fixed set?");
289 if (cur->overlaps(**i))
290 markPhysRegNotFree((*i)->reg);
291 }
292
293 DEBUG(std::cerr << "\tallocating current interval:\n");
294
295 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000296 if (!physReg) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000297 assignStackSlotAtInterval(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000298 }
299 else {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000300 restoreRegUse();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000301 assignVirt2PhysReg(cur->reg, physReg);
302 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000303 }
304 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000305
306 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
307 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end())); }
308
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000309 // expire any remaining active intervals
310 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ++i) {
311 unsigned reg = (*i)->reg;
312 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000313 if (reg >= MRegisterInfo::FirstVirtualRegister) {
314 reg = v2pMap_[reg];
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000315 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000316 markPhysRegFree(reg);
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000317 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000318 active_.clear();
319 inactive_.clear();
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000320
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000321 DEBUG(std::cerr << "finished register allocation\n");
322 DEBUG(printVirt2PhysMap());
323
324 DEBUG(std::cerr << "Rewrite machine code:\n");
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000325 for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000326 instrAdded_ = 0;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000327
328 for (currentInstr_ = currentMbb_->begin();
329 currentInstr_ != currentMbb_->end(); ++currentInstr_) {
330
331 DEBUG(std::cerr << "\tinstruction: ";
332 (*currentInstr_)->print(std::cerr, *tm_););
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000333
334 // use our current mapping and actually replace and
335 // virtual register with its allocated physical registers
336 DEBUG(std::cerr << "\t\treplacing virtual registers with mapped "
337 "physical registers:\n");
338 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
339 i != e; ++i) {
340 MachineOperand& op = (*currentInstr_)->getOperand(i);
341 if (op.isVirtualRegister()) {
342 unsigned virtReg = op.getAllocatedRegNum();
343 unsigned physReg = v2pMap_[virtReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000344 if (physReg) {
345 DEBUG(std::cerr << "\t\t\t%reg" << virtReg
346 << " -> " << mri_->getName(physReg) << '\n');
347 (*currentInstr_)->SetMachineOperandReg(i, physReg);
348 }
349 }
350 }
351
352 DEBUG(std::cerr << "\t\tloading temporarily used operands to "
353 "registers:\n");
354 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
355 i != e; ++i) {
356 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenosa71e05a2003-12-18 13:15:02 +0000357 if (op.isVirtualRegister() && op.isUse() && !op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000358 unsigned virtReg = op.getAllocatedRegNum();
359 unsigned physReg = v2pMap_[virtReg];
360 if (!physReg) {
361 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000362 loadVirt2PhysReg(virtReg, physReg);
363 tempUseOperands_.push_back(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000364 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000365 (*currentInstr_)->SetMachineOperandReg(i, physReg);
366 }
367 }
368
369 DEBUG(std::cerr << "\t\tclearing temporarily used operands:\n");
370 for (unsigned i = 0, e = tempUseOperands_.size(); i != e; ++i) {
371 clearVirtReg(tempUseOperands_[i]);
372 }
373 tempUseOperands_.clear();
374
375 DEBUG(std::cerr << "\t\tassigning temporarily defined operands to "
376 "registers:\n");
377 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
378 i != e; ++i) {
379 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000380 if (op.isVirtualRegister() && op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000381 unsigned virtReg = op.getAllocatedRegNum();
382 unsigned physReg = v2pMap_[virtReg];
383 if (!physReg) {
384 physReg = getFreeTempPhysReg(virtReg);
385 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000386 if (op.isUse()) { // def and use
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000387 loadVirt2PhysReg(virtReg, physReg);
388 }
389 else {
390 assignVirt2PhysReg(virtReg, physReg);
391 }
392 tempDefOperands_.push_back(virtReg);
393 (*currentInstr_)->SetMachineOperandReg(i, physReg);
394 }
395 }
396
Alkis Evlogimenos58587072003-11-30 23:40:39 +0000397 DEBUG(std::cerr << "\t\tspilling temporarily defined operands "
398 "of this instruction:\n");
399 ++currentInstr_; // we want to insert after this instruction
400 for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) {
401 spillVirtReg(tempDefOperands_[i]);
402 }
403 --currentInstr_; // restore currentInstr_ iterator
404 tempDefOperands_.clear();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000405 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000406 }
407
408 return true;
409}
410
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000411void RA::initIntervalSets(const LiveIntervals::Intervals& li)
412{
413 assert(unhandled_.empty() && fixed_.empty() &&
414 active_.empty() && inactive_.empty() &&
415 "interval sets should be empty on initialization");
416
417 for (LiveIntervals::Intervals::const_iterator i = li.begin(), e = li.end();
418 i != e; ++i) {
419 if (i->reg < MRegisterInfo::FirstVirtualRegister)
420 fixed_.push_back(&*i);
421 else
422 unhandled_.push_back(&*i);
423 }
424}
425
426void RA::processActiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000427{
428 DEBUG(std::cerr << "\tprocessing active intervals:\n");
429 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
430 unsigned reg = (*i)->reg;
431 // remove expired intervals. we expire earlier because this if
432 // an interval expires this is going to be the last use. in
433 // this case we can reuse the register for a def in the same
434 // instruction
Alkis Evlogimenos485ec3c2003-12-18 08:56:11 +0000435 if ((*i)->expiredAt(cur->start() + 1)) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000436 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000437 if (reg >= MRegisterInfo::FirstVirtualRegister) {
438 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000439 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000440 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000441 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000442 i = active_.erase(i);
443 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000444 // move inactive intervals to inactive list
445 else if (!(*i)->liveAt(cur->start())) {
446 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000447 if (reg >= MRegisterInfo::FirstVirtualRegister) {
448 reg = v2pMap_[reg];
449 }
450 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000451 // add to inactive
452 inactive_.push_back(*i);
453 // remove from active
454 i = active_.erase(i);
455 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000456 else {
457 ++i;
458 }
459 }
460}
461
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000462void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000463{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000464 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
465 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
466 unsigned reg = (*i)->reg;
467
468 // remove expired intervals. we expire earlier because this if
469 // an interval expires this is going to be the last use. in
470 // this case we can reuse the register for a def in the same
471 // instruction
472 if ((*i)->expiredAt(cur->start() + 1)) {
473 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000474 // remove from inactive
475 i = inactive_.erase(i);
476 }
477 // move re-activated intervals in active list
478 else if ((*i)->liveAt(cur->start())) {
479 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000480 if (reg >= MRegisterInfo::FirstVirtualRegister) {
481 reg = v2pMap_[reg];
482 }
483 markPhysRegNotFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000484 // add to active
485 active_.push_back(*i);
486 // remove from inactive
487 i = inactive_.erase(i);
488 }
489 else {
490 ++i;
491 }
492 }
493}
494
495namespace {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000496 template <typename T>
497 void updateWeight(T rw[], int reg, T w)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000498 {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000499 if (rw[reg] == std::numeric_limits<T>::max() ||
500 w == std::numeric_limits<T>::max())
501 rw[reg] = std::numeric_limits<T>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000502 else
503 rw[reg] += w;
504 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000505}
506
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000507void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000508{
509 DEBUG(std::cerr << "\t\tassigning stack slot at interval "
510 << *cur << ":\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000511
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000512 // set all weights to zero
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000513 float regWeight[MRegisterInfo::FirstVirtualRegister];
514 for (unsigned i = 0; i < MRegisterInfo::FirstVirtualRegister; ++i)
515 regWeight[i] = 0.0F;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000516
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000517 // for each interval in active that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000518 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
519 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000520 if (!cur->overlaps(**i))
521 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000522
523 unsigned reg = (*i)->reg;
524 if (reg >= MRegisterInfo::FirstVirtualRegister) {
525 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000526 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000527 updateWeight(regWeight, reg, (*i)->weight);
528 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
529 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000530 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000531
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000532 // for each interval in inactive that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000533 for (IntervalPtrs::const_iterator i = inactive_.begin(),
534 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000535 if (!cur->overlaps(**i))
536 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000537
538 unsigned reg = (*i)->reg;
539 if (reg >= MRegisterInfo::FirstVirtualRegister) {
540 reg = v2pMap_[reg];
541 }
542 updateWeight(regWeight, reg, (*i)->weight);
543 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
544 updateWeight(regWeight, *as, (*i)->weight);
545 }
546
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000547 // for each fixed interval that overlaps
548 for (IntervalPtrs::const_iterator i = fixed_.begin(), e = fixed_.end();
549 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000550 if (!cur->overlaps(**i))
551 continue;
Alkis Evlogimenosf7df173e2004-01-13 20:37:01 +0000552
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000553 assert((*i)->reg < MRegisterInfo::FirstVirtualRegister &&
554 "virtual register interval in fixed set?");
555 updateWeight(regWeight, (*i)->reg, (*i)->weight);
556 for (const unsigned* as = mri_->getAliasSet((*i)->reg); *as; ++as)
557 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000558 }
559
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000560 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000561 unsigned minReg = 0;
562 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
563 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
564 i != rc->allocation_order_end(*mf_); ++i) {
565 unsigned reg = *i;
566 if (!reserved_[reg] && minWeight > regWeight[reg]) {
567 minWeight = regWeight[reg];
568 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000569 }
570 }
571
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000572 if (cur->weight < minWeight) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000573 restoreRegUse();
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000574 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000575 assignVirt2StackSlot(cur->reg);
576 }
577 else {
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000578 DEBUG(std::cerr << "\t\t\t\tfreeing: " << mri_->getName(minReg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000579 std::set<unsigned> toSpill;
580 toSpill.insert(minReg);
581 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
582 toSpill.insert(*as);
583
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000584 std::vector<unsigned> spilled;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000585 for (IntervalPtrs::iterator i = active_.begin();
586 i != active_.end(); ) {
587 unsigned reg = (*i)->reg;
588 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000589 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
590 cur->overlaps(**i)) {
591 spilled.push_back(v2pMap_[reg]);
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000592 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000593 assignVirt2StackSlot(reg);
594 i = active_.erase(i);
595 }
596 else {
597 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000598 }
599 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000600 for (IntervalPtrs::iterator i = inactive_.begin();
601 i != inactive_.end(); ) {
602 unsigned reg = (*i)->reg;
603 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000604 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
605 cur->overlaps(**i)) {
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000606 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000607 assignVirt2StackSlot(reg);
608 i = inactive_.erase(i);
609 }
610 else {
611 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000612 }
613 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000614
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000615 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000616 assert(physReg && "no free physical register after spill?");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000617
618 restoreRegUse();
619 for (unsigned i = 0; i < spilled.size(); ++i)
620 markPhysRegFree(spilled[i]);
621
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000622 assignVirt2PhysReg(cur->reg, physReg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000623 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000624 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000625}
626
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000627bool RA::physRegAvailable(unsigned physReg)
628{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000629 assert(!reserved_[physReg] &&
630 "cannot call this method with a reserved register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000631
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000632 return !regUse_[physReg];
633}
634
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000635unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000636{
637 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000638 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000639
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000640 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
641 i != rc->allocation_order_end(*mf_); ++i) {
642 unsigned reg = *i;
643 if (!reserved_[reg] && !regUse_[reg]) {
644 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000645 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000646 }
647 }
648
649 DEBUG(std::cerr << "no free register\n");
650 return 0;
651}
652
653bool RA::tempPhysRegAvailable(unsigned physReg)
654{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000655 assert(reserved_[physReg] &&
656 "cannot call this method with a not reserved temp register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000657
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000658 return !regUse_[physReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000659}
660
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000661unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000662{
663 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
664
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000665 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
666 // go in reverse allocation order for the temp registers
667 for (TargetRegisterClass::iterator i = rc->allocation_order_end(*mf_) - 1;
668 i != rc->allocation_order_begin(*mf_) - 1; --i) {
669 unsigned reg = *i;
670 if (reserved_[reg] && !regUse_[reg]) {
671 DEBUG(std::cerr << mri_->getName(reg) << '\n');
672 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000673 }
674 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000675
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000676 assert(0 && "no free temporary physical register?");
677 return 0;
678}
679
680void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
681{
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000682 v2pMap_[virtReg] = physReg;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000683 markPhysRegNotFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000684}
685
686void RA::clearVirtReg(unsigned virtReg)
687{
688 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
689 assert(it != v2pMap_.end() &&
690 "attempting to clear a not allocated virtual register");
691 unsigned physReg = it->second;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000692 markPhysRegFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000693 v2pMap_[virtReg] = 0; // this marks that this virtual register
694 // lives on the stack
695 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
696 << "\n");
697}
698
699void RA::assignVirt2StackSlot(unsigned virtReg)
700{
701 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
702 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
703
704 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
705 assert(inserted &&
706 "attempt to assign stack slot to already assigned register?");
707 // if the virtual register was previously assigned clear the mapping
708 // and free the virtual register
709 if (v2pMap_.find(virtReg) != v2pMap_.end()) {
710 clearVirtReg(virtReg);
711 }
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000712 else {
713 v2pMap_[virtReg] = 0; // this marks that this virtual register
714 // lives on the stack
715 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000716}
717
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000718int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000719{
720 // use lower_bound so that we can do a possibly O(1) insert later
721 // if necessary
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000722 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
723 assert(it != v2ssMap_.end() &&
724 "attempt to get stack slot on register that does not live on the stack");
725 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000726}
727
728void RA::spillVirtReg(unsigned virtReg)
729{
730 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
731 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000732 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000733 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
734 ++numSpilled;
735 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
736 v2pMap_[virtReg], frameIndex, rc);
737 clearVirtReg(virtReg);
738}
739
740void RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
741{
742 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
743 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000744 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000745 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000746 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000747 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
748 physReg, frameIndex, rc);
749 assignVirt2PhysReg(virtReg, physReg);
750}
751
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000752void RA::markPhysRegFree(unsigned physReg)
753{
754 assert(regUse_[physReg] != 0);
755 --regUse_[physReg];
756 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
757 physReg = *as;
758 assert(regUse_[physReg] != 0);
759 --regUse_[physReg];
760 }
761}
762
763void RA::markPhysRegNotFree(unsigned physReg)
764{
765 ++regUse_[physReg];
766 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
767 physReg = *as;
768 ++regUse_[physReg];
769 }
770}
771
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000772FunctionPass* llvm::createLinearScanRegisterAllocator() {
773 return new RA();
774}