blob: abd139009314fb67fafba812071dee00d4dcd4c3 [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;
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000431 // remove expired intervals
432 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000433 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000434 if (reg >= MRegisterInfo::FirstVirtualRegister) {
435 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000436 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000437 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000438 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000439 i = active_.erase(i);
440 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000441 // move inactive intervals to inactive list
442 else if (!(*i)->liveAt(cur->start())) {
443 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000444 if (reg >= MRegisterInfo::FirstVirtualRegister) {
445 reg = v2pMap_[reg];
446 }
447 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000448 // add to inactive
449 inactive_.push_back(*i);
450 // remove from active
451 i = active_.erase(i);
452 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000453 else {
454 ++i;
455 }
456 }
457}
458
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000459void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000460{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000461 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
462 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
463 unsigned reg = (*i)->reg;
464
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000465 // remove expired intervals
466 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000467 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000468 // remove from inactive
469 i = inactive_.erase(i);
470 }
471 // move re-activated intervals in active list
472 else if ((*i)->liveAt(cur->start())) {
473 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000474 if (reg >= MRegisterInfo::FirstVirtualRegister) {
475 reg = v2pMap_[reg];
476 }
477 markPhysRegNotFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000478 // add to active
479 active_.push_back(*i);
480 // remove from inactive
481 i = inactive_.erase(i);
482 }
483 else {
484 ++i;
485 }
486 }
487}
488
489namespace {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000490 template <typename T>
491 void updateWeight(T rw[], int reg, T w)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000492 {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000493 if (rw[reg] == std::numeric_limits<T>::max() ||
494 w == std::numeric_limits<T>::max())
495 rw[reg] = std::numeric_limits<T>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000496 else
497 rw[reg] += w;
498 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000499}
500
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000501void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000502{
503 DEBUG(std::cerr << "\t\tassigning stack slot at interval "
504 << *cur << ":\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000505
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000506 // set all weights to zero
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000507 float regWeight[MRegisterInfo::FirstVirtualRegister];
508 for (unsigned i = 0; i < MRegisterInfo::FirstVirtualRegister; ++i)
509 regWeight[i] = 0.0F;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000510
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000511 // for each interval in active that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000512 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
513 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000514 if (!cur->overlaps(**i))
515 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000516
517 unsigned reg = (*i)->reg;
518 if (reg >= MRegisterInfo::FirstVirtualRegister) {
519 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000520 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000521 updateWeight(regWeight, reg, (*i)->weight);
522 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
523 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000524 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000525
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000526 // for each interval in inactive that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000527 for (IntervalPtrs::const_iterator i = inactive_.begin(),
528 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000529 if (!cur->overlaps(**i))
530 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000531
532 unsigned reg = (*i)->reg;
533 if (reg >= MRegisterInfo::FirstVirtualRegister) {
534 reg = v2pMap_[reg];
535 }
536 updateWeight(regWeight, reg, (*i)->weight);
537 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
538 updateWeight(regWeight, *as, (*i)->weight);
539 }
540
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000541 // for each fixed interval that overlaps
542 for (IntervalPtrs::const_iterator i = fixed_.begin(), e = fixed_.end();
543 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000544 if (!cur->overlaps(**i))
545 continue;
Alkis Evlogimenosf7df173e2004-01-13 20:37:01 +0000546
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000547 assert((*i)->reg < MRegisterInfo::FirstVirtualRegister &&
548 "virtual register interval in fixed set?");
549 updateWeight(regWeight, (*i)->reg, (*i)->weight);
550 for (const unsigned* as = mri_->getAliasSet((*i)->reg); *as; ++as)
551 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000552 }
553
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000554 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000555 unsigned minReg = 0;
556 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
557 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
558 i != rc->allocation_order_end(*mf_); ++i) {
559 unsigned reg = *i;
560 if (!reserved_[reg] && minWeight > regWeight[reg]) {
561 minWeight = regWeight[reg];
562 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000563 }
564 }
565
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000566 if (cur->weight < minWeight) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000567 restoreRegUse();
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000568 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000569 assignVirt2StackSlot(cur->reg);
570 }
571 else {
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000572 DEBUG(std::cerr << "\t\t\t\tfreeing: " << mri_->getName(minReg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000573 std::set<unsigned> toSpill;
574 toSpill.insert(minReg);
575 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
576 toSpill.insert(*as);
577
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000578 std::vector<unsigned> spilled;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000579 for (IntervalPtrs::iterator i = active_.begin();
580 i != active_.end(); ) {
581 unsigned reg = (*i)->reg;
582 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000583 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
584 cur->overlaps(**i)) {
585 spilled.push_back(v2pMap_[reg]);
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000586 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000587 assignVirt2StackSlot(reg);
588 i = active_.erase(i);
589 }
590 else {
591 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000592 }
593 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000594 for (IntervalPtrs::iterator i = inactive_.begin();
595 i != inactive_.end(); ) {
596 unsigned reg = (*i)->reg;
597 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000598 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
599 cur->overlaps(**i)) {
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000600 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000601 assignVirt2StackSlot(reg);
602 i = inactive_.erase(i);
603 }
604 else {
605 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000606 }
607 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000608
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000609 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000610 assert(physReg && "no free physical register after spill?");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000611
612 restoreRegUse();
613 for (unsigned i = 0; i < spilled.size(); ++i)
614 markPhysRegFree(spilled[i]);
615
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000616 assignVirt2PhysReg(cur->reg, physReg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000617 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000618 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000619}
620
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000621bool RA::physRegAvailable(unsigned physReg)
622{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000623 assert(!reserved_[physReg] &&
624 "cannot call this method with a reserved register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000625
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000626 return !regUse_[physReg];
627}
628
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000629unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000630{
631 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000632 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000633
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000634 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
635 i != rc->allocation_order_end(*mf_); ++i) {
636 unsigned reg = *i;
637 if (!reserved_[reg] && !regUse_[reg]) {
638 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000639 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000640 }
641 }
642
643 DEBUG(std::cerr << "no free register\n");
644 return 0;
645}
646
647bool RA::tempPhysRegAvailable(unsigned physReg)
648{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000649 assert(reserved_[physReg] &&
650 "cannot call this method with a not reserved temp register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000651
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000652 return !regUse_[physReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000653}
654
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000655unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000656{
657 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
658
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000659 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
660 // go in reverse allocation order for the temp registers
661 for (TargetRegisterClass::iterator i = rc->allocation_order_end(*mf_) - 1;
662 i != rc->allocation_order_begin(*mf_) - 1; --i) {
663 unsigned reg = *i;
664 if (reserved_[reg] && !regUse_[reg]) {
665 DEBUG(std::cerr << mri_->getName(reg) << '\n');
666 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000667 }
668 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000669
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000670 assert(0 && "no free temporary physical register?");
671 return 0;
672}
673
674void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
675{
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000676 v2pMap_[virtReg] = physReg;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000677 markPhysRegNotFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000678}
679
680void RA::clearVirtReg(unsigned virtReg)
681{
682 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
683 assert(it != v2pMap_.end() &&
684 "attempting to clear a not allocated virtual register");
685 unsigned physReg = it->second;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000686 markPhysRegFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000687 v2pMap_[virtReg] = 0; // this marks that this virtual register
688 // lives on the stack
689 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
690 << "\n");
691}
692
693void RA::assignVirt2StackSlot(unsigned virtReg)
694{
695 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
696 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
697
698 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
699 assert(inserted &&
700 "attempt to assign stack slot to already assigned register?");
701 // if the virtual register was previously assigned clear the mapping
702 // and free the virtual register
703 if (v2pMap_.find(virtReg) != v2pMap_.end()) {
704 clearVirtReg(virtReg);
705 }
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000706 else {
707 v2pMap_[virtReg] = 0; // this marks that this virtual register
708 // lives on the stack
709 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000710}
711
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000712int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000713{
714 // use lower_bound so that we can do a possibly O(1) insert later
715 // if necessary
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000716 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
717 assert(it != v2ssMap_.end() &&
718 "attempt to get stack slot on register that does not live on the stack");
719 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000720}
721
722void RA::spillVirtReg(unsigned virtReg)
723{
724 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
725 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000726 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000727 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
728 ++numSpilled;
729 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
730 v2pMap_[virtReg], frameIndex, rc);
731 clearVirtReg(virtReg);
732}
733
734void RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
735{
736 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
737 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000738 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000739 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000740 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000741 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
742 physReg, frameIndex, rc);
743 assignVirt2PhysReg(virtReg, physReg);
744}
745
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000746void RA::markPhysRegFree(unsigned physReg)
747{
748 assert(regUse_[physReg] != 0);
749 --regUse_[physReg];
750 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
751 physReg = *as;
752 assert(regUse_[physReg] != 0);
753 --regUse_[physReg];
754 }
755}
756
757void RA::markPhysRegNotFree(unsigned physReg)
758{
759 ++regUse_[physReg];
760 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
761 physReg = *as;
762 ++regUse_[physReg];
763 }
764}
765
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000766FunctionPass* llvm::createLinearScanRegisterAllocator() {
767 return new RA();
768}