blob: 3c2f8eec4ad7ebf7f42ffa47bbf07e5b538341d5 [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>
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000025#include <map>
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000026
27namespace llvm {
28
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000029 class MachineInstr;
30
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000031 class VirtRegMap {
32 public:
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000033 typedef DenseMap<unsigned, VirtReg2IndexFunctor> Virt2PhysMap;
34 typedef DenseMap<int, VirtReg2IndexFunctor> Virt2StackSlotMap;
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000035 typedef std::multimap<MachineInstr*, unsigned> MI2VirtMap;
Alkis Evlogimenos79742872004-02-23 23:47:10 +000036
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000037 private:
38 MachineFunction* mf_;
39 Virt2PhysMap v2pMap_;
40 Virt2StackSlotMap v2ssMap_;
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000041 MI2VirtMap mi2vMap_;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000042
43 // do not implement
44 VirtRegMap(const VirtRegMap& rhs);
45 const VirtRegMap& operator=(const VirtRegMap& rhs);
46
Alkis Evlogimenose8124b92004-02-23 23:49:40 +000047 enum {
48 NO_PHYS_REG = 0,
49 NO_STACK_SLOT = INT_MAX
50 };
51
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000052 public:
53 VirtRegMap(MachineFunction& mf)
54 : mf_(&mf),
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000055 v2pMap_(NO_PHYS_REG),
56 v2ssMap_(NO_STACK_SLOT) {
57 v2pMap_.grow(mf.getSSARegMap()->getLastVirtReg());
58 v2ssMap_.grow(mf.getSSARegMap()->getLastVirtReg());
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000059 }
60
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000061 bool hasPhys(unsigned virtReg) const {
62 return getPhys(virtReg) != NO_PHYS_REG;
63 }
64
Alkis Evlogimenos79742872004-02-23 23:47:10 +000065 unsigned getPhys(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000066 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000067 return v2pMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000068 }
69
70 void assignVirt2Phys(unsigned virtReg, unsigned physReg) {
71 assert(MRegisterInfo::isVirtualRegister(virtReg) &&
72 MRegisterInfo::isPhysicalRegister(physReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000073 assert(v2pMap_[virtReg] == NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000074 "attempt to assign physical register to already mapped "
75 "virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000076 v2pMap_[virtReg] = physReg;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000077 }
78
Alkis Evlogimenosfc54e832004-02-27 06:11:15 +000079 void clearVirt(unsigned virtReg) {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000080 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000081 assert(v2pMap_[virtReg] != NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000082 "attempt to clear a not assigned virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000083 v2pMap_[virtReg] = NO_PHYS_REG;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000084 }
85
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000086 bool hasStackSlot(unsigned virtReg) const {
87 return getStackSlot(virtReg) != NO_STACK_SLOT;
88 }
89
Alkis Evlogimenos79742872004-02-23 23:47:10 +000090 int getStackSlot(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000091 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000092 return v2ssMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000093 }
94
95 int assignVirt2StackSlot(unsigned virtReg);
96
Alkis Evlogimenos5f375022004-03-01 20:05:10 +000097 void virtFolded(unsigned virtReg,
98 MachineInstr* oldMI,
99 MachineInstr* newMI);
100
101 std::pair<MI2VirtMap::const_iterator, MI2VirtMap::const_iterator>
102 getFoldedVirts(MachineInstr* MI) const {
103 return mi2vMap_.equal_range(MI);
104 }
105
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000106 friend std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
107 };
108
109 std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
110
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000111 struct Spiller {
112 virtual ~Spiller();
113
114 virtual bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) = 0;
115
116 };
117
118 Spiller* createSpiller();
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000119
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000120} // End llvm namespace
121
122#endif