blob: 5f1290d233cff694b1841d5ad4057320f1ad98d4 [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 Evlogimenosce501152004-01-22 19:24:43 +0000155 void printVirtRegAssignment() const {
156 std::cerr << "register assignment:\n";
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000157 for (Virt2PhysMap::const_iterator
158 i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000159 assert(i->second != 0);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000160 std::cerr << '[' << i->first << ','
161 << mri_->getName(i->second) << "]\n";
162 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000163 for (Virt2StackSlotMap::const_iterator
164 i = v2ssMap_.begin(), e = v2ssMap_.end(); i != e; ++i) {
165 std::cerr << '[' << i->first << ",ss#" << i->second << "]\n";
166 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000167 std::cerr << '\n';
168 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000169
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000170 void printIntervals(const char* const str,
171 RA::IntervalPtrs::const_iterator i,
172 RA::IntervalPtrs::const_iterator e) const {
173 if (str) std::cerr << str << " intervals:\n";
174 for (; i != e; ++i) {
175 std::cerr << "\t\t" << **i << " -> ";
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000176 unsigned reg = (*i)->reg;
177 if (reg >= MRegisterInfo::FirstVirtualRegister) {
178 Virt2PhysMap::const_iterator it = v2pMap_.find(reg);
179 reg = (it == v2pMap_.end() ? 0 : it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000180 }
Alkis Evlogimenosa12c7bb2004-01-16 20:33:13 +0000181 std::cerr << mri_->getName(reg) << '\n';
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000182 }
183 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000184
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000185 void printFreeRegs(const char* const str,
186 const TargetRegisterClass* rc) const {
187 if (str) std::cerr << str << ':';
188 for (TargetRegisterClass::iterator i =
189 rc->allocation_order_begin(*mf_);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000190 i != rc->allocation_order_end(*mf_); ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000191 unsigned reg = *i;
192 if (!regUse_[reg]) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000193 std::cerr << ' ' << mri_->getName(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000194 if (reserved_[reg]) std::cerr << "*";
195 }
196 }
197 std::cerr << '\n';
198 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000199 };
200}
201
202bool RA::runOnMachineFunction(MachineFunction &fn) {
203 mf_ = &fn;
204 tm_ = &fn.getTarget();
205 mri_ = tm_->getRegisterInfo();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000206
207 initIntervalSets(getAnalysis<LiveIntervals>().getIntervals());
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000208
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000209 v2pMap_.clear();
210 v2ssMap_.clear();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000211 memset(regUse_, 0, sizeof(regUse_));
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000212 memset(regUseBackup_, 0, sizeof(regUseBackup_));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000213
214 // FIXME: this will work only for the X86 backend. I need to
215 // device an algorthm to select the minimal (considering register
216 // aliasing) number of temp registers to reserve so that we have 2
217 // registers for each register class available.
218
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000219 // reserve R8: CH, CL
220 // R16: CX, DI,
221 // R32: ECX, EDI,
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000222 // RFP: FP5, FP6
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000223 reserved_.assign(MRegisterInfo::FirstVirtualRegister, false);
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000224 reserved_[ 8] = true; /* CH */
225 reserved_[ 9] = true; /* CL */
226 reserved_[10] = true; /* CX */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000227 reserved_[12] = true; /* DI */
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000228 reserved_[18] = true; /* ECX */
229 reserved_[19] = true; /* EDI */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000230 reserved_[28] = true; /* FP5 */
231 reserved_[29] = true; /* FP6 */
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000232
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000233 // linear scan algorithm
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000234
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000235 DEBUG(printIntervals("\tunhandled", unhandled_.begin(), unhandled_.end()));
236 DEBUG(printIntervals("\tfixed", fixed_.begin(), fixed_.end()));
237 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
238 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end()));
239
240 while (!unhandled_.empty() || !fixed_.empty()) {
241 // pick the interval with the earliest start point
242 IntervalPtrs::value_type cur;
243 if (fixed_.empty()) {
244 cur = unhandled_.front();
245 unhandled_.erase(unhandled_.begin());
246 }
247 else if (unhandled_.empty()) {
248 cur = fixed_.front();
249 fixed_.erase(fixed_.begin());
250 }
251 else if (unhandled_.front()->start() < fixed_.front()->start()) {
252 cur = unhandled_.front();
253 unhandled_.erase(unhandled_.begin());
254 }
255 else {
256 cur = fixed_.front();
257 fixed_.erase(fixed_.begin());
258 }
259
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000260 DEBUG(std::cerr << *cur << '\n');
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000261
262 processActiveIntervals(cur);
263 processInactiveIntervals(cur);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000264
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000265 // if this register is fixed we are done
266 if (cur->reg < MRegisterInfo::FirstVirtualRegister) {
267 markPhysRegNotFree(cur->reg);
268 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000269 }
270 // otherwise we are allocating a virtual register. try to find
271 // a free physical register or spill an interval in order to
272 // assign it one (we could spill the current though).
273 else {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000274 backupRegUse();
275
276 // for every interval in inactive we overlap with, mark the
277 // register as not free
278 for (IntervalPtrs::const_iterator i = inactive_.begin(),
279 e = inactive_.end(); i != e; ++i) {
280 unsigned reg = (*i)->reg;
281 if (reg >= MRegisterInfo::FirstVirtualRegister)
282 reg = v2pMap_[reg];
283
284 if (cur->overlaps(**i)) {
285 markPhysRegNotFree(reg);
286 }
287 }
288
289 // for every interval in fixed we overlap with,
290 // mark the register as not free
291 for (IntervalPtrs::const_iterator i = fixed_.begin(),
292 e = fixed_.end(); i != e; ++i) {
293 assert((*i)->reg < MRegisterInfo::FirstVirtualRegister &&
294 "virtual register interval in fixed set?");
295 if (cur->overlaps(**i))
296 markPhysRegNotFree((*i)->reg);
297 }
298
299 DEBUG(std::cerr << "\tallocating current interval:\n");
300
301 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000302 if (!physReg) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000303 assignStackSlotAtInterval(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000304 }
305 else {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000306 restoreRegUse();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000307 assignVirt2PhysReg(cur->reg, physReg);
308 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000309 }
310 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000311
312 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
313 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end())); }
314
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000315 // expire any remaining active intervals
316 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ++i) {
317 unsigned reg = (*i)->reg;
318 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000319 if (reg >= MRegisterInfo::FirstVirtualRegister) {
320 reg = v2pMap_[reg];
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000321 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000322 markPhysRegFree(reg);
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000323 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000324 active_.clear();
325 inactive_.clear();
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000326
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000327 DEBUG(std::cerr << "finished register allocation\n");
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000328 DEBUG(printVirtRegAssignment());
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000329
330 DEBUG(std::cerr << "Rewrite machine code:\n");
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000331 for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000332 instrAdded_ = 0;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000333
334 for (currentInstr_ = currentMbb_->begin();
335 currentInstr_ != currentMbb_->end(); ++currentInstr_) {
336
337 DEBUG(std::cerr << "\tinstruction: ";
338 (*currentInstr_)->print(std::cerr, *tm_););
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000339
340 // use our current mapping and actually replace and
341 // virtual register with its allocated physical registers
342 DEBUG(std::cerr << "\t\treplacing virtual registers with mapped "
343 "physical registers:\n");
344 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
345 i != e; ++i) {
346 MachineOperand& op = (*currentInstr_)->getOperand(i);
347 if (op.isVirtualRegister()) {
348 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000349 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
350 if (it != v2pMap_.end()) {
351 DEBUG(std::cerr << "\t\t\t%reg" << it->second
352 << " -> " << mri_->getName(it->second) << '\n');
353 (*currentInstr_)->SetMachineOperandReg(i, it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000354 }
355 }
356 }
357
358 DEBUG(std::cerr << "\t\tloading temporarily used operands to "
359 "registers:\n");
360 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
361 i != e; ++i) {
362 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenosa71e05a2003-12-18 13:15:02 +0000363 if (op.isVirtualRegister() && op.isUse() && !op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000364 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000365 unsigned physReg = 0;
366 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
367 if (it != v2pMap_.end()) {
368 physReg = it->second;
369 }
370 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000371 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000372 loadVirt2PhysReg(virtReg, physReg);
373 tempUseOperands_.push_back(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000374 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000375 (*currentInstr_)->SetMachineOperandReg(i, physReg);
376 }
377 }
378
379 DEBUG(std::cerr << "\t\tclearing temporarily used operands:\n");
380 for (unsigned i = 0, e = tempUseOperands_.size(); i != e; ++i) {
381 clearVirtReg(tempUseOperands_[i]);
382 }
383 tempUseOperands_.clear();
384
385 DEBUG(std::cerr << "\t\tassigning temporarily defined operands to "
386 "registers:\n");
387 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
388 i != e; ++i) {
389 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000390 if (op.isVirtualRegister() && op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000391 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000392 unsigned physReg = 0;
393 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
394 if (it != v2pMap_.end()) {
395 physReg = it->second;
396 }
397 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000398 physReg = getFreeTempPhysReg(virtReg);
399 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000400 if (op.isUse()) { // def and use
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000401 loadVirt2PhysReg(virtReg, physReg);
402 }
403 else {
404 assignVirt2PhysReg(virtReg, physReg);
405 }
406 tempDefOperands_.push_back(virtReg);
407 (*currentInstr_)->SetMachineOperandReg(i, physReg);
408 }
409 }
410
Alkis Evlogimenos58587072003-11-30 23:40:39 +0000411 DEBUG(std::cerr << "\t\tspilling temporarily defined operands "
412 "of this instruction:\n");
413 ++currentInstr_; // we want to insert after this instruction
414 for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) {
415 spillVirtReg(tempDefOperands_[i]);
416 }
417 --currentInstr_; // restore currentInstr_ iterator
418 tempDefOperands_.clear();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000419 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000420 }
421
422 return true;
423}
424
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000425void RA::initIntervalSets(const LiveIntervals::Intervals& li)
426{
427 assert(unhandled_.empty() && fixed_.empty() &&
428 active_.empty() && inactive_.empty() &&
429 "interval sets should be empty on initialization");
430
431 for (LiveIntervals::Intervals::const_iterator i = li.begin(), e = li.end();
432 i != e; ++i) {
433 if (i->reg < MRegisterInfo::FirstVirtualRegister)
434 fixed_.push_back(&*i);
435 else
436 unhandled_.push_back(&*i);
437 }
438}
439
440void RA::processActiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000441{
442 DEBUG(std::cerr << "\tprocessing active intervals:\n");
443 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
444 unsigned reg = (*i)->reg;
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000445 // remove expired intervals
446 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000447 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000448 if (reg >= MRegisterInfo::FirstVirtualRegister) {
449 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000450 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000451 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000452 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000453 i = active_.erase(i);
454 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000455 // move inactive intervals to inactive list
456 else if (!(*i)->liveAt(cur->start())) {
457 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000458 if (reg >= MRegisterInfo::FirstVirtualRegister) {
459 reg = v2pMap_[reg];
460 }
461 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000462 // add to inactive
463 inactive_.push_back(*i);
464 // remove from active
465 i = active_.erase(i);
466 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000467 else {
468 ++i;
469 }
470 }
471}
472
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000473void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000474{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000475 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
476 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
477 unsigned reg = (*i)->reg;
478
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000479 // remove expired intervals
480 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000481 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000482 // remove from inactive
483 i = inactive_.erase(i);
484 }
485 // move re-activated intervals in active list
486 else if ((*i)->liveAt(cur->start())) {
487 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000488 if (reg >= MRegisterInfo::FirstVirtualRegister) {
489 reg = v2pMap_[reg];
490 }
491 markPhysRegNotFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000492 // add to active
493 active_.push_back(*i);
494 // remove from inactive
495 i = inactive_.erase(i);
496 }
497 else {
498 ++i;
499 }
500 }
501}
502
503namespace {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000504 template <typename T>
505 void updateWeight(T rw[], int reg, T w)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000506 {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000507 if (rw[reg] == std::numeric_limits<T>::max() ||
508 w == std::numeric_limits<T>::max())
509 rw[reg] = std::numeric_limits<T>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000510 else
511 rw[reg] += w;
512 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000513}
514
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000515void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000516{
517 DEBUG(std::cerr << "\t\tassigning stack slot at interval "
518 << *cur << ":\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000519
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000520 // set all weights to zero
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000521 float regWeight[MRegisterInfo::FirstVirtualRegister];
522 for (unsigned i = 0; i < MRegisterInfo::FirstVirtualRegister; ++i)
523 regWeight[i] = 0.0F;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000524
Alkis Evlogimenos84dc5fb2004-01-22 20:07:18 +0000525 // for each interval in active
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000526 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
527 i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000528 unsigned reg = (*i)->reg;
529 if (reg >= MRegisterInfo::FirstVirtualRegister) {
530 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000531 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000532 updateWeight(regWeight, reg, (*i)->weight);
533 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
534 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000535 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000536
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000537 // for each interval in inactive that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000538 for (IntervalPtrs::const_iterator i = inactive_.begin(),
539 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000540 if (!cur->overlaps(**i))
541 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000542
543 unsigned reg = (*i)->reg;
544 if (reg >= MRegisterInfo::FirstVirtualRegister) {
545 reg = v2pMap_[reg];
546 }
547 updateWeight(regWeight, reg, (*i)->weight);
548 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
549 updateWeight(regWeight, *as, (*i)->weight);
550 }
551
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000552 // for each fixed interval that overlaps
553 for (IntervalPtrs::const_iterator i = fixed_.begin(), e = fixed_.end();
554 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000555 if (!cur->overlaps(**i))
556 continue;
Alkis Evlogimenosf7df173e2004-01-13 20:37:01 +0000557
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000558 assert((*i)->reg < MRegisterInfo::FirstVirtualRegister &&
559 "virtual register interval in fixed set?");
560 updateWeight(regWeight, (*i)->reg, (*i)->weight);
561 for (const unsigned* as = mri_->getAliasSet((*i)->reg); *as; ++as)
562 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000563 }
564
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000565 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000566 unsigned minReg = 0;
567 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
568 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
569 i != rc->allocation_order_end(*mf_); ++i) {
570 unsigned reg = *i;
571 if (!reserved_[reg] && minWeight > regWeight[reg]) {
572 minWeight = regWeight[reg];
573 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000574 }
575 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000576 DEBUG(std::cerr << "\t\t\tregister with min weight: "
577 << mri_->getName(minReg) << " (" << minWeight << ")\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000578
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000579 if (cur->weight < minWeight) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000580 restoreRegUse();
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000581 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000582 assignVirt2StackSlot(cur->reg);
583 }
584 else {
585 std::set<unsigned> toSpill;
586 toSpill.insert(minReg);
587 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
588 toSpill.insert(*as);
589
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000590 std::vector<unsigned> spilled;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000591 for (IntervalPtrs::iterator i = active_.begin();
592 i != active_.end(); ) {
593 unsigned reg = (*i)->reg;
594 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000595 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
596 cur->overlaps(**i)) {
597 spilled.push_back(v2pMap_[reg]);
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000598 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000599 assignVirt2StackSlot(reg);
600 i = active_.erase(i);
601 }
602 else {
603 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000604 }
605 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000606 for (IntervalPtrs::iterator i = inactive_.begin();
607 i != inactive_.end(); ) {
608 unsigned reg = (*i)->reg;
609 if (reg >= MRegisterInfo::FirstVirtualRegister &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000610 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
611 cur->overlaps(**i)) {
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000612 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000613 assignVirt2StackSlot(reg);
614 i = inactive_.erase(i);
615 }
616 else {
617 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000618 }
619 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000620
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000621 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000622 assert(physReg && "no free physical register after spill?");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000623
624 restoreRegUse();
625 for (unsigned i = 0; i < spilled.size(); ++i)
626 markPhysRegFree(spilled[i]);
627
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000628 assignVirt2PhysReg(cur->reg, physReg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000629 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000630 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000631}
632
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000633bool RA::physRegAvailable(unsigned physReg)
634{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000635 assert(!reserved_[physReg] &&
636 "cannot call this method with a reserved register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000637
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000638 return !regUse_[physReg];
639}
640
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000641unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000642{
643 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000644 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000645
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000646 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
647 i != rc->allocation_order_end(*mf_); ++i) {
648 unsigned reg = *i;
649 if (!reserved_[reg] && !regUse_[reg]) {
650 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000651 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000652 }
653 }
654
655 DEBUG(std::cerr << "no free register\n");
656 return 0;
657}
658
659bool RA::tempPhysRegAvailable(unsigned physReg)
660{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000661 assert(reserved_[physReg] &&
662 "cannot call this method with a not reserved temp register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000663
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000664 return !regUse_[physReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000665}
666
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000667unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000668{
669 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
670
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000671 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
672 // go in reverse allocation order for the temp registers
673 for (TargetRegisterClass::iterator i = rc->allocation_order_end(*mf_) - 1;
674 i != rc->allocation_order_begin(*mf_) - 1; --i) {
675 unsigned reg = *i;
676 if (reserved_[reg] && !regUse_[reg]) {
677 DEBUG(std::cerr << mri_->getName(reg) << '\n');
678 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000679 }
680 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000681
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000682 assert(0 && "no free temporary physical register?");
683 return 0;
684}
685
686void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
687{
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000688 bool inserted = v2pMap_.insert(std::make_pair(virtReg, physReg)).second;
689 assert(inserted && "attempting to assign a virt->phys mapping to an "
690 "already mapped register");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000691 markPhysRegNotFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000692}
693
694void RA::clearVirtReg(unsigned virtReg)
695{
696 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
697 assert(it != v2pMap_.end() &&
698 "attempting to clear a not allocated virtual register");
699 unsigned physReg = it->second;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000700 markPhysRegFree(physReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000701 v2pMap_.erase(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000702 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
703 << "\n");
704}
705
706void RA::assignVirt2StackSlot(unsigned virtReg)
707{
708 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
709 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
710
711 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
712 assert(inserted &&
713 "attempt to assign stack slot to already assigned register?");
714 // if the virtual register was previously assigned clear the mapping
715 // and free the virtual register
716 if (v2pMap_.find(virtReg) != v2pMap_.end()) {
717 clearVirtReg(virtReg);
718 }
719}
720
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000721int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000722{
723 // use lower_bound so that we can do a possibly O(1) insert later
724 // if necessary
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000725 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
726 assert(it != v2ssMap_.end() &&
727 "attempt to get stack slot on register that does not live on the stack");
728 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000729}
730
731void RA::spillVirtReg(unsigned virtReg)
732{
733 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
734 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000735 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000736 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
737 ++numSpilled;
738 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
739 v2pMap_[virtReg], frameIndex, rc);
740 clearVirtReg(virtReg);
741}
742
743void RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
744{
745 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
746 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000747 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000748 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000749 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000750 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
751 physReg, frameIndex, rc);
752 assignVirt2PhysReg(virtReg, physReg);
753}
754
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000755void RA::markPhysRegFree(unsigned physReg)
756{
757 assert(regUse_[physReg] != 0);
758 --regUse_[physReg];
759 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
760 physReg = *as;
761 assert(regUse_[physReg] != 0);
762 --regUse_[physReg];
763 }
764}
765
766void RA::markPhysRegNotFree(unsigned physReg)
767{
768 ++regUse_[physReg];
769 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
770 physReg = *as;
771 ++regUse_[physReg];
772 }
773}
774
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000775FunctionPass* llvm::createLinearScanRegisterAllocator() {
776 return new RA();
777}