VirtRegMap.cpp revision 34d9bc9f168d17c52eb57e024580bd9499695f91
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.
11//
12//===----------------------------------------------------------------------===//
13
14#include "VirtRegMap.h"
15#include "llvm/CodeGen/MachineFrameInfo.h"
16#include "llvm/Target/TargetMachine.h"
17#include "Support/Statistic.h"
18#include <iostream>
19
20using namespace llvm;
21
22namespace {
23    Statistic<> numSpills("ra-linearscan", "Number of register spills");
24}
25
26int VirtRegMap::assignVirt2StackSlot(unsigned virtReg)
27{
28    assert(MRegisterInfo::isVirtualRegister(virtReg));
29    assert(v2ssMap_[toIndex(virtReg)] == NO_STACK_SLOT &&
30           "attempt to assign stack slot to already spilled register");
31    const TargetRegisterClass* rc =
32        mf_->getSSARegMap()->getRegClass(virtReg);
33    int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc);
34    v2ssMap_[toIndex(virtReg)] = frameIndex;
35    ++numSpills;
36    return frameIndex;
37}
38
39std::ostream& llvm::operator<<(std::ostream& os, const VirtRegMap& vrm)
40{
41    const MRegisterInfo* mri = vrm.mf_->getTarget().getRegisterInfo();
42
43    std::cerr << "********** REGISTER MAP **********\n";
44    for (unsigned i = 0, e = vrm.v2pMap_.size(); i != e; ++i) {
45        if (vrm.v2pMap_[i] != VirtRegMap::NO_PHYS_REG)
46            std::cerr << "[reg" << VirtRegMap::fromIndex(i) << " -> "
47                      << mri->getName(vrm.v2pMap_[i]) << "]\n";
48    }
49    for (unsigned i = 0, e = vrm.v2ssMap_.size(); i != e; ++i) {
50        if (vrm.v2ssMap_[i] != VirtRegMap::NO_STACK_SLOT)
51            std::cerr << "[reg" << VirtRegMap::fromIndex(i) << " -> fi#"
52                      << vrm.v2ssMap_[i] << "]\n";
53    }
54    return std::cerr << '\n';
55}
56