VirtRegMap.cpp revision 5ae00066c6fca3ec479245191f1766a553acb1ec
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. It also implements 11// the eliminateVirtRegs() function that given a virtual register map 12// and a machine function it eliminates all virtual references by 13// replacing them with physical register references and adds spill 14// code as necessary. 15// 16//===----------------------------------------------------------------------===// 17 18#define DEBUG_TYPE "regalloc" 19#include "VirtRegMap.h" 20#include "llvm/Function.h" 21#include "llvm/CodeGen/MachineFrameInfo.h" 22#include "llvm/CodeGen/MachineInstr.h" 23#include "llvm/Target/TargetMachine.h" 24#include "llvm/Target/TargetInstrInfo.h" 25#include "Support/CommandLine.h" 26#include "Support/Debug.h" 27#include "Support/DenseMap.h" 28#include "Support/Statistic.h" 29#include "Support/STLExtras.h" 30#include <iostream> 31 32using namespace llvm; 33 34namespace { 35 Statistic<> numSpills("spiller", "Number of register spills"); 36 Statistic<> numStores("spiller", "Number of stores added"); 37 Statistic<> numLoads ("spiller", "Number of loads added"); 38 39 enum SpillerName { simple, local }; 40 41 cl::opt<SpillerName> 42 SpillerOpt("spiller", 43 cl::desc("Spiller to use: (default: local)"), 44 cl::Prefix, 45 cl::values(clEnumVal(simple, " simple spiller"), 46 clEnumVal(local, " local spiller"), 47 0), 48 cl::init(local)); 49} 50 51int VirtRegMap::assignVirt2StackSlot(unsigned virtReg) 52{ 53 assert(MRegisterInfo::isVirtualRegister(virtReg)); 54 assert(v2ssMap_[virtReg] == NO_STACK_SLOT && 55 "attempt to assign stack slot to already spilled register"); 56 const TargetRegisterClass* rc = 57 mf_->getSSARegMap()->getRegClass(virtReg); 58 int frameIndex = mf_->getFrameInfo()->CreateStackObject(rc); 59 v2ssMap_[virtReg] = frameIndex; 60 ++numSpills; 61 return frameIndex; 62} 63 64void VirtRegMap::virtFolded(unsigned virtReg, 65 MachineInstr* oldMI, 66 MachineInstr* newMI) 67{ 68 // move previous memory references folded to new instruction 69 MI2VirtMap::iterator i, e; 70 std::vector<MI2VirtMap::mapped_type> regs; 71 for (tie(i, e) = mi2vMap_.equal_range(oldMI); i != e; ) { 72 regs.push_back(i->second); 73 mi2vMap_.erase(i++); 74 } 75 for (unsigned i = 0, e = regs.size(); i != e; ++i) 76 mi2vMap_.insert(std::make_pair(newMI, i)); 77 78 // add new memory reference 79 mi2vMap_.insert(std::make_pair(newMI, virtReg)); 80} 81 82std::ostream& llvm::operator<<(std::ostream& os, const VirtRegMap& vrm) 83{ 84 const MRegisterInfo* mri = vrm.mf_->getTarget().getRegisterInfo(); 85 86 std::cerr << "********** REGISTER MAP **********\n"; 87 for (unsigned i = MRegisterInfo::FirstVirtualRegister, 88 e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) { 89 if (vrm.v2pMap_[i] != VirtRegMap::NO_PHYS_REG) 90 std::cerr << "[reg" << i << " -> " 91 << mri->getName(vrm.v2pMap_[i]) << "]\n"; 92 } 93 for (unsigned i = MRegisterInfo::FirstVirtualRegister, 94 e = vrm.mf_->getSSARegMap()->getLastVirtReg(); i <= e; ++i) { 95 if (vrm.v2ssMap_[i] != VirtRegMap::NO_STACK_SLOT) 96 std::cerr << "[reg" << i << " -> fi#" 97 << vrm.v2ssMap_[i] << "]\n"; 98 } 99 return std::cerr << '\n'; 100} 101 102Spiller::~Spiller() 103{ 104 105} 106 107namespace { 108 109 class SimpleSpiller : public Spiller { 110 public: 111 bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) { 112 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n"); 113 DEBUG(std::cerr << "********** Function: " 114 << mf.getFunction()->getName() << '\n'); 115 const TargetMachine& tm = mf.getTarget(); 116 const MRegisterInfo& mri = *tm.getRegisterInfo(); 117 118 typedef DenseMap<bool, VirtReg2IndexFunctor> Loaded; 119 Loaded loaded; 120 121 for (MachineFunction::iterator mbbi = mf.begin(), 122 mbbe = mf.end(); mbbi != mbbe; ++mbbi) { 123 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n"); 124 for (MachineBasicBlock::iterator mii = mbbi->begin(), 125 mie = mbbi->end(); mii != mie; ++mii) { 126 loaded.grow(mf.getSSARegMap()->getLastVirtReg()); 127 for (unsigned i = 0,e = mii->getNumOperands(); i != e; ++i){ 128 MachineOperand& mop = mii->getOperand(i); 129 if (mop.isRegister() && mop.getReg() && 130 MRegisterInfo::isVirtualRegister(mop.getReg())) { 131 unsigned virtReg = mop.getReg(); 132 unsigned physReg = vrm.getPhys(virtReg); 133 if (mop.isUse() && 134 vrm.hasStackSlot(mop.getReg()) && 135 !loaded[virtReg]) { 136 mri.loadRegFromStackSlot( 137 *mbbi, 138 mii, 139 physReg, 140 vrm.getStackSlot(virtReg), 141 mf.getSSARegMap()->getRegClass(virtReg)); 142 loaded[virtReg] = true; 143 DEBUG(std::cerr << '\t'; 144 prior(mii)->print(std::cerr, tm)); 145 ++numLoads; 146 } 147 if (mop.isDef() && 148 vrm.hasStackSlot(mop.getReg())) { 149 mri.storeRegToStackSlot( 150 *mbbi, 151 next(mii), 152 physReg, 153 vrm.getStackSlot(virtReg), 154 mf.getSSARegMap()->getRegClass(virtReg)); 155 ++numStores; 156 } 157 mii->SetMachineOperandReg(i, physReg); 158 } 159 } 160 DEBUG(std::cerr << '\t'; mii->print(std::cerr, tm)); 161 loaded.clear(); 162 } 163 } 164 return true; 165 } 166 }; 167 168 class LocalSpiller : public Spiller { 169 typedef std::vector<unsigned> Phys2VirtMap; 170 typedef std::vector<bool> PhysFlag; 171 typedef DenseMap<MachineInstr*, VirtReg2IndexFunctor> Virt2MI; 172 173 MachineFunction* mf_; 174 const TargetMachine* tm_; 175 const TargetInstrInfo* tii_; 176 const MRegisterInfo* mri_; 177 const VirtRegMap* vrm_; 178 Phys2VirtMap p2vMap_; 179 PhysFlag dirty_; 180 Virt2MI lastDef_; 181 182 public: 183 bool runOnMachineFunction(MachineFunction& mf, const VirtRegMap& vrm) { 184 mf_ = &mf; 185 tm_ = &mf_->getTarget(); 186 tii_ = &tm_->getInstrInfo(); 187 mri_ = tm_->getRegisterInfo(); 188 vrm_ = &vrm; 189 p2vMap_.assign(mri_->getNumRegs(), 0); 190 dirty_.assign(mri_->getNumRegs(), false); 191 192 DEBUG(std::cerr << "********** REWRITE MACHINE CODE **********\n"); 193 DEBUG(std::cerr << "********** Function: " 194 << mf_->getFunction()->getName() << '\n'); 195 196 for (MachineFunction::iterator mbbi = mf_->begin(), 197 mbbe = mf_->end(); mbbi != mbbe; ++mbbi) { 198 lastDef_.grow(mf_->getSSARegMap()->getLastVirtReg()); 199 DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n"); 200 eliminateVirtRegsInMbb(*mbbi); 201 // clear map, dirty flag and last ref 202 p2vMap_.assign(p2vMap_.size(), 0); 203 dirty_.assign(dirty_.size(), false); 204 lastDef_.clear(); 205 } 206 return true; 207 } 208 209 private: 210 void vacateJustPhysReg(MachineBasicBlock& mbb, 211 MachineBasicBlock::iterator mii, 212 unsigned physReg) { 213 unsigned virtReg = p2vMap_[physReg]; 214 if (dirty_[physReg] && vrm_->hasStackSlot(virtReg)) { 215 assert(lastDef_[virtReg] && "virtual register is mapped " 216 "to a register and but was not defined!"); 217 MachineBasicBlock::iterator lastDef = lastDef_[virtReg]; 218 MachineBasicBlock::iterator nextLastRef = next(lastDef); 219 mri_->storeRegToStackSlot(*lastDef->getParent(), 220 nextLastRef, 221 physReg, 222 vrm_->getStackSlot(virtReg), 223 mri_->getRegClass(physReg)); 224 ++numStores; 225 DEBUG(std::cerr << "added: "; 226 prior(nextLastRef)->print(std::cerr, *tm_); 227 std::cerr << "after: "; 228 lastDef->print(std::cerr, *tm_)); 229 lastDef_[virtReg] = 0; 230 } 231 p2vMap_[physReg] = 0; 232 dirty_[physReg] = false; 233 } 234 235 void vacatePhysReg(MachineBasicBlock& mbb, 236 MachineBasicBlock::iterator mii, 237 unsigned physReg) { 238 vacateJustPhysReg(mbb, mii, physReg); 239 for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) 240 vacateJustPhysReg(mbb, mii, *as); 241 } 242 243 void handleUse(MachineBasicBlock& mbb, 244 MachineBasicBlock::iterator mii, 245 unsigned virtReg, 246 unsigned physReg) { 247 // check if we are replacing a previous mapping 248 if (p2vMap_[physReg] != virtReg) { 249 vacatePhysReg(mbb, mii, physReg); 250 p2vMap_[physReg] = virtReg; 251 // load if necessary 252 if (vrm_->hasStackSlot(virtReg)) { 253 mri_->loadRegFromStackSlot(mbb, mii, physReg, 254 vrm_->getStackSlot(virtReg), 255 mri_->getRegClass(physReg)); 256 ++numLoads; 257 DEBUG(std::cerr << "added: "; 258 prior(mii)->print(std::cerr, *tm_)); 259 lastDef_[virtReg] = mii; 260 } 261 } 262 } 263 264 void handleDef(MachineBasicBlock& mbb, 265 MachineBasicBlock::iterator mii, 266 unsigned virtReg, 267 unsigned physReg) { 268 // check if we are replacing a previous mapping 269 if (p2vMap_[physReg] != virtReg) 270 vacatePhysReg(mbb, mii, physReg); 271 272 p2vMap_[physReg] = virtReg; 273 dirty_[physReg] = true; 274 lastDef_[virtReg] = mii; 275 } 276 277 void eliminateVirtRegsInMbb(MachineBasicBlock& mbb) { 278 for (MachineBasicBlock::iterator mii = mbb.begin(), 279 mie = mbb.end(); mii != mie; ++mii) { 280 281 // if we have references to memory operands make sure 282 // we clear all physical registers that may contain 283 // the value of the spilled virtual register 284 VirtRegMap::MI2VirtMap::const_iterator i, e; 285 for (tie(i, e) = vrm_->getFoldedVirts(mii); i != e; ++i) { 286 unsigned physReg = vrm_->getPhys(i->second); 287 if (physReg) vacateJustPhysReg(mbb, mii, physReg); 288 } 289 290 // rewrite all used operands 291 for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) { 292 MachineOperand& op = mii->getOperand(i); 293 if (op.isRegister() && op.getReg() && op.isUse() && 294 MRegisterInfo::isVirtualRegister(op.getReg())) { 295 unsigned virtReg = op.getReg(); 296 unsigned physReg = vrm_->getPhys(virtReg); 297 handleUse(mbb, mii, virtReg, physReg); 298 mii->SetMachineOperandReg(i, physReg); 299 // mark as dirty if this is def&use 300 if (op.isDef()) { 301 dirty_[physReg] = true; 302 lastDef_[virtReg] = mii; 303 } 304 } 305 } 306 307 // spill implicit defs 308 const TargetInstrDescriptor& tid = tii_->get(mii->getOpcode()); 309 for (const unsigned* id = tid.ImplicitDefs; *id; ++id) 310 vacatePhysReg(mbb, mii, *id); 311 312 // rewrite def operands (def&use was handled with the 313 // uses so don't check for those here) 314 for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) { 315 MachineOperand& op = mii->getOperand(i); 316 if (op.isRegister() && op.getReg() && !op.isUse()) 317 if (MRegisterInfo::isPhysicalRegister(op.getReg())) 318 vacatePhysReg(mbb, mii, op.getReg()); 319 else { 320 unsigned physReg = vrm_->getPhys(op.getReg()); 321 handleDef(mbb, mii, op.getReg(), physReg); 322 mii->SetMachineOperandReg(i, physReg); 323 } 324 } 325 326 DEBUG(std::cerr << '\t'; mii->print(std::cerr, *tm_)); 327 } 328 329 for (unsigned i = 1, e = p2vMap_.size(); i != e; ++i) 330 vacateJustPhysReg(mbb, mbb.getFirstTerminator(), i); 331 332 } 333 }; 334} 335 336llvm::Spiller* llvm::createSpiller() 337{ 338 switch (SpillerOpt) { 339 default: 340 std::cerr << "no spiller selected"; 341 abort(); 342 case local: 343 return new LocalSpiller(); 344 case simple: 345 return new SimpleSpiller(); 346 } 347} 348