blob: d04bb69fdc5c85219300980681383d0a293b18ed [file] [log] [blame]
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +00001//===-- RegAllocLinearScan.cpp - Linear Scan register allocator -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a linear scan register allocator.
11//
12//===----------------------------------------------------------------------===//
13#define DEBUG_TYPE "regalloc"
14#include "llvm/Function.h"
15#include "llvm/CodeGen/LiveIntervals.h"
16#include "llvm/CodeGen/LiveVariables.h"
17#include "llvm/CodeGen/MachineFrameInfo.h"
18#include "llvm/CodeGen/MachineFunctionPass.h"
19#include "llvm/CodeGen/MachineInstr.h"
20#include "llvm/CodeGen/Passes.h"
21#include "llvm/CodeGen/SSARegMap.h"
22#include "llvm/Target/MRegisterInfo.h"
23#include "llvm/Target/TargetInstrInfo.h"
24#include "llvm/Target/TargetMachine.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000025#include "llvm/Support/CFG.h"
26#include "Support/Debug.h"
27#include "Support/DepthFirstIterator.h"
28#include "Support/Statistic.h"
29#include "Support/STLExtras.h"
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000030using namespace llvm;
31
32namespace {
33 Statistic<> numSpilled ("ra-linearscan", "Number of registers spilled");
Chris Lattner5e46b512003-12-18 20:25:31 +000034 Statistic<> numReloaded("ra-linearscan", "Number of registers reloaded");
Alkis Evlogimenose88280a2004-01-22 23:08:45 +000035 Statistic<> numPeep ("ra-linearscan",
36 "Number of identity moves eliminated");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000037
38 class RA : public MachineFunctionPass {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000039 private:
40 MachineFunction* mf_;
41 const TargetMachine* tm_;
42 const MRegisterInfo* mri_;
Alkis Evlogimenose88280a2004-01-22 23:08:45 +000043 LiveIntervals* li_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +000044 MachineFunction::iterator currentMbb_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000045 MachineBasicBlock::iterator currentInstr_;
Alkis Evlogimenos1283d862004-01-07 05:31:12 +000046 typedef std::vector<const LiveIntervals::Interval*> IntervalPtrs;
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000047 IntervalPtrs unhandled_, fixed_, active_, inactive_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000048
49 typedef std::vector<unsigned> Regs;
50 Regs tempUseOperands_;
51 Regs tempDefOperands_;
52
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +000053 typedef std::vector<bool> RegMask;
54 RegMask reserved_;
55
56 unsigned regUse_[MRegisterInfo::FirstVirtualRegister];
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +000057 unsigned regUseBackup_[MRegisterInfo::FirstVirtualRegister];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000058
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000059 typedef std::map<unsigned, unsigned> Virt2PhysMap;
60 Virt2PhysMap v2pMap_;
61
62 typedef std::map<unsigned, int> Virt2StackSlotMap;
63 Virt2StackSlotMap v2ssMap_;
64
65 int instrAdded_;
66
67 public:
68 virtual const char* getPassName() const {
69 return "Linear Scan Register Allocator";
70 }
71
72 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
73 AU.addRequired<LiveVariables>();
74 AU.addRequired<LiveIntervals>();
75 MachineFunctionPass::getAnalysisUsage(AU);
76 }
77
78 private:
79 /// runOnMachineFunction - register allocate the whole function
80 bool runOnMachineFunction(MachineFunction&);
81
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000082 /// initIntervalSets - initializa the four interval sets:
83 /// unhandled, fixed, active and inactive
84 void initIntervalSets(const LiveIntervals::Intervals& li);
85
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000086 /// processActiveIntervals - expire old intervals and move
87 /// non-overlapping ones to the incative list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000088 void processActiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000089
90 /// processInactiveIntervals - expire old intervals and move
91 /// overlapping ones to the active list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000092 void processInactiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000093
94 /// assignStackSlotAtInterval - choose and spill
95 /// interval. Currently we spill the interval with the last
96 /// end point in the active and inactive lists and the current
97 /// interval
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000098 void assignStackSlotAtInterval(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000099
100 ///
101 /// register handling helpers
102 ///
103
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000104 /// getFreePhysReg - return a free physical register for this
105 /// virtual register interval if we have one, otherwise return
106 /// 0
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000107 unsigned getFreePhysReg(IntervalPtrs::value_type cur);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000108
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000109 /// physRegAvailable - returns true if the specifed physical
110 /// register is available
111 bool physRegAvailable(unsigned physReg);
112
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000113 /// tempPhysRegAvailable - returns true if the specifed
114 /// temporary physical register is available
115 bool tempPhysRegAvailable(unsigned physReg);
116
117 /// getFreeTempPhysReg - return a free temprorary physical
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000118 /// register for this virtual register if we have one (should
119 /// never return 0)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000120 unsigned getFreeTempPhysReg(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000121
122 /// assignVirt2PhysReg - assigns the free physical register to
123 /// the virtual register passed as arguments
124 void assignVirt2PhysReg(unsigned virtReg, unsigned physReg);
125
126 /// clearVirtReg - free the physical register associated with this
127 /// virtual register and disassociate virtual->physical and
128 /// physical->virtual mappings
129 void clearVirtReg(unsigned virtReg);
130
131 /// assignVirt2StackSlot - assigns this virtual register to a
132 /// stack slot
133 void assignVirt2StackSlot(unsigned virtReg);
134
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000135 /// getStackSlot - returns the offset of the specified
136 /// register on the stack
137 int getStackSlot(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000138
139 /// spillVirtReg - spills the virtual register
140 void spillVirtReg(unsigned virtReg);
141
142 /// loadPhysReg - loads to the physical register the value of
143 /// the virtual register specifed. Virtual register must have
144 /// an assigned stack slot
145 void loadVirt2PhysReg(unsigned virtReg, unsigned physReg);
146
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000147 void markPhysRegFree(unsigned physReg);
148 void markPhysRegNotFree(unsigned physReg);
149
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000150 void backupRegUse() {
151 memcpy(regUseBackup_, regUse_, sizeof(regUseBackup_));
152 }
153
154 void restoreRegUse() {
155 memcpy(regUse_, regUseBackup_, sizeof(regUseBackup_));
156 }
157
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000158 void printVirtRegAssignment() const {
159 std::cerr << "register assignment:\n";
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000160 for (Virt2PhysMap::const_iterator
161 i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000162 assert(i->second != 0);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000163 std::cerr << '[' << i->first << ','
164 << mri_->getName(i->second) << "]\n";
165 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000166 for (Virt2StackSlotMap::const_iterator
167 i = v2ssMap_.begin(), e = v2ssMap_.end(); i != e; ++i) {
168 std::cerr << '[' << i->first << ",ss#" << i->second << "]\n";
169 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000170 std::cerr << '\n';
171 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000172
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000173 void printIntervals(const char* const str,
174 RA::IntervalPtrs::const_iterator i,
175 RA::IntervalPtrs::const_iterator e) const {
176 if (str) std::cerr << str << " intervals:\n";
177 for (; i != e; ++i) {
178 std::cerr << "\t\t" << **i << " -> ";
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000179 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000180 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000181 Virt2PhysMap::const_iterator it = v2pMap_.find(reg);
182 reg = (it == v2pMap_.end() ? 0 : it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000183 }
Alkis Evlogimenosa12c7bb2004-01-16 20:33:13 +0000184 std::cerr << mri_->getName(reg) << '\n';
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000185 }
186 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000187
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000188 void printFreeRegs(const char* const str,
189 const TargetRegisterClass* rc) const {
190 if (str) std::cerr << str << ':';
191 for (TargetRegisterClass::iterator i =
192 rc->allocation_order_begin(*mf_);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000193 i != rc->allocation_order_end(*mf_); ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000194 unsigned reg = *i;
195 if (!regUse_[reg]) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000196 std::cerr << ' ' << mri_->getName(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000197 if (reserved_[reg]) std::cerr << "*";
198 }
199 }
200 std::cerr << '\n';
201 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000202 };
203}
204
205bool RA::runOnMachineFunction(MachineFunction &fn) {
206 mf_ = &fn;
207 tm_ = &fn.getTarget();
208 mri_ = tm_->getRegisterInfo();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000209 li_ = &getAnalysis<LiveIntervals>();
210 initIntervalSets(li_->getIntervals());
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000211
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000212 v2pMap_.clear();
213 v2ssMap_.clear();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000214 memset(regUse_, 0, sizeof(regUse_));
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000215 memset(regUseBackup_, 0, sizeof(regUseBackup_));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000216
217 // FIXME: this will work only for the X86 backend. I need to
218 // device an algorthm to select the minimal (considering register
219 // aliasing) number of temp registers to reserve so that we have 2
220 // registers for each register class available.
221
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000222 // reserve R8: CH, CL
223 // R16: CX, DI,
224 // R32: ECX, EDI,
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000225 // RFP: FP5, FP6
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000226 reserved_.assign(MRegisterInfo::FirstVirtualRegister, false);
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000227 reserved_[ 8] = true; /* CH */
228 reserved_[ 9] = true; /* CL */
229 reserved_[10] = true; /* CX */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000230 reserved_[12] = true; /* DI */
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000231 reserved_[18] = true; /* ECX */
232 reserved_[19] = true; /* EDI */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000233 reserved_[28] = true; /* FP5 */
234 reserved_[29] = true; /* FP6 */
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000235
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000236 // linear scan algorithm
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000237 DEBUG(std::cerr << "Machine Function\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000238
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000239 DEBUG(printIntervals("\tunhandled", unhandled_.begin(), unhandled_.end()));
240 DEBUG(printIntervals("\tfixed", fixed_.begin(), fixed_.end()));
241 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
242 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end()));
243
244 while (!unhandled_.empty() || !fixed_.empty()) {
245 // pick the interval with the earliest start point
246 IntervalPtrs::value_type cur;
247 if (fixed_.empty()) {
248 cur = unhandled_.front();
249 unhandled_.erase(unhandled_.begin());
250 }
251 else if (unhandled_.empty()) {
252 cur = fixed_.front();
253 fixed_.erase(fixed_.begin());
254 }
255 else if (unhandled_.front()->start() < fixed_.front()->start()) {
256 cur = unhandled_.front();
257 unhandled_.erase(unhandled_.begin());
258 }
259 else {
260 cur = fixed_.front();
261 fixed_.erase(fixed_.begin());
262 }
263
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000264 DEBUG(std::cerr << *cur << '\n');
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000265
266 processActiveIntervals(cur);
267 processInactiveIntervals(cur);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000268
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000269 // if this register is fixed we are done
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000270 if (MRegisterInfo::isPhysicalRegister(cur->reg)) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000271 markPhysRegNotFree(cur->reg);
272 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000273 }
274 // otherwise we are allocating a virtual register. try to find
275 // a free physical register or spill an interval in order to
276 // assign it one (we could spill the current though).
277 else {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000278 backupRegUse();
279
280 // for every interval in inactive we overlap with, mark the
281 // register as not free
282 for (IntervalPtrs::const_iterator i = inactive_.begin(),
283 e = inactive_.end(); i != e; ++i) {
284 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000285 if (MRegisterInfo::isVirtualRegister(reg))
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000286 reg = v2pMap_[reg];
287
288 if (cur->overlaps(**i)) {
289 markPhysRegNotFree(reg);
290 }
291 }
292
293 // for every interval in fixed we overlap with,
294 // mark the register as not free
295 for (IntervalPtrs::const_iterator i = fixed_.begin(),
296 e = fixed_.end(); i != e; ++i) {
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000297 assert(MRegisterInfo::isPhysicalRegister((*i)->reg) &&
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000298 "virtual register interval in fixed set?");
299 if (cur->overlaps(**i))
300 markPhysRegNotFree((*i)->reg);
301 }
302
303 DEBUG(std::cerr << "\tallocating current interval:\n");
304
305 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000306 if (!physReg) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000307 assignStackSlotAtInterval(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000308 }
309 else {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000310 restoreRegUse();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000311 assignVirt2PhysReg(cur->reg, physReg);
312 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000313 }
314 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000315
316 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
317 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end())); }
318
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000319 // expire any remaining active intervals
320 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ++i) {
321 unsigned reg = (*i)->reg;
322 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000323 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000324 reg = v2pMap_[reg];
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000325 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000326 markPhysRegFree(reg);
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000327 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000328 active_.clear();
329 inactive_.clear();
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000330
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000331 typedef LiveIntervals::Reg2RegMap Reg2RegMap;
332 const Reg2RegMap& r2rMap = li_->getJoinedRegMap();
333
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000334 DEBUG(printVirtRegAssignment());
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000335 DEBUG(std::cerr << "Performing coalescing on joined intervals\n");
336 // perform coalescing if we were passed joined intervals
337 for(Reg2RegMap::const_iterator i = r2rMap.begin(), e = r2rMap.end();
338 i != e; ++i) {
339 unsigned reg = i->first;
340 unsigned rep = li_->rep(reg);
341
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000342 assert((MRegisterInfo::isPhysicalRegister(rep) ||
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000343 v2pMap_.count(rep) || v2ssMap_.count(rep)) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000344 "representative register is not allocated!");
345
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000346 assert(MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000347 !v2pMap_.count(reg) && !v2ssMap_.count(reg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000348 "coalesced register is already allocated!");
349
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000350 if (MRegisterInfo::isPhysicalRegister(rep)) {
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000351 v2pMap_.insert(std::make_pair(reg, rep));
352 }
353 else {
354 Virt2PhysMap::const_iterator pr = v2pMap_.find(rep);
355 if (pr != v2pMap_.end()) {
356 v2pMap_.insert(std::make_pair(reg, pr->second));
357 }
358 else {
359 Virt2StackSlotMap::const_iterator ss = v2ssMap_.find(rep);
360 assert(ss != v2ssMap_.end());
361 v2ssMap_.insert(std::make_pair(reg, ss->second));
362 }
363 }
364 }
365
366 DEBUG(printVirtRegAssignment());
367 DEBUG(std::cerr << "finished register allocation\n");
368
369 const TargetInstrInfo& tii = tm_->getInstrInfo();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000370
371 DEBUG(std::cerr << "Rewrite machine code:\n");
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000372 for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000373 instrAdded_ = 0;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000374
375 for (currentInstr_ = currentMbb_->begin();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000376 currentInstr_ != currentMbb_->end(); ) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000377
378 DEBUG(std::cerr << "\tinstruction: ";
379 (*currentInstr_)->print(std::cerr, *tm_););
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000380
381 // use our current mapping and actually replace and
382 // virtual register with its allocated physical registers
383 DEBUG(std::cerr << "\t\treplacing virtual registers with mapped "
384 "physical registers:\n");
385 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
386 i != e; ++i) {
387 MachineOperand& op = (*currentInstr_)->getOperand(i);
388 if (op.isVirtualRegister()) {
389 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000390 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
391 if (it != v2pMap_.end()) {
392 DEBUG(std::cerr << "\t\t\t%reg" << it->second
393 << " -> " << mri_->getName(it->second) << '\n');
394 (*currentInstr_)->SetMachineOperandReg(i, it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000395 }
396 }
397 }
398
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000399 unsigned srcReg, dstReg;
400 if (tii.isMoveInstr(**currentInstr_, srcReg, dstReg) &&
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000401 ((MRegisterInfo::isPhysicalRegister(srcReg) &&
402 MRegisterInfo::isPhysicalRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000403 srcReg == dstReg) ||
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000404 (MRegisterInfo::isVirtualRegister(srcReg) &&
405 MRegisterInfo::isVirtualRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000406 v2ssMap_[srcReg] == v2ssMap_[dstReg]))) {
407 delete *currentInstr_;
408 currentInstr_ = currentMbb_->erase(currentInstr_);
409 ++numPeep;
410 DEBUG(std::cerr << "\t\tdeleting instruction\n");
411 continue;
412 }
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000413
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000414 DEBUG(std::cerr << "\t\tloading temporarily used operands to "
415 "registers:\n");
416 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
417 i != e; ++i) {
418 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenosa71e05a2003-12-18 13:15:02 +0000419 if (op.isVirtualRegister() && op.isUse() && !op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000420 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000421 unsigned physReg = 0;
422 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
423 if (it != v2pMap_.end()) {
424 physReg = it->second;
425 }
426 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000427 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000428 loadVirt2PhysReg(virtReg, physReg);
429 tempUseOperands_.push_back(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000430 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000431 (*currentInstr_)->SetMachineOperandReg(i, physReg);
432 }
433 }
434
435 DEBUG(std::cerr << "\t\tclearing temporarily used operands:\n");
436 for (unsigned i = 0, e = tempUseOperands_.size(); i != e; ++i) {
437 clearVirtReg(tempUseOperands_[i]);
438 }
439 tempUseOperands_.clear();
440
441 DEBUG(std::cerr << "\t\tassigning temporarily defined operands to "
442 "registers:\n");
443 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
444 i != e; ++i) {
445 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000446 if (op.isVirtualRegister() && op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000447 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000448 unsigned physReg = 0;
449 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
450 if (it != v2pMap_.end()) {
451 physReg = it->second;
452 }
453 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000454 physReg = getFreeTempPhysReg(virtReg);
455 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000456 if (op.isUse()) { // def and use
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000457 loadVirt2PhysReg(virtReg, physReg);
458 }
459 else {
460 assignVirt2PhysReg(virtReg, physReg);
461 }
462 tempDefOperands_.push_back(virtReg);
463 (*currentInstr_)->SetMachineOperandReg(i, physReg);
464 }
465 }
466
Alkis Evlogimenos58587072003-11-30 23:40:39 +0000467 DEBUG(std::cerr << "\t\tspilling temporarily defined operands "
468 "of this instruction:\n");
469 ++currentInstr_; // we want to insert after this instruction
470 for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) {
471 spillVirtReg(tempDefOperands_[i]);
472 }
473 --currentInstr_; // restore currentInstr_ iterator
474 tempDefOperands_.clear();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000475 ++currentInstr_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000476 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000477 }
478
479 return true;
480}
481
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000482void RA::initIntervalSets(const LiveIntervals::Intervals& li)
483{
484 assert(unhandled_.empty() && fixed_.empty() &&
485 active_.empty() && inactive_.empty() &&
486 "interval sets should be empty on initialization");
487
488 for (LiveIntervals::Intervals::const_iterator i = li.begin(), e = li.end();
489 i != e; ++i) {
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000490 if (MRegisterInfo::isPhysicalRegister(i->reg))
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000491 fixed_.push_back(&*i);
492 else
493 unhandled_.push_back(&*i);
494 }
495}
496
497void RA::processActiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000498{
499 DEBUG(std::cerr << "\tprocessing active intervals:\n");
500 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
501 unsigned reg = (*i)->reg;
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000502 // remove expired intervals
503 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000504 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000505 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000506 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000507 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000508 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000509 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000510 i = active_.erase(i);
511 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000512 // move inactive intervals to inactive list
513 else if (!(*i)->liveAt(cur->start())) {
514 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000515 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000516 reg = v2pMap_[reg];
517 }
518 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000519 // add to inactive
520 inactive_.push_back(*i);
521 // remove from active
522 i = active_.erase(i);
523 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000524 else {
525 ++i;
526 }
527 }
528}
529
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000530void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000531{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000532 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
533 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
534 unsigned reg = (*i)->reg;
535
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000536 // remove expired intervals
537 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000538 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000539 // remove from inactive
540 i = inactive_.erase(i);
541 }
542 // move re-activated intervals in active list
543 else if ((*i)->liveAt(cur->start())) {
544 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000545 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000546 reg = v2pMap_[reg];
547 }
548 markPhysRegNotFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000549 // add to active
550 active_.push_back(*i);
551 // remove from inactive
552 i = inactive_.erase(i);
553 }
554 else {
555 ++i;
556 }
557 }
558}
559
560namespace {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000561 template <typename T>
562 void updateWeight(T rw[], int reg, T w)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000563 {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000564 if (rw[reg] == std::numeric_limits<T>::max() ||
565 w == std::numeric_limits<T>::max())
566 rw[reg] = std::numeric_limits<T>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000567 else
568 rw[reg] += w;
569 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000570}
571
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000572void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000573{
574 DEBUG(std::cerr << "\t\tassigning stack slot at interval "
575 << *cur << ":\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000576
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000577 // set all weights to zero
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000578 float regWeight[MRegisterInfo::FirstVirtualRegister];
579 for (unsigned i = 0; i < MRegisterInfo::FirstVirtualRegister; ++i)
580 regWeight[i] = 0.0F;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000581
Alkis Evlogimenos84dc5fb2004-01-22 20:07:18 +0000582 // for each interval in active
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000583 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
584 i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000585 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000586 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000587 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000588 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000589 updateWeight(regWeight, reg, (*i)->weight);
590 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
591 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000592 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000593
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000594 // for each interval in inactive that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000595 for (IntervalPtrs::const_iterator i = inactive_.begin(),
596 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000597 if (!cur->overlaps(**i))
598 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000599
600 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000601 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000602 reg = v2pMap_[reg];
603 }
604 updateWeight(regWeight, reg, (*i)->weight);
605 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
606 updateWeight(regWeight, *as, (*i)->weight);
607 }
608
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000609 // for each fixed interval that overlaps
610 for (IntervalPtrs::const_iterator i = fixed_.begin(), e = fixed_.end();
611 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000612 if (!cur->overlaps(**i))
613 continue;
Alkis Evlogimenosf7df173e2004-01-13 20:37:01 +0000614
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000615 assert(MRegisterInfo::isPhysicalRegister((*i)->reg) &&
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000616 "virtual register interval in fixed set?");
617 updateWeight(regWeight, (*i)->reg, (*i)->weight);
618 for (const unsigned* as = mri_->getAliasSet((*i)->reg); *as; ++as)
619 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000620 }
621
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000622 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000623 unsigned minReg = 0;
624 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
625 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
626 i != rc->allocation_order_end(*mf_); ++i) {
627 unsigned reg = *i;
628 if (!reserved_[reg] && minWeight > regWeight[reg]) {
629 minWeight = regWeight[reg];
630 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000631 }
632 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000633 DEBUG(std::cerr << "\t\t\tregister with min weight: "
634 << mri_->getName(minReg) << " (" << minWeight << ")\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000635
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000636 if (cur->weight < minWeight) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000637 restoreRegUse();
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000638 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000639 assignVirt2StackSlot(cur->reg);
640 }
641 else {
642 std::set<unsigned> toSpill;
643 toSpill.insert(minReg);
644 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
645 toSpill.insert(*as);
646
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000647 std::vector<unsigned> spilled;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000648 for (IntervalPtrs::iterator i = active_.begin();
649 i != active_.end(); ) {
650 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000651 if (MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000652 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
653 cur->overlaps(**i)) {
654 spilled.push_back(v2pMap_[reg]);
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000655 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000656 assignVirt2StackSlot(reg);
657 i = active_.erase(i);
658 }
659 else {
660 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000661 }
662 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000663 for (IntervalPtrs::iterator i = inactive_.begin();
664 i != inactive_.end(); ) {
665 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000666 if (MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000667 toSpill.find(v2pMap_[reg]) != toSpill.end() &&
668 cur->overlaps(**i)) {
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000669 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000670 assignVirt2StackSlot(reg);
671 i = inactive_.erase(i);
672 }
673 else {
674 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000675 }
676 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000677
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000678 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000679 assert(physReg && "no free physical register after spill?");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000680
681 restoreRegUse();
682 for (unsigned i = 0; i < spilled.size(); ++i)
683 markPhysRegFree(spilled[i]);
684
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000685 assignVirt2PhysReg(cur->reg, physReg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000686 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000687 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000688}
689
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000690bool RA::physRegAvailable(unsigned physReg)
691{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000692 assert(!reserved_[physReg] &&
693 "cannot call this method with a reserved register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000694
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000695 return !regUse_[physReg];
696}
697
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000698unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000699{
700 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000701 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000702
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000703 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
704 i != rc->allocation_order_end(*mf_); ++i) {
705 unsigned reg = *i;
706 if (!reserved_[reg] && !regUse_[reg]) {
707 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000708 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000709 }
710 }
711
712 DEBUG(std::cerr << "no free register\n");
713 return 0;
714}
715
716bool RA::tempPhysRegAvailable(unsigned physReg)
717{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000718 assert(reserved_[physReg] &&
719 "cannot call this method with a not reserved temp register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000720
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000721 return !regUse_[physReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000722}
723
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000724unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000725{
726 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
727
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000728 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
729 // go in reverse allocation order for the temp registers
730 for (TargetRegisterClass::iterator i = rc->allocation_order_end(*mf_) - 1;
731 i != rc->allocation_order_begin(*mf_) - 1; --i) {
732 unsigned reg = *i;
733 if (reserved_[reg] && !regUse_[reg]) {
734 DEBUG(std::cerr << mri_->getName(reg) << '\n');
735 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000736 }
737 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000738
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000739 assert(0 && "no free temporary physical register?");
740 return 0;
741}
742
743void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
744{
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000745 bool inserted = v2pMap_.insert(std::make_pair(virtReg, physReg)).second;
746 assert(inserted && "attempting to assign a virt->phys mapping to an "
747 "already mapped register");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000748 markPhysRegNotFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000749}
750
751void RA::clearVirtReg(unsigned virtReg)
752{
753 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
754 assert(it != v2pMap_.end() &&
755 "attempting to clear a not allocated virtual register");
756 unsigned physReg = it->second;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000757 markPhysRegFree(physReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000758 v2pMap_.erase(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000759 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
760 << "\n");
761}
762
763void RA::assignVirt2StackSlot(unsigned virtReg)
764{
765 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
766 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
767
768 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
769 assert(inserted &&
770 "attempt to assign stack slot to already assigned register?");
771 // if the virtual register was previously assigned clear the mapping
772 // and free the virtual register
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000773 if (v2pMap_.count(virtReg)) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000774 clearVirtReg(virtReg);
775 }
776}
777
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000778int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000779{
780 // use lower_bound so that we can do a possibly O(1) insert later
781 // if necessary
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000782 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
783 assert(it != v2ssMap_.end() &&
784 "attempt to get stack slot on register that does not live on the stack");
785 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000786}
787
788void RA::spillVirtReg(unsigned virtReg)
789{
790 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
791 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000792 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000793 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
794 ++numSpilled;
795 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
796 v2pMap_[virtReg], frameIndex, rc);
797 clearVirtReg(virtReg);
798}
799
800void RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
801{
802 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
803 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000804 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000805 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000806 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000807 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
808 physReg, frameIndex, rc);
809 assignVirt2PhysReg(virtReg, physReg);
810}
811
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000812void RA::markPhysRegFree(unsigned physReg)
813{
814 assert(regUse_[physReg] != 0);
815 --regUse_[physReg];
816 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
817 physReg = *as;
818 assert(regUse_[physReg] != 0);
819 --regUse_[physReg];
820 }
821}
822
823void RA::markPhysRegNotFree(unsigned physReg)
824{
825 ++regUse_[physReg];
826 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
827 physReg = *as;
828 ++regUse_[physReg];
829 }
830}
831
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000832FunctionPass* llvm::createLinearScanRegisterAllocator() {
833 return new RA();
834}