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