blob: 37be4b4232b3b2c7a6f872a766febe16fb9223f0 [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
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000078 /// runOnMachineFunction - register allocate the whole function
79 bool runOnMachineFunction(MachineFunction&);
80
Alkis Evlogimenos04667292004-02-01 20:13:26 +000081 void releaseMemory();
82
83 private:
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000084 /// initIntervalSets - initializa the four interval sets:
85 /// unhandled, fixed, active and inactive
86 void initIntervalSets(const LiveIntervals::Intervals& li);
87
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000088 /// processActiveIntervals - expire old intervals and move
89 /// non-overlapping ones to the incative list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000090 void processActiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000091
92 /// processInactiveIntervals - expire old intervals and move
93 /// overlapping ones to the active list
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +000094 void processInactiveIntervals(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +000095
96 /// assignStackSlotAtInterval - choose and spill
97 /// interval. Currently we spill the interval with the last
98 /// end point in the active and inactive lists and the current
99 /// interval
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000100 void assignStackSlotAtInterval(IntervalPtrs::value_type cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000101
102 ///
103 /// register handling helpers
104 ///
105
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000106 /// getFreePhysReg - return a free physical register for this
107 /// virtual register interval if we have one, otherwise return
108 /// 0
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000109 unsigned getFreePhysReg(IntervalPtrs::value_type cur);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000110
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000111 /// physRegAvailable - returns true if the specifed physical
112 /// register is available
113 bool physRegAvailable(unsigned physReg);
114
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000115 /// tempPhysRegAvailable - returns true if the specifed
116 /// temporary physical register is available
117 bool tempPhysRegAvailable(unsigned physReg);
118
119 /// getFreeTempPhysReg - return a free temprorary physical
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000120 /// register for this virtual register if we have one (should
121 /// never return 0)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000122 unsigned getFreeTempPhysReg(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000123
124 /// assignVirt2PhysReg - assigns the free physical register to
125 /// the virtual register passed as arguments
126 void assignVirt2PhysReg(unsigned virtReg, unsigned physReg);
127
128 /// clearVirtReg - free the physical register associated with this
129 /// virtual register and disassociate virtual->physical and
130 /// physical->virtual mappings
131 void clearVirtReg(unsigned virtReg);
132
133 /// assignVirt2StackSlot - assigns this virtual register to a
134 /// stack slot
135 void assignVirt2StackSlot(unsigned virtReg);
136
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000137 /// getStackSlot - returns the offset of the specified
138 /// register on the stack
139 int getStackSlot(unsigned virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000140
141 /// spillVirtReg - spills the virtual register
142 void spillVirtReg(unsigned virtReg);
143
144 /// loadPhysReg - loads to the physical register the value of
145 /// the virtual register specifed. Virtual register must have
146 /// an assigned stack slot
147 void loadVirt2PhysReg(unsigned virtReg, unsigned physReg);
148
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000149 void markPhysRegFree(unsigned physReg);
150 void markPhysRegNotFree(unsigned physReg);
151
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000152 void backupRegUse() {
153 memcpy(regUseBackup_, regUse_, sizeof(regUseBackup_));
154 }
155
156 void restoreRegUse() {
157 memcpy(regUse_, regUseBackup_, sizeof(regUseBackup_));
158 }
159
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000160 void printVirtRegAssignment() const {
161 std::cerr << "register assignment:\n";
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000162 for (Virt2PhysMap::const_iterator
163 i = v2pMap_.begin(), e = v2pMap_.end(); i != e; ++i) {
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000164 assert(i->second != 0);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000165 std::cerr << '[' << i->first << ','
166 << mri_->getName(i->second) << "]\n";
167 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000168 for (Virt2StackSlotMap::const_iterator
169 i = v2ssMap_.begin(), e = v2ssMap_.end(); i != e; ++i) {
170 std::cerr << '[' << i->first << ",ss#" << i->second << "]\n";
171 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000172 std::cerr << '\n';
173 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000174
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000175 void printIntervals(const char* const str,
176 RA::IntervalPtrs::const_iterator i,
177 RA::IntervalPtrs::const_iterator e) const {
178 if (str) std::cerr << str << " intervals:\n";
179 for (; i != e; ++i) {
180 std::cerr << "\t\t" << **i << " -> ";
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000181 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000182 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000183 Virt2PhysMap::const_iterator it = v2pMap_.find(reg);
184 reg = (it == v2pMap_.end() ? 0 : it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000185 }
Alkis Evlogimenosa12c7bb2004-01-16 20:33:13 +0000186 std::cerr << mri_->getName(reg) << '\n';
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000187 }
188 }
Alkis Evlogimenosa6d8c3f2004-01-16 20:29:42 +0000189
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000190 void printFreeRegs(const char* const str,
191 const TargetRegisterClass* rc) const {
192 if (str) std::cerr << str << ':';
193 for (TargetRegisterClass::iterator i =
194 rc->allocation_order_begin(*mf_);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000195 i != rc->allocation_order_end(*mf_); ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000196 unsigned reg = *i;
197 if (!regUse_[reg]) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000198 std::cerr << ' ' << mri_->getName(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000199 if (reserved_[reg]) std::cerr << "*";
200 }
201 }
202 std::cerr << '\n';
203 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000204 };
205}
206
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000207void RA::releaseMemory()
208{
209 v2pMap_.clear();
210 v2ssMap_.clear();
211 unhandled_.clear();
212 active_.clear();
213 inactive_.clear();
214 fixed_.clear();
215
216}
217
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000218bool RA::runOnMachineFunction(MachineFunction &fn) {
219 mf_ = &fn;
220 tm_ = &fn.getTarget();
221 mri_ = tm_->getRegisterInfo();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000222 li_ = &getAnalysis<LiveIntervals>();
223 initIntervalSets(li_->getIntervals());
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000224
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000225 memset(regUse_, 0, sizeof(regUse_));
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000226 memset(regUseBackup_, 0, sizeof(regUseBackup_));
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000227
228 // FIXME: this will work only for the X86 backend. I need to
229 // device an algorthm to select the minimal (considering register
230 // aliasing) number of temp registers to reserve so that we have 2
231 // registers for each register class available.
232
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000233 // reserve R8: CH, CL
234 // R16: CX, DI,
235 // R32: ECX, EDI,
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000236 // RFP: FP5, FP6
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000237 reserved_.assign(MRegisterInfo::FirstVirtualRegister, false);
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000238 reserved_[ 8] = true; /* CH */
239 reserved_[ 9] = true; /* CL */
240 reserved_[10] = true; /* CX */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000241 reserved_[12] = true; /* DI */
Alkis Evlogimenos27490a62003-12-28 18:03:52 +0000242 reserved_[18] = true; /* ECX */
243 reserved_[19] = true; /* EDI */
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000244 reserved_[28] = true; /* FP5 */
245 reserved_[29] = true; /* FP6 */
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000246
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000247 // linear scan algorithm
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000248 DEBUG(std::cerr << "Machine Function\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000249
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000250 DEBUG(printIntervals("\tunhandled", unhandled_.begin(), unhandled_.end()));
251 DEBUG(printIntervals("\tfixed", fixed_.begin(), fixed_.end()));
252 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
253 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end()));
254
255 while (!unhandled_.empty() || !fixed_.empty()) {
256 // pick the interval with the earliest start point
257 IntervalPtrs::value_type cur;
258 if (fixed_.empty()) {
259 cur = unhandled_.front();
260 unhandled_.erase(unhandled_.begin());
261 }
262 else if (unhandled_.empty()) {
263 cur = fixed_.front();
264 fixed_.erase(fixed_.begin());
265 }
266 else if (unhandled_.front()->start() < fixed_.front()->start()) {
267 cur = unhandled_.front();
268 unhandled_.erase(unhandled_.begin());
269 }
270 else {
271 cur = fixed_.front();
272 fixed_.erase(fixed_.begin());
273 }
274
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000275 DEBUG(std::cerr << *cur << '\n');
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000276
277 processActiveIntervals(cur);
278 processInactiveIntervals(cur);
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000279
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000280 // if this register is fixed we are done
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000281 if (MRegisterInfo::isPhysicalRegister(cur->reg)) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000282 markPhysRegNotFree(cur->reg);
283 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000284 }
285 // otherwise we are allocating a virtual register. try to find
286 // a free physical register or spill an interval in order to
287 // assign it one (we could spill the current though).
288 else {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000289 backupRegUse();
290
291 // for every interval in inactive we overlap with, mark the
292 // register as not free
293 for (IntervalPtrs::const_iterator i = inactive_.begin(),
294 e = inactive_.end(); i != e; ++i) {
295 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000296 if (MRegisterInfo::isVirtualRegister(reg))
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000297 reg = v2pMap_[reg];
298
299 if (cur->overlaps(**i)) {
300 markPhysRegNotFree(reg);
301 }
302 }
303
304 // for every interval in fixed we overlap with,
305 // mark the register as not free
306 for (IntervalPtrs::const_iterator i = fixed_.begin(),
307 e = fixed_.end(); i != e; ++i) {
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000308 assert(MRegisterInfo::isPhysicalRegister((*i)->reg) &&
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000309 "virtual register interval in fixed set?");
310 if (cur->overlaps(**i))
311 markPhysRegNotFree((*i)->reg);
312 }
313
314 DEBUG(std::cerr << "\tallocating current interval:\n");
315
316 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000317 if (!physReg) {
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000318 assignStackSlotAtInterval(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000319 }
320 else {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000321 restoreRegUse();
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000322 assignVirt2PhysReg(cur->reg, physReg);
323 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000324 }
325 }
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000326
327 DEBUG(printIntervals("\tactive", active_.begin(), active_.end()));
328 DEBUG(printIntervals("\tinactive", inactive_.begin(), inactive_.end())); }
329
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000330 // expire any remaining active intervals
331 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end(); ++i) {
332 unsigned reg = (*i)->reg;
333 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000334 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000335 reg = v2pMap_[reg];
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000336 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000337 markPhysRegFree(reg);
Alkis Evlogimenos7d65a122003-12-13 05:50:19 +0000338 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000339
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000340 typedef LiveIntervals::Reg2RegMap Reg2RegMap;
341 const Reg2RegMap& r2rMap = li_->getJoinedRegMap();
342
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000343 DEBUG(printVirtRegAssignment());
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000344 DEBUG(std::cerr << "Performing coalescing on joined intervals\n");
345 // perform coalescing if we were passed joined intervals
346 for(Reg2RegMap::const_iterator i = r2rMap.begin(), e = r2rMap.end();
347 i != e; ++i) {
348 unsigned reg = i->first;
349 unsigned rep = li_->rep(reg);
350
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000351 assert((MRegisterInfo::isPhysicalRegister(rep) ||
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000352 v2pMap_.count(rep) || v2ssMap_.count(rep)) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000353 "representative register is not allocated!");
354
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000355 assert(MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000356 !v2pMap_.count(reg) && !v2ssMap_.count(reg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000357 "coalesced register is already allocated!");
358
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000359 if (MRegisterInfo::isPhysicalRegister(rep)) {
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000360 v2pMap_.insert(std::make_pair(reg, rep));
361 }
362 else {
363 Virt2PhysMap::const_iterator pr = v2pMap_.find(rep);
364 if (pr != v2pMap_.end()) {
365 v2pMap_.insert(std::make_pair(reg, pr->second));
366 }
367 else {
368 Virt2StackSlotMap::const_iterator ss = v2ssMap_.find(rep);
369 assert(ss != v2ssMap_.end());
370 v2ssMap_.insert(std::make_pair(reg, ss->second));
371 }
372 }
373 }
374
375 DEBUG(printVirtRegAssignment());
376 DEBUG(std::cerr << "finished register allocation\n");
377
378 const TargetInstrInfo& tii = tm_->getInstrInfo();
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000379
380 DEBUG(std::cerr << "Rewrite machine code:\n");
Alkis Evlogimenos1283d862004-01-07 05:31:12 +0000381 for (currentMbb_ = mf_->begin(); currentMbb_ != mf_->end(); ++currentMbb_) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000382 instrAdded_ = 0;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000383
384 for (currentInstr_ = currentMbb_->begin();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000385 currentInstr_ != currentMbb_->end(); ) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000386
387 DEBUG(std::cerr << "\tinstruction: ";
388 (*currentInstr_)->print(std::cerr, *tm_););
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000389
390 // use our current mapping and actually replace and
391 // virtual register with its allocated physical registers
392 DEBUG(std::cerr << "\t\treplacing virtual registers with mapped "
393 "physical registers:\n");
394 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
395 i != e; ++i) {
396 MachineOperand& op = (*currentInstr_)->getOperand(i);
397 if (op.isVirtualRegister()) {
398 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000399 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
400 if (it != v2pMap_.end()) {
401 DEBUG(std::cerr << "\t\t\t%reg" << it->second
402 << " -> " << mri_->getName(it->second) << '\n');
403 (*currentInstr_)->SetMachineOperandReg(i, it->second);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000404 }
405 }
406 }
407
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000408 unsigned srcReg, dstReg;
409 if (tii.isMoveInstr(**currentInstr_, srcReg, dstReg) &&
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000410 ((MRegisterInfo::isPhysicalRegister(srcReg) &&
411 MRegisterInfo::isPhysicalRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000412 srcReg == dstReg) ||
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000413 (MRegisterInfo::isVirtualRegister(srcReg) &&
414 MRegisterInfo::isVirtualRegister(dstReg) &&
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000415 v2ssMap_[srcReg] == v2ssMap_[dstReg]))) {
416 delete *currentInstr_;
417 currentInstr_ = currentMbb_->erase(currentInstr_);
418 ++numPeep;
419 DEBUG(std::cerr << "\t\tdeleting instruction\n");
420 continue;
421 }
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000422
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000423 DEBUG(std::cerr << "\t\tloading temporarily used operands to "
424 "registers:\n");
425 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
426 i != e; ++i) {
427 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenosa71e05a2003-12-18 13:15:02 +0000428 if (op.isVirtualRegister() && op.isUse() && !op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000429 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000430 unsigned physReg = 0;
431 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
432 if (it != v2pMap_.end()) {
433 physReg = it->second;
434 }
435 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000436 physReg = getFreeTempPhysReg(virtReg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000437 loadVirt2PhysReg(virtReg, physReg);
438 tempUseOperands_.push_back(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000439 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000440 (*currentInstr_)->SetMachineOperandReg(i, physReg);
441 }
442 }
443
444 DEBUG(std::cerr << "\t\tclearing temporarily used operands:\n");
445 for (unsigned i = 0, e = tempUseOperands_.size(); i != e; ++i) {
446 clearVirtReg(tempUseOperands_[i]);
447 }
448 tempUseOperands_.clear();
449
450 DEBUG(std::cerr << "\t\tassigning temporarily defined operands to "
451 "registers:\n");
452 for (unsigned i = 0, e = (*currentInstr_)->getNumOperands();
453 i != e; ++i) {
454 MachineOperand& op = (*currentInstr_)->getOperand(i);
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000455 if (op.isVirtualRegister() && op.isDef()) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000456 unsigned virtReg = op.getAllocatedRegNum();
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000457 unsigned physReg = 0;
458 Virt2PhysMap::const_iterator it = v2pMap_.find(virtReg);
459 if (it != v2pMap_.end()) {
460 physReg = it->second;
461 }
462 else {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000463 physReg = getFreeTempPhysReg(virtReg);
464 }
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000465 if (op.isUse()) { // def and use
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000466 loadVirt2PhysReg(virtReg, physReg);
467 }
468 else {
469 assignVirt2PhysReg(virtReg, physReg);
470 }
471 tempDefOperands_.push_back(virtReg);
472 (*currentInstr_)->SetMachineOperandReg(i, physReg);
473 }
474 }
475
Alkis Evlogimenos58587072003-11-30 23:40:39 +0000476 DEBUG(std::cerr << "\t\tspilling temporarily defined operands "
477 "of this instruction:\n");
478 ++currentInstr_; // we want to insert after this instruction
479 for (unsigned i = 0, e = tempDefOperands_.size(); i != e; ++i) {
480 spillVirtReg(tempDefOperands_[i]);
481 }
482 --currentInstr_; // restore currentInstr_ iterator
483 tempDefOperands_.clear();
Alkis Evlogimenose88280a2004-01-22 23:08:45 +0000484 ++currentInstr_;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000485 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000486 }
487
488 return true;
489}
490
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000491void RA::initIntervalSets(const LiveIntervals::Intervals& li)
492{
493 assert(unhandled_.empty() && fixed_.empty() &&
494 active_.empty() && inactive_.empty() &&
495 "interval sets should be empty on initialization");
496
497 for (LiveIntervals::Intervals::const_iterator i = li.begin(), e = li.end();
498 i != e; ++i) {
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000499 if (MRegisterInfo::isPhysicalRegister(i->reg))
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000500 fixed_.push_back(&*i);
501 else
502 unhandled_.push_back(&*i);
503 }
504}
505
506void RA::processActiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000507{
508 DEBUG(std::cerr << "\tprocessing active intervals:\n");
509 for (IntervalPtrs::iterator i = active_.begin(); i != active_.end();) {
510 unsigned reg = (*i)->reg;
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000511 // remove expired intervals
512 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000513 DEBUG(std::cerr << "\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000514 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000515 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000516 }
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000517 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000518 // remove from active
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000519 i = active_.erase(i);
520 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000521 // move inactive intervals to inactive list
522 else if (!(*i)->liveAt(cur->start())) {
523 DEBUG(std::cerr << "\t\t\tinterval " << **i << " inactive\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000524 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000525 reg = v2pMap_[reg];
526 }
527 markPhysRegFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000528 // add to inactive
529 inactive_.push_back(*i);
530 // remove from active
531 i = active_.erase(i);
532 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000533 else {
534 ++i;
535 }
536 }
537}
538
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000539void RA::processInactiveIntervals(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000540{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000541 DEBUG(std::cerr << "\tprocessing inactive intervals:\n");
542 for (IntervalPtrs::iterator i = inactive_.begin(); i != inactive_.end();) {
543 unsigned reg = (*i)->reg;
544
Alkis Evlogimenos3b02cbe2004-01-16 20:17:05 +0000545 // remove expired intervals
546 if ((*i)->expiredAt(cur->start())) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000547 DEBUG(std::cerr << "\t\t\tinterval " << **i << " expired\n");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000548 // remove from inactive
549 i = inactive_.erase(i);
550 }
551 // move re-activated intervals in active list
552 else if ((*i)->liveAt(cur->start())) {
553 DEBUG(std::cerr << "\t\t\tinterval " << **i << " active\n");
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000554 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000555 reg = v2pMap_[reg];
556 }
557 markPhysRegNotFree(reg);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000558 // add to active
559 active_.push_back(*i);
560 // remove from inactive
561 i = inactive_.erase(i);
562 }
563 else {
564 ++i;
565 }
566 }
567}
568
569namespace {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000570 template <typename T>
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000571 void updateWeight(std::vector<T>& rw, int reg, T w)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000572 {
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000573 if (rw[reg] == std::numeric_limits<T>::max() ||
574 w == std::numeric_limits<T>::max())
575 rw[reg] = std::numeric_limits<T>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000576 else
577 rw[reg] += w;
578 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000579}
580
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000581void RA::assignStackSlotAtInterval(IntervalPtrs::value_type cur)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000582{
583 DEBUG(std::cerr << "\t\tassigning stack slot at interval "
584 << *cur << ":\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000585
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000586 std::vector<float> regWeight(mri_->getNumRegs(), 0.0);
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000587
Alkis Evlogimenos84dc5fb2004-01-22 20:07:18 +0000588 // for each interval in active
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000589 for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end();
590 i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000591 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000592 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000593 reg = v2pMap_[reg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000594 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000595 updateWeight(regWeight, reg, (*i)->weight);
596 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
597 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000598 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000599
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000600 // for each interval in inactive that overlaps
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000601 for (IntervalPtrs::const_iterator i = inactive_.begin(),
602 e = inactive_.end(); i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000603 if (!cur->overlaps(**i))
604 continue;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000605
606 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000607 if (MRegisterInfo::isVirtualRegister(reg)) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000608 reg = v2pMap_[reg];
609 }
610 updateWeight(regWeight, reg, (*i)->weight);
611 for (const unsigned* as = mri_->getAliasSet(reg); *as; ++as)
612 updateWeight(regWeight, *as, (*i)->weight);
613 }
614
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000615 // for each fixed interval that overlaps
616 for (IntervalPtrs::const_iterator i = fixed_.begin(), e = fixed_.end();
617 i != e; ++i) {
Alkis Evlogimenosb7be1152004-01-13 20:42:08 +0000618 if (!cur->overlaps(**i))
619 continue;
Alkis Evlogimenosf7df173e2004-01-13 20:37:01 +0000620
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000621 assert(MRegisterInfo::isPhysicalRegister((*i)->reg) &&
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000622 "virtual register interval in fixed set?");
623 updateWeight(regWeight, (*i)->reg, (*i)->weight);
624 for (const unsigned* as = mri_->getAliasSet((*i)->reg); *as; ++as)
625 updateWeight(regWeight, *as, (*i)->weight);
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000626 }
627
Alkis Evlogimenos6b4edba2003-12-21 20:19:10 +0000628 float minWeight = std::numeric_limits<float>::max();
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000629 unsigned minReg = 0;
630 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
631 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
632 i != rc->allocation_order_end(*mf_); ++i) {
633 unsigned reg = *i;
634 if (!reserved_[reg] && minWeight > regWeight[reg]) {
635 minWeight = regWeight[reg];
636 minReg = reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000637 }
638 }
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000639 DEBUG(std::cerr << "\t\t\tregister with min weight: "
640 << mri_->getName(minReg) << " (" << minWeight << ")\n");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000641
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000642 if (cur->weight < minWeight) {
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000643 restoreRegUse();
Alkis Evlogimenos5ab20272004-01-14 00:09:36 +0000644 DEBUG(std::cerr << "\t\t\t\tspilling: " << *cur << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000645 assignVirt2StackSlot(cur->reg);
646 }
647 else {
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000648 std::vector<bool> toSpill(mri_->getNumRegs(), false);
649 toSpill[minReg] = true;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000650 for (const unsigned* as = mri_->getAliasSet(minReg); *as; ++as)
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000651 toSpill[*as] = true;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000652
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000653 std::vector<unsigned> spilled;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000654 for (IntervalPtrs::iterator i = active_.begin();
655 i != active_.end(); ) {
656 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000657 if (MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000658 toSpill[v2pMap_[reg]] &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000659 cur->overlaps(**i)) {
660 spilled.push_back(v2pMap_[reg]);
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000661 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000662 assignVirt2StackSlot(reg);
663 i = active_.erase(i);
664 }
665 else {
666 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000667 }
668 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000669 for (IntervalPtrs::iterator i = inactive_.begin();
670 i != inactive_.end(); ) {
671 unsigned reg = (*i)->reg;
Alkis Evlogimenos4f67b862004-02-01 01:27:01 +0000672 if (MRegisterInfo::isVirtualRegister(reg) &&
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000673 toSpill[v2pMap_[reg]] &&
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000674 cur->overlaps(**i)) {
Alkis Evlogimenos843397c2003-12-24 18:53:31 +0000675 DEBUG(std::cerr << "\t\t\t\tspilling : " << **i << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000676 assignVirt2StackSlot(reg);
677 i = inactive_.erase(i);
678 }
679 else {
680 ++i;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000681 }
682 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000683
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000684 unsigned physReg = getFreePhysReg(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000685 assert(physReg && "no free physical register after spill?");
Alkis Evlogimenos3bf564a2003-12-23 18:00:33 +0000686
687 restoreRegUse();
688 for (unsigned i = 0; i < spilled.size(); ++i)
689 markPhysRegFree(spilled[i]);
690
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000691 assignVirt2PhysReg(cur->reg, physReg);
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000692 active_.push_back(cur);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000693 }
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000694}
695
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000696bool RA::physRegAvailable(unsigned physReg)
697{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000698 assert(!reserved_[physReg] &&
699 "cannot call this method with a reserved register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000700
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000701 return !regUse_[physReg];
702}
703
Alkis Evlogimenos7d629b52004-01-07 09:20:58 +0000704unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000705{
706 DEBUG(std::cerr << "\t\tgetting free physical register: ");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000707 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
Alkis Evlogimenos26bfc082003-12-28 17:58:18 +0000708
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000709 for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
710 i != rc->allocation_order_end(*mf_); ++i) {
711 unsigned reg = *i;
712 if (!reserved_[reg] && !regUse_[reg]) {
713 DEBUG(std::cerr << mri_->getName(reg) << '\n');
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000714 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000715 }
716 }
717
718 DEBUG(std::cerr << "no free register\n");
719 return 0;
720}
721
722bool RA::tempPhysRegAvailable(unsigned physReg)
723{
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000724 assert(reserved_[physReg] &&
725 "cannot call this method with a not reserved temp register");
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000726
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000727 return !regUse_[physReg];
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000728}
729
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000730unsigned RA::getFreeTempPhysReg(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000731{
732 DEBUG(std::cerr << "\t\tgetting free temporary physical register: ");
733
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000734 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
735 // go in reverse allocation order for the temp registers
Alkis Evlogimenos04667292004-02-01 20:13:26 +0000736 typedef std::reverse_iterator<TargetRegisterClass::iterator> TRCRevIter;
737 for (TRCRevIter
738 i(rc->allocation_order_end(*mf_)),
739 e(rc->allocation_order_begin(*mf_)); i != e; ++i) {
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000740 unsigned reg = *i;
741 if (reserved_[reg] && !regUse_[reg]) {
742 DEBUG(std::cerr << mri_->getName(reg) << '\n');
743 return reg;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000744 }
745 }
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000746
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000747 assert(0 && "no free temporary physical register?");
748 return 0;
749}
750
751void RA::assignVirt2PhysReg(unsigned virtReg, unsigned physReg)
752{
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000753 bool inserted = v2pMap_.insert(std::make_pair(virtReg, physReg)).second;
754 assert(inserted && "attempting to assign a virt->phys mapping to an "
755 "already mapped register");
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000756 markPhysRegNotFree(physReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000757}
758
759void RA::clearVirtReg(unsigned virtReg)
760{
761 Virt2PhysMap::iterator it = v2pMap_.find(virtReg);
762 assert(it != v2pMap_.end() &&
763 "attempting to clear a not allocated virtual register");
764 unsigned physReg = it->second;
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000765 markPhysRegFree(physReg);
Alkis Evlogimenosce501152004-01-22 19:24:43 +0000766 v2pMap_.erase(it);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000767 DEBUG(std::cerr << "\t\t\tcleared register " << mri_->getName(physReg)
768 << "\n");
769}
770
771void RA::assignVirt2StackSlot(unsigned virtReg)
772{
773 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
774 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
775
776 bool inserted = v2ssMap_.insert(std::make_pair(virtReg, frameIndex)).second;
777 assert(inserted &&
778 "attempt to assign stack slot to already assigned register?");
779 // if the virtual register was previously assigned clear the mapping
780 // and free the virtual register
Alkis Evlogimenosf440cc12004-02-01 18:39:53 +0000781 if (v2pMap_.count(virtReg)) {
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000782 clearVirtReg(virtReg);
783 }
784}
785
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000786int RA::getStackSlot(unsigned virtReg)
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000787{
788 // use lower_bound so that we can do a possibly O(1) insert later
789 // if necessary
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000790 Virt2StackSlotMap::iterator it = v2ssMap_.find(virtReg);
791 assert(it != v2ssMap_.end() &&
792 "attempt to get stack slot on register that does not live on the stack");
793 return it->second;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000794}
795
796void RA::spillVirtReg(unsigned virtReg)
797{
798 DEBUG(std::cerr << "\t\t\tspilling register: " << virtReg);
799 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000800 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000801 DEBUG(std::cerr << " to stack slot #" << frameIndex << '\n');
802 ++numSpilled;
803 instrAdded_ += mri_->storeRegToStackSlot(*currentMbb_, currentInstr_,
804 v2pMap_[virtReg], frameIndex, rc);
805 clearVirtReg(virtReg);
806}
807
808void RA::loadVirt2PhysReg(unsigned virtReg, unsigned physReg)
809{
810 DEBUG(std::cerr << "\t\t\tloading register: " << virtReg);
811 const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(virtReg);
Alkis Evlogimenos69546d52003-12-04 03:57:28 +0000812 int frameIndex = getStackSlot(virtReg);
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000813 DEBUG(std::cerr << " from stack slot #" << frameIndex << '\n');
Chris Lattner5e46b512003-12-18 20:25:31 +0000814 ++numReloaded;
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000815 instrAdded_ += mri_->loadRegFromStackSlot(*currentMbb_, currentInstr_,
816 physReg, frameIndex, rc);
817 assignVirt2PhysReg(virtReg, physReg);
818}
819
Alkis Evlogimenos169cfd02003-12-21 05:43:40 +0000820void RA::markPhysRegFree(unsigned physReg)
821{
822 assert(regUse_[physReg] != 0);
823 --regUse_[physReg];
824 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
825 physReg = *as;
826 assert(regUse_[physReg] != 0);
827 --regUse_[physReg];
828 }
829}
830
831void RA::markPhysRegNotFree(unsigned physReg)
832{
833 ++regUse_[physReg];
834 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
835 physReg = *as;
836 ++regUse_[physReg];
837 }
838}
839
Alkis Evlogimenosff0cbe12003-11-20 03:32:25 +0000840FunctionPass* llvm::createLinearScanRegisterAllocator() {
841 return new RA();
842}