blob: bfbe0ef9c5ab2e987ffd7b2b2c4885a4eb13487f [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//
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}