blob: fb694d5e1a8afade0b344f677edbb47438f8f6be [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"
Reid Spencer551ccae2004-09-01 22:55:40 +000023#include "llvm/ADT/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) {
Alkis Evlogimenosf174cc32004-05-29 19:03:29 +000057 grow();
58 }
59
60 void grow() {
61 v2pMap_.grow(mf_->getSSARegMap()->getLastVirtReg());
62 v2ssMap_.grow(mf_->getSSARegMap()->getLastVirtReg());
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000063 }
64
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000065 bool hasPhys(unsigned virtReg) const {
66 return getPhys(virtReg) != NO_PHYS_REG;
67 }
68
Alkis Evlogimenos79742872004-02-23 23:47:10 +000069 unsigned getPhys(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000070 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000071 return v2pMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000072 }
73
74 void assignVirt2Phys(unsigned virtReg, unsigned physReg) {
75 assert(MRegisterInfo::isVirtualRegister(virtReg) &&
76 MRegisterInfo::isPhysicalRegister(physReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000077 assert(v2pMap_[virtReg] == NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000078 "attempt to assign physical register to already mapped "
79 "virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000080 v2pMap_[virtReg] = physReg;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000081 }
82
Alkis Evlogimenosfc54e832004-02-27 06:11:15 +000083 void clearVirt(unsigned virtReg) {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000084 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000085 assert(v2pMap_[virtReg] != NO_PHYS_REG &&
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000086 "attempt to clear a not assigned virtual register");
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +000087 v2pMap_[virtReg] = NO_PHYS_REG;
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +000088 }
89
Alkis Evlogimenosa39fc0e2004-07-20 13:28:17 +000090 void clearAllVirt() {
91 v2pMap_.clear();
92 grow();
93 }
94
Alkis Evlogimenosec8b8bb2004-02-24 06:30:36 +000095 bool hasStackSlot(unsigned virtReg) const {
96 return getStackSlot(virtReg) != NO_STACK_SLOT;
97 }
98
Alkis Evlogimenos79742872004-02-23 23:47:10 +000099 int getStackSlot(unsigned virtReg) const {
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000100 assert(MRegisterInfo::isVirtualRegister(virtReg));
Alkis Evlogimenos4d0d8642004-02-25 21:55:45 +0000101 return v2ssMap_[virtReg];
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000102 }
103
104 int assignVirt2StackSlot(unsigned virtReg);
Alkis Evlogimenos38af59a2004-05-29 20:38:05 +0000105 void assignVirt2StackSlot(unsigned virtReg, int frameIndex);
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000106
Alkis Evlogimenos5f375022004-03-01 20:05:10 +0000107 void virtFolded(unsigned virtReg,
108 MachineInstr* oldMI,
109 MachineInstr* newMI);
110
111 std::pair<MI2VirtMap::const_iterator, MI2VirtMap::const_iterator>
112 getFoldedVirts(MachineInstr* MI) const {
113 return mi2vMap_.equal_range(MI);
114 }
115
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000116 friend std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
117 };
118
119 std::ostream& operator<<(std::ostream& os, const VirtRegMap& li);
120
Alkis Evlogimenosdd420e02004-03-01 23:18:15 +0000121 struct Spiller {
122 virtual ~Spiller();
123
124 virtual bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) = 0;
125
126 };
127
128 Spiller* createSpiller();
Alkis Evlogimenos0d6c5b62004-02-24 08:58:30 +0000129
Alkis Evlogimenos34d9bc92004-02-23 23:08:11 +0000130} // End llvm namespace
131
132#endif