VirtRegMap.cpp revision 57f1b67c347b9ba1f8a1cdc3a55362d4f2aa8653
1//===-- 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//
10// 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.
15//
16//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "regalloc"
19#include "VirtRegMap.h"
20#include "llvm/Function.h"
21#include "llvm/CodeGen/MachineFrameInfo.h"
22#include "llvm/CodeGen/MachineInstr.h"
23#include "llvm/Target/TargetMachine.h"
24#include "llvm/Target/TargetInstrInfo.h"
25#include "Support/CommandLine.h"
26#include "Support/Debug.h"
27#include "Support/DenseMap.h"
28#include "Support/Statistic.h"
29#include "Support/STLExtras.h"
30
31using namespace llvm;
32
33namespace {
34    Statistic<> numSpills("spiller", "Number of register spills");
35    Statistic<> numStores("spiller", "Number of stores added");
36    Statistic<> numLoads ("spiller", "Number of loads added");
37
38    enum SpillerName { simple, local };
39
40    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));
48}
49
50int VirtRegMap::assignVirt2StackSlot(unsigned virtReg)
51{
52    assert(MRegisterInfo::isVirtualRegister(virtReg));
53    assert(v2ssMap_[virtReg] == NO_STACK_SLOT &&
54           "attempt to assign stack slot to already spilled register");
55    const TargetRegisterClass* rc =
56        mf_->getSSARegMap()->getRegClass(virtReg);
57    int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
58    v2ssMap_[virtReg] = frameIndex;
59    ++numSpills;
60    return frameIndex;
61}
62
63void VirtRegMap::assignVirt2StackSlot(unsigned virtReg, int frameIndex)
64{
65    assert(MRegisterInfo::isVirtualRegister(virtReg));
66    assert(v2ssMap_[virtReg] == NO_STACK_SLOT &&
67           "attempt to assign stack slot to already spilled register");
68     v2ssMap_[virtReg] = frameIndex;
69}
70
71void VirtRegMap::virtFolded(unsigned virtReg,
72                            MachineInstr* oldMI,
73                            MachineInstr* newMI)
74{
75    // move previous memory references folded to new instruction
76    MI2VirtMap::iterator i, e;
77    std::vector<MI2VirtMap::mapped_type> regs;
78    for (tie(i, e) = mi2vMap_.equal_range(oldMI); i != e; ) {
79        regs.push_back(i->second);
80        mi2vMap_.erase(i++);
81    }
82    for (unsigned i = 0, e = regs.size(); i != e; ++i)
83        mi2vMap_.insert(std::make_pair(newMI, i));
84
85    // add new memory reference
86    mi2vMap_.insert(std::make_pair(newMI, virtReg));
87}
88
89std::ostream& llvm::operator<<(std::ostream& os, const VirtRegMap& vrm)
90{
91    const MRegisterInfo* mri = vrm.mf_->getTarget().getRegisterInfo();
92
93    std::cerr << "********** REGISTER MAP **********\n";
94    for (unsigned i = MRegisterInfo::FirstVirtualRegister,
95             e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) {
96        if (vrm.v2pMap_[i] != VirtRegMap::NO_PHYS_REG)
97            std::cerr << "[reg" << i << " -> "
98                      << mri->getName(vrm.v2pMap_[i]) << "]\n";
99    }
100    for (unsigned i = MRegisterInfo::FirstVirtualRegister,
101             e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) {
102        if (vrm.v2ssMap_[i] != VirtRegMap::NO_STACK_SLOT)
103            std::cerr << "[reg" << i << " -> fi#"
104                      << vrm.v2ssMap_[i] << "]\n";
105    }
106    return std::cerr << '\n';
107}
108
109Spiller::~Spiller()
110{
111
112}
113
114namespace {
115
116    class SimpleSpiller : public Spiller {
117    public:
118        bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) {
119            DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
120            DEBUG(std::cerr << "********** Function: "
121              << mf.getFunction()->getName() << '\n');
122            const TargetMachine& tm = mf.getTarget();
123            const MRegisterInfo& mri = *tm.getRegisterInfo();
124
125            typedef DenseMap<bool, VirtReg2IndexFunctor> Loaded;
126            Loaded loaded;
127
128            for (MachineFunction::iterator mbbi = mf.begin(),
129                     mbbe = mf.end(); mbbi != mbbe; ++mbbi) {
130                DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
131                for (MachineBasicBlock::iterator mii = mbbi->begin(),
132                         mie = mbbi->end(); mii != mie; ++mii) {
133                    loaded.grow(mf.getSSARegMap()->getLastVirtReg());
134                    for (unsigned i = 0,e = mii->getNumOperands(); i != e; ++i){
135                        MachineOperand& mop = mii->getOperand(i);
136                        if (mop.isRegister() && mop.getReg() &&
137                            MRegisterInfo::isVirtualRegister(mop.getReg())) {
138                            unsigned virtReg = mop.getReg();
139                            unsigned physReg = vrm.getPhys(virtReg);
140                            if (mop.isUse() &&
141                                vrm.hasStackSlot(mop.getReg()) &&
142                                !loaded[virtReg]) {
143                                mri.loadRegFromStackSlot(
144                                    *mbbi,
145                                    mii,
146                                    physReg,
147                                    vrm.getStackSlot(virtReg));
148                                loaded[virtReg] = true;
149                                DEBUG(std::cerr << '\t';
150                                      prior(mii)->print(std::cerr, &tm));
151                                ++numLoads;
152                            }
153                            if (mop.isDef() &&
154                                vrm.hasStackSlot(mop.getReg())) {
155                                mri.storeRegToStackSlot(
156                                    *mbbi,
157                                    next(mii),
158                                    physReg,
159                                    vrm.getStackSlot(virtReg));
160                                ++numStores;
161                            }
162                            mii->SetMachineOperandReg(i, physReg);
163                        }
164                    }
165                    DEBUG(std::cerr << '\t'; mii->print(std::cerr, &tm));
166                    loaded.clear();
167                }
168            }
169            return true;
170        }
171    };
172
173    class LocalSpiller : public Spiller {
174        typedef std::vector<unsigned> Phys2VirtMap;
175        typedef std::vector<bool> PhysFlag;
176        typedef DenseMap<MachineInstr*, VirtReg2IndexFunctor> Virt2MI;
177
178        MachineFunction* mf_;
179        const TargetMachine* tm_;
180        const TargetInstrInfo* tii_;
181        const MRegisterInfo* mri_;
182        const VirtRegMap* vrm_;
183        Phys2VirtMap p2vMap_;
184        PhysFlag dirty_;
185        Virt2MI lastDef_;
186
187    public:
188        bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) {
189            mf_ = &mf;
190            tm_ = &mf_->getTarget();
191            tii_ = tm_->getInstrInfo();
192            mri_ = tm_->getRegisterInfo();
193            vrm_ = &vrm;
194            p2vMap_.assign(mri_->getNumRegs(), 0);
195            dirty_.assign(mri_->getNumRegs(), false);
196
197            DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n");
198            DEBUG(std::cerr << "********** Function: "
199                  << mf_->getFunction()->getName() << '\n');
200
201            for (MachineFunction::iterator mbbi = mf_->begin(),
202                     mbbe = mf_->end(); mbbi != mbbe; ++mbbi) {
203                lastDef_.grow(mf_->getSSARegMap()->getLastVirtReg());
204                DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
205                eliminateVirtRegsInMbb(*mbbi);
206                // clear map, dirty flag and last ref
207                p2vMap_.assign(p2vMap_.size(), 0);
208                dirty_.assign(dirty_.size(), false);
209                lastDef_.clear();
210            }
211            return true;
212        }
213
214    private:
215        void vacateJustPhysReg(MachineBasicBlock& mbb,
216                               MachineBasicBlock::iterator mii,
217                               unsigned physReg) {
218            unsigned virtReg = p2vMap_[physReg];
219            if (dirty_[physReg] && vrm_->hasStackSlot(virtReg)) {
220                assert(lastDef_[virtReg] && "virtual register is mapped "
221                       "to a register and but was not defined!");
222                MachineBasicBlock::iterator lastDef = lastDef_[virtReg];
223                MachineBasicBlock::iterator nextLastRef = next(lastDef);
224                mri_->storeRegToStackSlot(*lastDef->getParent(),
225                                          nextLastRef,
226                                          physReg,
227                                          vrm_->getStackSlot(virtReg));
228                ++numStores;
229                DEBUG(std::cerr << "added: ";
230                      prior(nextLastRef)->print(std::cerr, tm_);
231                      std::cerr << "after: ";
232                      lastDef->print(std::cerr, tm_));
233                lastDef_[virtReg] = 0;
234            }
235            p2vMap_[physReg] = 0;
236            dirty_[physReg] = false;
237        }
238
239        void vacatePhysReg(MachineBasicBlock& mbb,
240                           MachineBasicBlock::iterator mii,
241                           unsigned physReg) {
242            vacateJustPhysReg(mbb, mii, physReg);
243            for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as)
244                vacateJustPhysReg(mbb, mii, *as);
245        }
246
247        void handleUse(MachineBasicBlock& mbb,
248                       MachineBasicBlock::iterator mii,
249                       unsigned virtReg,
250                       unsigned physReg) {
251            // check if we are replacing a previous mapping
252            if (p2vMap_[physReg] != virtReg) {
253                vacatePhysReg(mbb, mii, physReg);
254                p2vMap_[physReg] = virtReg;
255                // load if necessary
256                if (vrm_->hasStackSlot(virtReg)) {
257                    mri_->loadRegFromStackSlot(mbb, mii, physReg,
258                                               vrm_->getStackSlot(virtReg));
259                    ++numLoads;
260                    DEBUG(std::cerr << "added: ";
261                          prior(mii)->print(std::cerr, tm_));
262                    lastDef_[virtReg] = mii;
263                }
264            }
265        }
266
267        void handleDef(MachineBasicBlock& mbb,
268                       MachineBasicBlock::iterator mii,
269                       unsigned virtReg,
270                       unsigned physReg) {
271            // check if we are replacing a previous mapping
272            if (p2vMap_[physReg] != virtReg)
273                vacatePhysReg(mbb, mii, physReg);
274
275            p2vMap_[physReg] = virtReg;
276            dirty_[physReg] = true;
277            lastDef_[virtReg] = mii;
278        }
279
280        void eliminateVirtRegsInMbb(MachineBasicBlock& mbb) {
281            for (MachineBasicBlock::iterator mii = mbb.begin(),
282                     mie = mbb.end(); mii != mie; ++mii) {
283
284                // if we have references to memory operands make sure
285                // we clear all physical registers that may contain
286                // the value of the spilled virtual register
287                VirtRegMap::MI2VirtMap::const_iterator i, e;
288                for (tie(i, e) = vrm_->getFoldedVirts(mii); i != e; ++i) {
289                    if (vrm_->hasPhys(i->second))
290                        vacateJustPhysReg(mbb, mii, vrm_->getPhys(i->second));
291                }
292
293                // rewrite all used operands
294                for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
295                    MachineOperand& op = mii->getOperand(i);
296                    if (op.isRegister() && op.getReg() && op.isUse() &&
297                        MRegisterInfo::isVirtualRegister(op.getReg())) {
298                        unsigned virtReg = op.getReg();
299                        unsigned physReg = vrm_->getPhys(virtReg);
300                        handleUse(mbb, mii, virtReg, physReg);
301                        mii->SetMachineOperandReg(i, physReg);
302                        // mark as dirty if this is def&use
303                        if (op.isDef()) {
304                            dirty_[physReg] = true;
305                            lastDef_[virtReg] = mii;
306                        }
307                    }
308                }
309
310                // spill implicit physical register defs
311                const TargetInstrDescriptor& tid = tii_->get(mii->getOpcode());
312                for (const unsigned* id = tid.ImplicitDefs; *id; ++id)
313                    vacatePhysReg(mbb, mii, *id);
314
315                // spill explicit physical register defs
316                for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
317                    MachineOperand& op = mii->getOperand(i);
318                    if (op.isRegister() && op.getReg() && !op.isUse() &&
319                        MRegisterInfo::isPhysicalRegister(op.getReg()))
320                        vacatePhysReg(mbb, mii, op.getReg());
321                }
322
323                // rewrite def operands (def&use was handled with the
324                // uses so don't check for those here)
325                for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
326                    MachineOperand& op = mii->getOperand(i);
327                    if (op.isRegister() && op.getReg() && !op.isUse())
328                        if (MRegisterInfo::isPhysicalRegister(op.getReg()))
329                            vacatePhysReg(mbb, mii, op.getReg());
330                        else {
331                            unsigned physReg = vrm_->getPhys(op.getReg());
332                            handleDef(mbb, mii, op.getReg(), physReg);
333                            mii->SetMachineOperandReg(i, physReg);
334                        }
335                }
336
337                DEBUG(std::cerr << '\t'; mii->print(std::cerr, tm_));
338            }
339
340            for (unsigned i = 1, e = p2vMap_.size(); i != e; ++i)
341                vacateJustPhysReg(mbb, mbb.getFirstTerminator(), i);
342
343        }
344    };
345}
346
347llvm::Spiller* llvm::createSpiller()
348{
349    switch (SpillerOpt) {
350    default:
351        std::cerr << "no spiller selected";
352        abort();
353    case local:
354        return new LocalSpiller();
355    case simple:
356        return new SimpleSpiller();
357    }
358}
359