blob: f6434989a19be640faf310c1efd9f8ff6385e5ee [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//
Chris Lattner8c4d88d2004-09-30 01:54:45 +000010// This file implements the VirtRegMap class.
11//
12// It also contains implementations of the the Spiller interface, which, given a
13// virtual register map and a machine function, eliminates all virtual
14// references by replacing them with physical register references - adding spill
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000015// code as necessary.
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000016//
17//===----------------------------------------------------------------------===//
18
Chris Lattner8c4d88d2004-09-30 01:54:45 +000019#define DEBUG_TYPE "spiller"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000020#include "VirtRegMap.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000021#include "llvm/Function.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000022#include "llvm/CodeGen/MachineFrameInfo.h"
Chris Lattner8c4d88d2004-09-30 01:54:45 +000023#include "llvm/CodeGen/MachineFunction.h"
24#include "llvm/CodeGen/SSARegMap.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000025#include "llvm/Target/TargetMachine.h"
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000026#include "llvm/Target/TargetInstrInfo.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000027#include "llvm/Support/CommandLine.h"
28#include "llvm/Support/Debug.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000029#include "llvm/ADT/Statistic.h"
30#include "llvm/ADT/STLExtras.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000031using namespace llvm;
32
33namespace {
Chris Lattner8c4d88d2004-09-30 01:54:45 +000034 Statistic<> NumSpills("spiller", "Number of register spills");
35 Statistic<> NumStores("spiller", "Number of stores added");
36 Statistic<> NumLoads ("spiller", "Number of loads added");
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000037
Chris Lattner8c4d88d2004-09-30 01:54:45 +000038 enum SpillerName { simple, local };
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +000039
Chris Lattner8c4d88d2004-09-30 01:54:45 +000040 cl::opt<SpillerName>
41 SpillerOpt("spiller",
42 cl::desc("Spiller to use: (default: local)"),
43 cl::Prefix,
44 cl::values(clEnumVal(simple, " simple spiller"),
45 clEnumVal(local, " local spiller"),
46 clEnumValEnd),
47 cl::init(local));
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000048}
49
Chris Lattner8c4d88d2004-09-30 01:54:45 +000050//===----------------------------------------------------------------------===//
51// VirtRegMap implementation
52//===----------------------------------------------------------------------===//
53
54void VirtRegMap::grow() {
Chris Lattner7f690e62004-09-30 02:15:18 +000055 Virt2PhysMap.grow(MF.getSSARegMap()->getLastVirtReg());
56 Virt2StackSlotMap.grow(MF.getSSARegMap()->getLastVirtReg());
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000057}
58
Chris Lattner8c4d88d2004-09-30 01:54:45 +000059int VirtRegMap::assignVirt2StackSlot(unsigned virtReg) {
60 assert(MRegisterInfo::isVirtualRegister(virtReg));
Chris Lattner7f690e62004-09-30 02:15:18 +000061 assert(Virt2StackSlotMap[virtReg] == NO_STACK_SLOT &&
Chris Lattner8c4d88d2004-09-30 01:54:45 +000062 "attempt to assign stack slot to already spilled register");
Chris Lattner7f690e62004-09-30 02:15:18 +000063 const TargetRegisterClass* RC = MF.getSSARegMap()->getRegClass(virtReg);
64 int frameIndex = MF.getFrameInfo()->CreateStackObject(RC->getSize(),
65 RC->getAlignment());
66 Virt2StackSlotMap[virtReg] = frameIndex;
Chris Lattner8c4d88d2004-09-30 01:54:45 +000067 ++NumSpills;
68 return frameIndex;
69}
70
71void VirtRegMap::assignVirt2StackSlot(unsigned virtReg, int frameIndex) {
72 assert(MRegisterInfo::isVirtualRegister(virtReg));
Chris Lattner7f690e62004-09-30 02:15:18 +000073 assert(Virt2StackSlotMap[virtReg] == NO_STACK_SLOT &&
Chris Lattner8c4d88d2004-09-30 01:54:45 +000074 "attempt to assign stack slot to already spilled register");
Chris Lattner7f690e62004-09-30 02:15:18 +000075 Virt2StackSlotMap[virtReg] = frameIndex;
Alkis Evlogimenos38af59a2004-05-29 20:38:05 +000076}
77
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000078void VirtRegMap::virtFolded(unsigned virtReg,
79 MachineInstr* oldMI,
Chris Lattner8c4d88d2004-09-30 01:54:45 +000080 MachineInstr* newMI) {
81 // move previous memory references folded to new instruction
Chris Lattner7f690e62004-09-30 02:15:18 +000082 MI2VirtMapTy::iterator i, e;
83 std::vector<MI2VirtMapTy::mapped_type> regs;
84 for (tie(i, e) = MI2VirtMap.equal_range(oldMI); i != e; ) {
Chris Lattner8c4d88d2004-09-30 01:54:45 +000085 regs.push_back(i->second);
Chris Lattner7f690e62004-09-30 02:15:18 +000086 MI2VirtMap.erase(i++);
Chris Lattner8c4d88d2004-09-30 01:54:45 +000087 }
88 for (unsigned i = 0, e = regs.size(); i != e; ++i)
Chris Lattner7f690e62004-09-30 02:15:18 +000089 MI2VirtMap.insert(std::make_pair(newMI, i));
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000090
Chris Lattner8c4d88d2004-09-30 01:54:45 +000091 // add new memory reference
Chris Lattner7f690e62004-09-30 02:15:18 +000092 MI2VirtMap.insert(std::make_pair(newMI, virtReg));
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000093}
94
Chris Lattner7f690e62004-09-30 02:15:18 +000095void VirtRegMap::print(std::ostream &OS) const {
96 const MRegisterInfo* MRI = MF.getTarget().getRegisterInfo();
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000097
Chris Lattner7f690e62004-09-30 02:15:18 +000098 OS << "********** REGISTER MAP **********\n";
Chris Lattner8c4d88d2004-09-30 01:54:45 +000099 for (unsigned i = MRegisterInfo::FirstVirtualRegister,
Chris Lattner7f690e62004-09-30 02:15:18 +0000100 e = MF.getSSARegMap()->getLastVirtReg(); i <= e; ++i) {
101 if (Virt2PhysMap[i] != (unsigned)VirtRegMap::NO_PHYS_REG)
102 OS << "[reg" << i << " -> " << MRI->getName(Virt2PhysMap[i]) << "]\n";
103
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000104 }
105
106 for (unsigned i = MRegisterInfo::FirstVirtualRegister,
Chris Lattner7f690e62004-09-30 02:15:18 +0000107 e = MF.getSSARegMap()->getLastVirtReg(); i <= e; ++i)
108 if (Virt2StackSlotMap[i] != VirtRegMap::NO_STACK_SLOT)
109 OS << "[reg" << i << " -> fi#" << Virt2StackSlotMap[i] << "]\n";
110 OS << '\n';
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000111}
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000112
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000113void VirtRegMap::dump() const { print(std::cerr); }
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000114
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000115
116//===----------------------------------------------------------------------===//
117// Simple Spiller Implementation
118//===----------------------------------------------------------------------===//
119
120Spiller::~Spiller() {}
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000121
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000122namespace {
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000123 struct SimpleSpiller : public Spiller {
124 bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap &VRM);
125 };
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000126}
127
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000128bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF,
129 const VirtRegMap& VRM) {
130 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
131 DEBUG(std::cerr << "********** Function: "
132 << MF.getFunction()->getName() << '\n');
133 const TargetMachine& TM = MF.getTarget();
Chris Lattner7f690e62004-09-30 02:15:18 +0000134 const MRegisterInfo& MRI = *TM.getRegisterInfo();
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000135
136 DenseMap<bool, VirtReg2IndexFunctor> Loaded;
137
138 for (MachineFunction::iterator mbbi = MF.begin(), E = MF.end();
139 mbbi != E; ++mbbi) {
140 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
141 for (MachineBasicBlock::iterator mii = mbbi->begin(),
142 mie = mbbi->end(); mii != mie; ++mii) {
143 Loaded.grow(MF.getSSARegMap()->getLastVirtReg());
144 for (unsigned i = 0,e = mii->getNumOperands(); i != e; ++i){
145 MachineOperand& mop = mii->getOperand(i);
146 if (mop.isRegister() && mop.getReg() &&
147 MRegisterInfo::isVirtualRegister(mop.getReg())) {
148 unsigned virtReg = mop.getReg();
149 unsigned physReg = VRM.getPhys(virtReg);
150 if (mop.isUse() && VRM.hasStackSlot(mop.getReg()) &&
151 !Loaded[virtReg]) {
Chris Lattner7f690e62004-09-30 02:15:18 +0000152 MRI.loadRegFromStackSlot(*mbbi, mii, physReg,
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000153 VRM.getStackSlot(virtReg));
154 Loaded[virtReg] = true;
155 DEBUG(std::cerr << '\t';
156 prior(mii)->print(std::cerr, &TM));
157 ++NumLoads;
158 }
159
160 if (mop.isDef() && VRM.hasStackSlot(mop.getReg())) {
Chris Lattner7f690e62004-09-30 02:15:18 +0000161 MRI.storeRegToStackSlot(*mbbi, next(mii), physReg,
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000162 VRM.getStackSlot(virtReg));
163 ++NumStores;
164 }
165 mii->SetMachineOperandReg(i, physReg);
166 }
167 }
168 DEBUG(std::cerr << '\t'; mii->print(std::cerr, &TM));
169 Loaded.clear();
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000170 }
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000171 }
172 return true;
173}
174
175//===----------------------------------------------------------------------===//
176// Local Spiller Implementation
177//===----------------------------------------------------------------------===//
178
179namespace {
180 class LocalSpiller : public Spiller {
181 typedef std::vector<unsigned> Phys2VirtMap;
182 typedef std::vector<bool> PhysFlag;
183 typedef DenseMap<MachineInstr*, VirtReg2IndexFunctor> Virt2MI;
184
185 MachineFunction *MF;
186 const TargetMachine *TM;
187 const TargetInstrInfo *TII;
188 const MRegisterInfo *MRI;
189 const VirtRegMap *VRM;
190 Phys2VirtMap p2vMap_;
191 PhysFlag dirty_;
192 Virt2MI lastDef_;
193
194 public:
195 bool runOnMachineFunction(MachineFunction &MF, const VirtRegMap &VRM);
196
197 private:
198 void vacateJustPhysReg(MachineBasicBlock& mbb,
199 MachineBasicBlock::iterator mii,
200 unsigned physReg);
201
202 void vacatePhysReg(MachineBasicBlock& mbb,
203 MachineBasicBlock::iterator mii,
204 unsigned physReg) {
205 vacateJustPhysReg(mbb, mii, physReg);
206 for (const unsigned* as = MRI->getAliasSet(physReg); *as; ++as)
207 vacateJustPhysReg(mbb, mii, *as);
208 }
209
210 void handleUse(MachineBasicBlock& mbb,
211 MachineBasicBlock::iterator mii,
212 unsigned virtReg,
213 unsigned physReg) {
214 // check if we are replacing a previous mapping
215 if (p2vMap_[physReg] != virtReg) {
216 vacatePhysReg(mbb, mii, physReg);
217 p2vMap_[physReg] = virtReg;
218 // load if necessary
219 if (VRM->hasStackSlot(virtReg)) {
220 MRI->loadRegFromStackSlot(mbb, mii, physReg,
221 VRM->getStackSlot(virtReg));
222 ++NumLoads;
223 DEBUG(std::cerr << "added: ";
224 prior(mii)->print(std::cerr, TM));
225 lastDef_[virtReg] = mii;
226 }
227 }
228 }
229
230 void handleDef(MachineBasicBlock& mbb,
231 MachineBasicBlock::iterator mii,
232 unsigned virtReg,
233 unsigned physReg) {
234 // check if we are replacing a previous mapping
235 if (p2vMap_[physReg] != virtReg)
236 vacatePhysReg(mbb, mii, physReg);
237
238 p2vMap_[physReg] = virtReg;
239 dirty_[physReg] = true;
240 lastDef_[virtReg] = mii;
241 }
242
243 void eliminateVirtRegsInMbb(MachineBasicBlock& mbb);
244 };
245}
246
247bool LocalSpiller::runOnMachineFunction(MachineFunction &mf,
248 const VirtRegMap &vrm) {
249 MF = &mf;
250 TM = &MF->getTarget();
251 TII = TM->getInstrInfo();
252 MRI = TM->getRegisterInfo();
253 VRM = &vrm;
254 p2vMap_.assign(MRI->getNumRegs(), 0);
255 dirty_.assign(MRI->getNumRegs(), false);
256
257 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
258 DEBUG(std::cerr << "********** Function: "
259 << MF->getFunction()->getName() << '\n');
260
261 for (MachineFunction::iterator mbbi = MF->begin(),
262 mbbe = MF->end(); mbbi != mbbe; ++mbbi) {
263 lastDef_.grow(MF->getSSARegMap()->getLastVirtReg());
264 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
265 eliminateVirtRegsInMbb(*mbbi);
266 // clear map, dirty flag and last ref
267 p2vMap_.assign(p2vMap_.size(), 0);
268 dirty_.assign(dirty_.size(), false);
269 lastDef_.clear();
270 }
271 return true;
272}
273
274void LocalSpiller::vacateJustPhysReg(MachineBasicBlock& mbb,
275 MachineBasicBlock::iterator mii,
276 unsigned physReg) {
277 unsigned virtReg = p2vMap_[physReg];
278 if (dirty_[physReg] && VRM->hasStackSlot(virtReg)) {
279 assert(lastDef_[virtReg] && "virtual register is mapped "
280 "to a register and but was not defined!");
281 MachineBasicBlock::iterator lastDef = lastDef_[virtReg];
282 MachineBasicBlock::iterator nextLastRef = next(lastDef);
283 MRI->storeRegToStackSlot(*lastDef->getParent(),
284 nextLastRef,
285 physReg,
286 VRM->getStackSlot(virtReg));
287 ++NumStores;
288 DEBUG(std::cerr << "added: ";
289 prior(nextLastRef)->print(std::cerr, TM);
290 std::cerr << "after: ";
291 lastDef->print(std::cerr, TM));
292 lastDef_[virtReg] = 0;
293 }
294 p2vMap_[physReg] = 0;
295 dirty_[physReg] = false;
296}
297
298void LocalSpiller::eliminateVirtRegsInMbb(MachineBasicBlock &MBB) {
299 for (MachineBasicBlock::iterator MI = MBB.begin(), E = MBB.end();
300 MI != E; ++MI) {
301
302 // if we have references to memory operands make sure
303 // we clear all physical registers that may contain
304 // the value of the spilled virtual register
Chris Lattner7f690e62004-09-30 02:15:18 +0000305 VirtRegMap::MI2VirtMapTy::const_iterator i, e;
Chris Lattner8c4d88d2004-09-30 01:54:45 +0000306 for (tie(i, e) = VRM->getFoldedVirts(MI); i != e; ++i) {
307 if (VRM->hasPhys(i->second))
308 vacateJustPhysReg(MBB, MI, VRM->getPhys(i->second));
309 }
310
311 // rewrite all used operands
312 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
313 MachineOperand& op = MI->getOperand(i);
314 if (op.isRegister() && op.getReg() && op.isUse() &&
315 MRegisterInfo::isVirtualRegister(op.getReg())) {
316 unsigned virtReg = op.getReg();
317 unsigned physReg = VRM->getPhys(virtReg);
318 handleUse(MBB, MI, virtReg, physReg);
319 MI->SetMachineOperandReg(i, physReg);
320 // mark as dirty if this is def&use
321 if (op.isDef()) {
322 dirty_[physReg] = true;
323 lastDef_[virtReg] = MI;
324 }
325 }
326 }
327
328 // spill implicit physical register defs
329 const TargetInstrDescriptor& tid = TII->get(MI->getOpcode());
330 for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
331 vacatePhysReg(MBB, MI, *id);
332
333 // spill explicit physical register defs
334 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
335 MachineOperand& op = MI->getOperand(i);
336 if (op.isRegister() && op.getReg() && !op.isUse() &&
337 MRegisterInfo::isPhysicalRegister(op.getReg()))
338 vacatePhysReg(MBB, MI, op.getReg());
339 }
340
341 // rewrite def operands (def&use was handled with the
342 // uses so don't check for those here)
343 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
344 MachineOperand& op = MI->getOperand(i);
345 if (op.isRegister() && op.getReg() && !op.isUse())
346 if (MRegisterInfo::isPhysicalRegister(op.getReg()))
347 vacatePhysReg(MBB, MI, op.getReg());
348 else {
349 unsigned physReg = VRM->getPhys(op.getReg());
350 handleDef(MBB, MI, op.getReg(), physReg);
351 MI->SetMachineOperandReg(i, physReg);
352 }
353 }
354
355 DEBUG(std::cerr << '\t'; MI->print(std::cerr, TM));
356 }
357
358 for (unsigned i = 1, e = p2vMap_.size(); i != e; ++i)
359 vacateJustPhysReg(MBB, MBB.getFirstTerminator(), i);
360}
361
362
363llvm::Spiller* llvm::createSpiller() {
364 switch (SpillerOpt) {
365 default: assert(0 && "Unreachable!");
366 case local:
367 return new LocalSpiller();
368 case simple:
369 return new SimpleSpiller();
370 }
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000371}