blob: c235aada9f437e6952009bb1a734595aaf2f806b [file] [log] [blame]
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +00001//===-- llvm/CodeGen/VirtRegMap.cpp - Virtual Register Map ----------------===//
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//
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000010// This file implements the virtual register map. It also implements
11// the eliminateVirtRegs() function that given a virtual register map
12// and a machine function it eliminates all virtual references by
13// replacing them with physical register references and adds spill
14// code as necessary.
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000015//
16//===----------------------------------------------------------------------===//
17
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000018#define DEBUG_TYPE "regalloc"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000019#include "VirtRegMap.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000020#include "llvm/Function.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000021#include "llvm/CodeGen/MachineFrameInfo.h"
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000022#include "llvm/CodeGen/MachineInstr.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000023#include "llvm/Target/TargetMachine.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000024#include "llvm/Target/TargetInstrInfo.h"
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +000025#include "Support/CommandLine.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000026#include "Support/Debug.h"
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +000027#include "Support/DenseMap.h"
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +000028#include "Support/Statistic.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000029#include "Support/STLExtras.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000030
31using namespace llvm;
32
33namespace {
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000034 Statistic<> numSpills("spiller", "Number of register spills");
35 Statistic<> numStores("spiller", "Number of stores added");
36 Statistic<> numLoads ("spiller", "Number of loads added");
37
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +000038 enum SpillerName { simple, local };
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +000039
40 cl::opt<SpillerName>
41 SpillerOpt("spiller",
42 cl::desc("Spiller to use: (default: local)"),
43 cl::Prefix,
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +000044 cl::values(clEnumVal(simple, " simple spiller"),
45 clEnumVal(local, " local spiller"),
Chris Lattnerb8edf612004-07-16 00:06:01 +000046 clEnumValEnd),
Alkis Evlogimenos5ae00062004-03-06 23:08:44 +000047 cl::init(local));
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000048}
49
50int VirtRegMap::assignVirt2StackSlot(unsigned virtReg)
51{
52 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000053 assert(v2ssMap_[virtReg] == NO_STACK_SLOT &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000054 "attempt to assign stack slot to already spilled register");
Chris Lattner26eb14b2004-08-15 22:02:22 +000055 const TargetRegisterClass* RC =
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000056 mf_->getSSARegMap()->getRegClass(virtReg);
Chris Lattner26eb14b2004-08-15 22:02:22 +000057 int frameIndex = mf_->getFrameInfo()->CreateStackObject(RC->getSize(),
58 RC->getAlignment());
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000059 v2ssMap_[virtReg] = frameIndex;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000060 ++numSpills;
61 return frameIndex;
62}
63
Alkis Evlogimenos38af59a2004-05-29 20:38:05 +000064void VirtRegMap::assignVirt2StackSlot(unsigned virtReg, int frameIndex)
65{
66 assert(MRegisterInfo::isVirtualRegister(virtReg));
67 assert(v2ssMap_[virtReg] == NO_STACK_SLOT &&
68 "attempt to assign stack slot to already spilled register");
69 v2ssMap_[virtReg] = frameIndex;
70}
71
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000072void VirtRegMap::virtFolded(unsigned virtReg,
73 MachineInstr* oldMI,
74 MachineInstr* newMI)
75{
76 // move previous memory references folded to new instruction
77 MI2VirtMap::iterator i, e;
78 std::vector<MI2VirtMap::mapped_type> regs;
79 for (tie(i, e) = mi2vMap_.equal_range(oldMI); i != e; ) {
80 regs.push_back(i->second);
81 mi2vMap_.erase(i++);
82 }
83 for (unsigned i = 0, e = regs.size(); i != e; ++i)
84 mi2vMap_.insert(std::make_pair(newMI, i));
85
86 // add new memory reference
87 mi2vMap_.insert(std::make_pair(newMI, virtReg));
88}
89
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000090std::ostream& llvm::operator<<(std::ostream& os, const VirtRegMap& vrm)
91{
92 const MRegisterInfo* mri = vrm.mf_->getTarget().getRegisterInfo();
93
94 std::cerr << "********** REGISTER MAP **********\n";
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000095 for (unsigned i = MRegisterInfo::FirstVirtualRegister,
96 e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000097 if (vrm.v2pMap_[i] != VirtRegMap::NO_PHYS_REG)
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000098 std::cerr << "[reg" << i << " -> "
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000099 << mri->getName(vrm.v2pMap_[i]) << "]\n";
100 }
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +0000101 for (unsigned i = MRegisterInfo::FirstVirtualRegister,
102 e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000103 if (vrm.v2ssMap_[i] != VirtRegMap::NO_STACK_SLOT)
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +0000104 std::cerr << "[reg" << i << " -> fi#"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000105 << vrm.v2ssMap_[i] << "]\n";
106 }
107 return std::cerr << '\n';
108}
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000109
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000110Spiller::~Spiller()
111{
112
113}
114
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000115namespace {
116
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000117 class SimpleSpiller : public Spiller {
118 public:
119 bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) {
120 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
121 DEBUG(std::cerr << "********** Function: "
122 << mf.getFunction()->getName() << '\n');
123 const TargetMachine& tm = mf.getTarget();
124 const MRegisterInfo& mri = *tm.getRegisterInfo();
125
126 typedef DenseMap<bool, VirtReg2IndexFunctor> Loaded;
127 Loaded loaded;
128
129 for (MachineFunction::iterator mbbi = mf.begin(),
130 mbbe = mf.end(); mbbi != mbbe; ++mbbi) {
131 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
132 for (MachineBasicBlock::iterator mii = mbbi->begin(),
133 mie = mbbi->end(); mii != mie; ++mii) {
134 loaded.grow(mf.getSSARegMap()->getLastVirtReg());
135 for (unsigned i = 0,e = mii->getNumOperands(); i != e; ++i){
136 MachineOperand& mop = mii->getOperand(i);
137 if (mop.isRegister() && mop.getReg() &&
138 MRegisterInfo::isVirtualRegister(mop.getReg())) {
139 unsigned virtReg = mop.getReg();
140 unsigned physReg = vrm.getPhys(virtReg);
141 if (mop.isUse() &&
142 vrm.hasStackSlot(mop.getReg()) &&
143 !loaded[virtReg]) {
144 mri.loadRegFromStackSlot(
145 *mbbi,
146 mii,
147 physReg,
Chris Lattner57f1b672004-08-15 21:56:44 +0000148 vrm.getStackSlot(virtReg));
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000149 loaded[virtReg] = true;
150 DEBUG(std::cerr << '\t';
Tanya Lattnerb1407622004-06-25 00:13:11 +0000151 prior(mii)->print(std::cerr, &tm));
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000152 ++numLoads;
153 }
154 if (mop.isDef() &&
155 vrm.hasStackSlot(mop.getReg())) {
156 mri.storeRegToStackSlot(
157 *mbbi,
158 next(mii),
159 physReg,
Chris Lattner57f1b672004-08-15 21:56:44 +0000160 vrm.getStackSlot(virtReg));
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000161 ++numStores;
162 }
163 mii->SetMachineOperandReg(i, physReg);
164 }
165 }
Tanya Lattnerb1407622004-06-25 00:13:11 +0000166 DEBUG(std::cerr << '\t'; mii->print(std::cerr, &tm));
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000167 loaded.clear();
168 }
169 }
170 return true;
171 }
172 };
173
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000174 class LocalSpiller : public Spiller {
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000175 typedef std::vector<unsigned> Phys2VirtMap;
176 typedef std::vector<bool> PhysFlag;
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000177 typedef DenseMap<MachineInstr*, VirtReg2IndexFunctor> Virt2MI;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000178
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000179 MachineFunction* mf_;
180 const TargetMachine* tm_;
181 const TargetInstrInfo* tii_;
182 const MRegisterInfo* mri_;
183 const VirtRegMap* vrm_;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000184 Phys2VirtMap p2vMap_;
185 PhysFlag dirty_;
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000186 Virt2MI lastDef_;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000187
188 public:
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000189 bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) {
190 mf_ = &mf;
191 tm_ = &mf_->getTarget();
Chris Lattner9bcdcd12004-06-02 05:57:12 +0000192 tii_ = tm_->getInstrInfo();
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000193 mri_ = tm_->getRegisterInfo();
194 vrm_ = &vrm;
195 p2vMap_.assign(mri_->getNumRegs(), 0);
196 dirty_.assign(mri_->getNumRegs(), false);
197
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000198 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
199 DEBUG(std::cerr << "********** Function: "
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000200 << mf_->getFunction()->getName() << '\n');
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000201
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000202 for (MachineFunction::iterator mbbi = mf_->begin(),
203 mbbe = mf_->end(); mbbi != mbbe; ++mbbi) {
204 lastDef_.grow(mf_->getSSARegMap()->getLastVirtReg());
Alkis Evlogimenos8fa16e42004-02-26 23:22:23 +0000205 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
206 eliminateVirtRegsInMbb(*mbbi);
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000207 // clear map, dirty flag and last ref
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000208 p2vMap_.assign(p2vMap_.size(), 0);
209 dirty_.assign(dirty_.size(), false);
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000210 lastDef_.clear();
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000211 }
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000212 return true;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000213 }
214
215 private:
216 void vacateJustPhysReg(MachineBasicBlock& mbb,
217 MachineBasicBlock::iterator mii,
218 unsigned physReg) {
219 unsigned virtReg = p2vMap_[physReg];
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000220 if (dirty_[physReg] && vrm_->hasStackSlot(virtReg)) {
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000221 assert(lastDef_[virtReg] && "virtual register is mapped "
222 "to a register and but was not defined!");
223 MachineBasicBlock::iterator lastDef = lastDef_[virtReg];
224 MachineBasicBlock::iterator nextLastRef = next(lastDef);
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000225 mri_->storeRegToStackSlot(*lastDef->getParent(),
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000226 nextLastRef,
227 physReg,
Chris Lattner57f1b672004-08-15 21:56:44 +0000228 vrm_->getStackSlot(virtReg));
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000229 ++numStores;
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000230 DEBUG(std::cerr << "added: ";
Tanya Lattnerb1407622004-06-25 00:13:11 +0000231 prior(nextLastRef)->print(std::cerr, tm_);
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000232 std::cerr << "after: ";
Tanya Lattnerb1407622004-06-25 00:13:11 +0000233 lastDef->print(std::cerr, tm_));
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000234 lastDef_[virtReg] = 0;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000235 }
236 p2vMap_[physReg] = 0;
237 dirty_[physReg] = false;
238 }
239
240 void vacatePhysReg(MachineBasicBlock& mbb,
241 MachineBasicBlock::iterator mii,
242 unsigned physReg) {
243 vacateJustPhysReg(mbb, mii, physReg);
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000244 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as)
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000245 vacateJustPhysReg(mbb, mii, *as);
246 }
247
248 void handleUse(MachineBasicBlock& mbb,
249 MachineBasicBlock::iterator mii,
250 unsigned virtReg,
251 unsigned physReg) {
252 // check if we are replacing a previous mapping
253 if (p2vMap_[physReg] != virtReg) {
254 vacatePhysReg(mbb, mii, physReg);
255 p2vMap_[physReg] = virtReg;
256 // load if necessary
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000257 if (vrm_->hasStackSlot(virtReg)) {
258 mri_->loadRegFromStackSlot(mbb, mii, physReg,
Chris Lattner57f1b672004-08-15 21:56:44 +0000259 vrm_->getStackSlot(virtReg));
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000260 ++numLoads;
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000261 DEBUG(std::cerr << "added: ";
Tanya Lattnerb1407622004-06-25 00:13:11 +0000262 prior(mii)->print(std::cerr, tm_));
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000263 lastDef_[virtReg] = mii;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000264 }
265 }
266 }
267
268 void handleDef(MachineBasicBlock& mbb,
269 MachineBasicBlock::iterator mii,
270 unsigned virtReg,
271 unsigned physReg) {
272 // check if we are replacing a previous mapping
273 if (p2vMap_[physReg] != virtReg)
274 vacatePhysReg(mbb, mii, physReg);
275
276 p2vMap_[physReg] = virtReg;
277 dirty_[physReg] = true;
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000278 lastDef_[virtReg] = mii;
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000279 }
280
281 void eliminateVirtRegsInMbb(MachineBasicBlock& mbb) {
282 for (MachineBasicBlock::iterator mii = mbb.begin(),
283 mie = mbb.end(); mii != mie; ++mii) {
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000284
285 // if we have references to memory operands make sure
286 // we clear all physical registers that may contain
287 // the value of the spilled virtual register
288 VirtRegMap::MI2VirtMap::const_iterator i, e;
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000289 for (tie(i, e) = vrm_->getFoldedVirts(mii); i != e; ++i) {
Alkis Evlogimenos6a367f32004-03-09 08:35:13 +0000290 if (vrm_->hasPhys(i->second))
291 vacateJustPhysReg(mbb, mii, vrm_->getPhys(i->second));
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000292 }
293
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000294 // rewrite all used operands
295 for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
296 MachineOperand& op = mii->getOperand(i);
Alkis Evlogimenose3fcabe2004-02-25 23:21:52 +0000297 if (op.isRegister() && op.getReg() && op.isUse() &&
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000298 MRegisterInfo::isVirtualRegister(op.getReg())) {
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000299 unsigned virtReg = op.getReg();
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000300 unsigned physReg = vrm_->getPhys(virtReg);
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000301 handleUse(mbb, mii, virtReg, physReg);
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000302 mii->SetMachineOperandReg(i, physReg);
303 // mark as dirty if this is def&use
Alkis Evlogimenos57af2cf2004-02-27 04:51:35 +0000304 if (op.isDef()) {
305 dirty_[physReg] = true;
306 lastDef_[virtReg] = mii;
307 }
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000308 }
309 }
310
Alkis Evlogimenos6a367f32004-03-09 08:35:13 +0000311 // spill implicit physical register defs
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000312 const TargetInstrDescriptor& tid = tii_->get(mii->getOpcode());
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000313 for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
314 vacatePhysReg(mbb, mii, *id);
315
Alkis Evlogimenos6a367f32004-03-09 08:35:13 +0000316 // spill explicit physical register defs
317 for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
318 MachineOperand& op = mii->getOperand(i);
319 if (op.isRegister() && op.getReg() && !op.isUse() &&
320 MRegisterInfo::isPhysicalRegister(op.getReg()))
321 vacatePhysReg(mbb, mii, op.getReg());
322 }
323
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000324 // rewrite def operands (def&use was handled with the
325 // uses so don't check for those here)
326 for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
327 MachineOperand& op = mii->getOperand(i);
Alkis Evlogimenose3fcabe2004-02-25 23:21:52 +0000328 if (op.isRegister() && op.getReg() && !op.isUse())
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000329 if (MRegisterInfo::isPhysicalRegister(op.getReg()))
330 vacatePhysReg(mbb, mii, op.getReg());
331 else {
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000332 unsigned physReg = vrm_->getPhys(op.getReg());
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000333 handleDef(mbb, mii, op.getReg(), physReg);
334 mii->SetMachineOperandReg(i, physReg);
335 }
336 }
337
Tanya Lattnerb1407622004-06-25 00:13:11 +0000338 DEBUG(std::cerr << '\t'; mii->print(std::cerr, tm_));
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000339 }
340
341 for (unsigned i = 1, e = p2vMap_.size(); i != e; ++i)
342 vacateJustPhysReg(mbb, mbb.getFirstTerminator(), i);
343
344 }
345 };
346}
347
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000348llvm::Spiller* llvm::createSpiller()
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000349{
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000350 switch (SpillerOpt) {
351 default:
352 std::cerr << "no spiller selected";
353 abort();
354 case local:
355 return new LocalSpiller();
Alkis Evlogimenos499b2ba2004-03-06 22:38:29 +0000356 case simple:
357 return new SimpleSpiller();
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000358 }
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000359}