blob: b0af8c5c739ded595bca0cad7aad6244a9308a14 [file] [log] [blame]
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +00001//===-- llvm/CodeGen/VirtRegMap.h - Virtual Register Map -*- C++ -*--------===//
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 a virtual register map. This maps virtual
11// registers to physical registers and virtual registers to stack
12// slots. It is created and updated by a register allocator and then
13// used by a machine code rewriter that adds spill code and rewrites
14// virtual into physical register references.
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_CODEGEN_VIRTREGMAP_H
19#define LLVM_CODEGEN_VIRTREGMAP_H
20
21#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/SSARegMap.h"
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000023#include "Support/DenseMap.h"
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000024#include <climits>
25
26namespace llvm {
27
28 class VirtRegMap {
29 public:
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000030 typedef DenseMap<unsigned, VirtReg2IndexFunctor> Virt2PhysMap;
31 typedef DenseMap<int, VirtReg2IndexFunctor> Virt2StackSlotMap;
Alkis Evlogimenos79742872004-02-23 23:47:10 +000032
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000033 private:
34 MachineFunction* mf_;
35 Virt2PhysMap v2pMap_;
36 Virt2StackSlotMap v2ssMap_;
37
38 // do not implement
39 VirtRegMap(const VirtRegMap& rhs);
40 const VirtRegMap& operator=(const VirtRegMap& rhs);
41
Alkis Evlogimenose8124b92004-02-23 23:49:40 +000042 enum {
43 NO_PHYS_REG = 0,
44 NO_STACK_SLOT = INT_MAX
45 };
46
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000047 public:
48 VirtRegMap(MachineFunction& mf)
49 : mf_(&mf),
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000050 v2pMap_(NO_PHYS_REG),
51 v2ssMap_(NO_STACK_SLOT) {
52 v2pMap_.grow(mf.getSSARegMap()->getLastVirtReg());
53 v2ssMap_.grow(mf.getSSARegMap()->getLastVirtReg());
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000054 }
55
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000056 bool hasPhys(unsigned virtReg) const {
57 return getPhys(virtReg) != NO_PHYS_REG;
58 }
59
Alkis Evlogimenos79742872004-02-23 23:47:10 +000060 unsigned getPhys(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000061 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000062 return v2pMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000063 }
64
65 void assignVirt2Phys(unsigned virtReg, unsigned physReg) {
66 assert(MRegisterInfo::isVirtualRegister(virtReg) &&
67 MRegisterInfo::isPhysicalRegister(physReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000068 assert(v2pMap_[virtReg] == NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000069 "attempt to assign physical register to already mapped "
70 "virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000071 v2pMap_[virtReg] = physReg;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000072 }
73
Alkis Evlogimenosfc54e832004-02-27 06:11:15 +000074 void clearVirt(unsigned virtReg) {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000075 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000076 assert(v2pMap_[virtReg] != NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000077 "attempt to clear a not assigned virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000078 v2pMap_[virtReg] = NO_PHYS_REG;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000079 }
80
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000081 bool hasStackSlot(unsigned virtReg) const {
82 return getStackSlot(virtReg) != NO_STACK_SLOT;
83 }
84
Alkis Evlogimenos79742872004-02-23 23:47:10 +000085 int getStackSlot(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000086 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000087 return v2ssMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000088 }
89
90 int assignVirt2StackSlot(unsigned virtReg);
91
92 friend std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
93 };
94
95 std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
96
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +000097 void eliminateVirtRegs(MachineFunction& mf, const VirtRegMap& vrm);
98
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000099} // End llvm namespace
100
101#endif