InlineSpiller.cpp revision 57d0f2deb0afefe69770a28937a4363e7b1f9753
1//===-------- InlineSpiller.cpp - Insert spills and restores inline -------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// The inline spiller modifies the machine function directly instead of 11// inserting spills and restores in VirtRegMap. 12// 13//===----------------------------------------------------------------------===// 14 15#define DEBUG_TYPE "spiller" 16#include "Spiller.h" 17#include "SplitKit.h" 18#include "VirtRegMap.h" 19#include "llvm/CodeGen/LiveIntervalAnalysis.h" 20#include "llvm/CodeGen/MachineFrameInfo.h" 21#include "llvm/CodeGen/MachineFunction.h" 22#include "llvm/CodeGen/MachineLoopInfo.h" 23#include "llvm/CodeGen/MachineRegisterInfo.h" 24#include "llvm/Target/TargetMachine.h" 25#include "llvm/Target/TargetInstrInfo.h" 26#include "llvm/Support/Debug.h" 27#include "llvm/Support/raw_ostream.h" 28 29using namespace llvm; 30 31namespace { 32class InlineSpiller : public Spiller { 33 MachineFunctionPass &pass_; 34 MachineFunction &mf_; 35 LiveIntervals &lis_; 36 MachineLoopInfo &loops_; 37 VirtRegMap &vrm_; 38 MachineFrameInfo &mfi_; 39 MachineRegisterInfo &mri_; 40 const TargetInstrInfo &tii_; 41 const TargetRegisterInfo &tri_; 42 const BitVector reserved_; 43 44 SplitAnalysis splitAnalysis_; 45 46 // Variables that are valid during spill(), but used by multiple methods. 47 LiveInterval *li_; 48 SmallVectorImpl<LiveInterval*> *newIntervals_; 49 const TargetRegisterClass *rc_; 50 int stackSlot_; 51 const SmallVectorImpl<LiveInterval*> *spillIs_; 52 53 // Values of the current interval that can potentially remat. 54 SmallPtrSet<VNInfo*, 8> reMattable_; 55 56 // Values in reMattable_ that failed to remat at some point. 57 SmallPtrSet<VNInfo*, 8> usedValues_; 58 59 ~InlineSpiller() {} 60 61public: 62 InlineSpiller(MachineFunctionPass &pass, 63 MachineFunction &mf, 64 VirtRegMap &vrm) 65 : pass_(pass), 66 mf_(mf), 67 lis_(pass.getAnalysis<LiveIntervals>()), 68 loops_(pass.getAnalysis<MachineLoopInfo>()), 69 vrm_(vrm), 70 mfi_(*mf.getFrameInfo()), 71 mri_(mf.getRegInfo()), 72 tii_(*mf.getTarget().getInstrInfo()), 73 tri_(*mf.getTarget().getRegisterInfo()), 74 reserved_(tri_.getReservedRegs(mf_)), 75 splitAnalysis_(mf, lis_, loops_) {} 76 77 void spill(LiveInterval *li, 78 SmallVectorImpl<LiveInterval*> &newIntervals, 79 SmallVectorImpl<LiveInterval*> &spillIs); 80 81private: 82 bool split(); 83 84 bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx, 85 SlotIndex UseIdx); 86 bool reMaterializeFor(MachineBasicBlock::iterator MI); 87 void reMaterializeAll(); 88 89 bool coalesceStackAccess(MachineInstr *MI); 90 bool foldMemoryOperand(MachineBasicBlock::iterator MI, 91 const SmallVectorImpl<unsigned> &Ops); 92 void insertReload(LiveInterval &NewLI, MachineBasicBlock::iterator MI); 93 void insertSpill(LiveInterval &NewLI, MachineBasicBlock::iterator MI); 94}; 95} 96 97namespace llvm { 98Spiller *createInlineSpiller(MachineFunctionPass &pass, 99 MachineFunction &mf, 100 VirtRegMap &vrm) { 101 return new InlineSpiller(pass, mf, vrm); 102} 103} 104 105/// split - try splitting the current interval into pieces that may allocate 106/// separately. Return true if successful. 107bool InlineSpiller::split() { 108 splitAnalysis_.analyze(li_); 109 110 // Try splitting around loops. 111 if (const MachineLoop *loop = splitAnalysis_.getBestSplitLoop()) { 112 SplitEditor(splitAnalysis_, lis_, vrm_, *newIntervals_) 113 .splitAroundLoop(loop); 114 return true; 115 } 116 117 // Try splitting into single block intervals. 118 SplitAnalysis::BlockPtrSet blocks; 119 if (splitAnalysis_.getMultiUseBlocks(blocks)) { 120 SplitEditor(splitAnalysis_, lis_, vrm_, *newIntervals_) 121 .splitSingleBlocks(blocks); 122 return true; 123 } 124 125 // Try splitting inside a basic block. 126 if (const MachineBasicBlock *MBB = splitAnalysis_.getBlockForInsideSplit()) { 127 SplitEditor(splitAnalysis_, lis_, vrm_, *newIntervals_) 128 .splitInsideBlock(MBB); 129 return true; 130 } 131 132 return false; 133} 134 135/// allUsesAvailableAt - Return true if all registers used by OrigMI at 136/// OrigIdx are also available with the same value at UseIdx. 137bool InlineSpiller::allUsesAvailableAt(const MachineInstr *OrigMI, 138 SlotIndex OrigIdx, 139 SlotIndex UseIdx) { 140 OrigIdx = OrigIdx.getUseIndex(); 141 UseIdx = UseIdx.getUseIndex(); 142 for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) { 143 const MachineOperand &MO = OrigMI->getOperand(i); 144 if (!MO.isReg() || !MO.getReg() || MO.getReg() == li_->reg) 145 continue; 146 // Reserved registers are OK. 147 if (MO.isUndef() || !lis_.hasInterval(MO.getReg())) 148 continue; 149 // We don't want to move any defs. 150 if (MO.isDef()) 151 return false; 152 // We cannot depend on virtual registers in spillIs_. They will be spilled. 153 for (unsigned si = 0, se = spillIs_->size(); si != se; ++si) 154 if ((*spillIs_)[si]->reg == MO.getReg()) 155 return false; 156 157 LiveInterval &LI = lis_.getInterval(MO.getReg()); 158 const VNInfo *OVNI = LI.getVNInfoAt(OrigIdx); 159 if (!OVNI) 160 continue; 161 if (OVNI != LI.getVNInfoAt(UseIdx)) 162 return false; 163 } 164 return true; 165} 166 167/// reMaterializeFor - Attempt to rematerialize li_->reg before MI instead of 168/// reloading it. 169bool InlineSpiller::reMaterializeFor(MachineBasicBlock::iterator MI) { 170 SlotIndex UseIdx = lis_.getInstructionIndex(MI).getUseIndex(); 171 VNInfo *OrigVNI = li_->getVNInfoAt(UseIdx); 172 if (!OrigVNI) { 173 DEBUG(dbgs() << "\tadding <undef> flags: "); 174 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 175 MachineOperand &MO = MI->getOperand(i); 176 if (MO.isReg() && MO.isUse() && MO.getReg() == li_->reg) 177 MO.setIsUndef(); 178 } 179 DEBUG(dbgs() << UseIdx << '\t' << *MI); 180 return true; 181 } 182 if (!reMattable_.count(OrigVNI)) { 183 DEBUG(dbgs() << "\tusing non-remat valno " << OrigVNI->id << ": " 184 << UseIdx << '\t' << *MI); 185 return false; 186 } 187 MachineInstr *OrigMI = lis_.getInstructionFromIndex(OrigVNI->def); 188 if (!allUsesAvailableAt(OrigMI, OrigVNI->def, UseIdx)) { 189 usedValues_.insert(OrigVNI); 190 DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << *MI); 191 return false; 192 } 193 194 // If the instruction also writes li_->reg, it had better not require the same 195 // register for uses and defs. 196 bool Reads, Writes; 197 SmallVector<unsigned, 8> Ops; 198 tie(Reads, Writes) = MI->readsWritesVirtualRegister(li_->reg, &Ops); 199 if (Writes) { 200 for (unsigned i = 0, e = Ops.size(); i != e; ++i) { 201 MachineOperand &MO = MI->getOperand(Ops[i]); 202 if (MO.isUse() ? MI->isRegTiedToDefOperand(Ops[i]) : MO.getSubReg()) { 203 usedValues_.insert(OrigVNI); 204 DEBUG(dbgs() << "\tcannot remat tied reg: " << UseIdx << '\t' << *MI); 205 return false; 206 } 207 } 208 } 209 210 // Alocate a new register for the remat. 211 unsigned NewVReg = mri_.createVirtualRegister(rc_); 212 vrm_.grow(); 213 LiveInterval &NewLI = lis_.getOrCreateInterval(NewVReg); 214 NewLI.markNotSpillable(); 215 newIntervals_->push_back(&NewLI); 216 217 // Finally we can rematerialize OrigMI before MI. 218 MachineBasicBlock &MBB = *MI->getParent(); 219 tii_.reMaterialize(MBB, MI, NewLI.reg, 0, OrigMI, tri_); 220 MachineBasicBlock::iterator RematMI = MI; 221 SlotIndex DefIdx = lis_.InsertMachineInstrInMaps(--RematMI).getDefIndex(); 222 DEBUG(dbgs() << "\tremat: " << DefIdx << '\t' << *RematMI); 223 224 // Replace operands 225 for (unsigned i = 0, e = Ops.size(); i != e; ++i) { 226 MachineOperand &MO = MI->getOperand(Ops[i]); 227 if (MO.isReg() && MO.isUse() && MO.getReg() == li_->reg) { 228 MO.setReg(NewVReg); 229 MO.setIsKill(); 230 } 231 } 232 DEBUG(dbgs() << "\t " << UseIdx << '\t' << *MI); 233 234 VNInfo *DefVNI = NewLI.getNextValue(DefIdx, 0, lis_.getVNInfoAllocator()); 235 NewLI.addRange(LiveRange(DefIdx, UseIdx.getDefIndex(), DefVNI)); 236 DEBUG(dbgs() << "\tinterval: " << NewLI << '\n'); 237 return true; 238} 239 240/// reMaterializeAll - Try to rematerialize as many uses of li_ as possible, 241/// and trim the live ranges after. 242void InlineSpiller::reMaterializeAll() { 243 // Do a quick scan of the interval values to find if any are remattable. 244 reMattable_.clear(); 245 usedValues_.clear(); 246 for (LiveInterval::const_vni_iterator I = li_->vni_begin(), 247 E = li_->vni_end(); I != E; ++I) { 248 VNInfo *VNI = *I; 249 if (VNI->isUnused()) 250 continue; 251 MachineInstr *DefMI = lis_.getInstructionFromIndex(VNI->def); 252 if (!DefMI || !tii_.isTriviallyReMaterializable(DefMI)) 253 continue; 254 reMattable_.insert(VNI); 255 } 256 257 // Often, no defs are remattable. 258 if (reMattable_.empty()) 259 return; 260 261 // Try to remat before all uses of li_->reg. 262 bool anyRemat = false; 263 for (MachineRegisterInfo::use_nodbg_iterator 264 RI = mri_.use_nodbg_begin(li_->reg); 265 MachineInstr *MI = RI.skipInstruction();) 266 anyRemat |= reMaterializeFor(MI); 267 268 if (!anyRemat) 269 return; 270 271 // Remove any values that were completely rematted. 272 bool anyRemoved = false; 273 for (SmallPtrSet<VNInfo*, 8>::iterator I = reMattable_.begin(), 274 E = reMattable_.end(); I != E; ++I) { 275 VNInfo *VNI = *I; 276 if (VNI->hasPHIKill() || usedValues_.count(VNI)) 277 continue; 278 MachineInstr *DefMI = lis_.getInstructionFromIndex(VNI->def); 279 DEBUG(dbgs() << "\tremoving dead def: " << VNI->def << '\t' << *DefMI); 280 lis_.RemoveMachineInstrFromMaps(DefMI); 281 vrm_.RemoveMachineInstrFromMaps(DefMI); 282 DefMI->eraseFromParent(); 283 VNI->def = SlotIndex(); 284 anyRemoved = true; 285 } 286 287 if (!anyRemoved) 288 return; 289 290 // Removing values may cause debug uses where li_ is not live. 291 for (MachineRegisterInfo::use_iterator RI = mri_.use_begin(li_->reg); 292 MachineInstr *MI = RI.skipInstruction();) { 293 if (!MI->isDebugValue()) 294 continue; 295 // Try to preserve the debug value if li_ is live immediately after it. 296 MachineBasicBlock::iterator NextMI = MI; 297 ++NextMI; 298 if (NextMI != MI->getParent()->end() && !lis_.isNotInMIMap(NextMI)) { 299 VNInfo *VNI = li_->getVNInfoAt(lis_.getInstructionIndex(NextMI)); 300 if (VNI && (VNI->hasPHIKill() || usedValues_.count(VNI))) 301 continue; 302 } 303 DEBUG(dbgs() << "Removing debug info due to remat:" << "\t" << *MI); 304 MI->eraseFromParent(); 305 } 306} 307 308/// If MI is a load or store of stackSlot_, it can be removed. 309bool InlineSpiller::coalesceStackAccess(MachineInstr *MI) { 310 int FI = 0; 311 unsigned reg; 312 if (!(reg = tii_.isLoadFromStackSlot(MI, FI)) && 313 !(reg = tii_.isStoreToStackSlot(MI, FI))) 314 return false; 315 316 // We have a stack access. Is it the right register and slot? 317 if (reg != li_->reg || FI != stackSlot_) 318 return false; 319 320 DEBUG(dbgs() << "Coalescing stack access: " << *MI); 321 lis_.RemoveMachineInstrFromMaps(MI); 322 MI->eraseFromParent(); 323 return true; 324} 325 326/// foldMemoryOperand - Try folding stack slot references in Ops into MI. 327/// Return true on success, and MI will be erased. 328bool InlineSpiller::foldMemoryOperand(MachineBasicBlock::iterator MI, 329 const SmallVectorImpl<unsigned> &Ops) { 330 // TargetInstrInfo::foldMemoryOperand only expects explicit, non-tied 331 // operands. 332 SmallVector<unsigned, 8> FoldOps; 333 for (unsigned i = 0, e = Ops.size(); i != e; ++i) { 334 unsigned Idx = Ops[i]; 335 MachineOperand &MO = MI->getOperand(Idx); 336 if (MO.isImplicit()) 337 continue; 338 // FIXME: Teach targets to deal with subregs. 339 if (MO.getSubReg()) 340 return false; 341 // Tied use operands should not be passed to foldMemoryOperand. 342 if (!MI->isRegTiedToDefOperand(Idx)) 343 FoldOps.push_back(Idx); 344 } 345 346 MachineInstr *FoldMI = tii_.foldMemoryOperand(MI, FoldOps, stackSlot_); 347 if (!FoldMI) 348 return false; 349 lis_.ReplaceMachineInstrInMaps(MI, FoldMI); 350 vrm_.addSpillSlotUse(stackSlot_, FoldMI); 351 MI->eraseFromParent(); 352 DEBUG(dbgs() << "\tfolded: " << *FoldMI); 353 return true; 354} 355 356/// insertReload - Insert a reload of NewLI.reg before MI. 357void InlineSpiller::insertReload(LiveInterval &NewLI, 358 MachineBasicBlock::iterator MI) { 359 MachineBasicBlock &MBB = *MI->getParent(); 360 SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex(); 361 tii_.loadRegFromStackSlot(MBB, MI, NewLI.reg, stackSlot_, rc_, &tri_); 362 --MI; // Point to load instruction. 363 SlotIndex LoadIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex(); 364 vrm_.addSpillSlotUse(stackSlot_, MI); 365 DEBUG(dbgs() << "\treload: " << LoadIdx << '\t' << *MI); 366 VNInfo *LoadVNI = NewLI.getNextValue(LoadIdx, 0, 367 lis_.getVNInfoAllocator()); 368 NewLI.addRange(LiveRange(LoadIdx, Idx, LoadVNI)); 369} 370 371/// insertSpill - Insert a spill of NewLI.reg after MI. 372void InlineSpiller::insertSpill(LiveInterval &NewLI, 373 MachineBasicBlock::iterator MI) { 374 MachineBasicBlock &MBB = *MI->getParent(); 375 SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex(); 376 tii_.storeRegToStackSlot(MBB, ++MI, NewLI.reg, true, stackSlot_, rc_, &tri_); 377 --MI; // Point to store instruction. 378 SlotIndex StoreIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex(); 379 vrm_.addSpillSlotUse(stackSlot_, MI); 380 DEBUG(dbgs() << "\tspilled: " << StoreIdx << '\t' << *MI); 381 VNInfo *StoreVNI = NewLI.getNextValue(Idx, 0, lis_.getVNInfoAllocator()); 382 NewLI.addRange(LiveRange(Idx, StoreIdx, StoreVNI)); 383} 384 385void InlineSpiller::spill(LiveInterval *li, 386 SmallVectorImpl<LiveInterval*> &newIntervals, 387 SmallVectorImpl<LiveInterval*> &spillIs) { 388 DEBUG(dbgs() << "Inline spilling " << *li << "\n"); 389 assert(li->isSpillable() && "Attempting to spill already spilled value."); 390 assert(!li->isStackSlot() && "Trying to spill a stack slot."); 391 392 li_ = li; 393 newIntervals_ = &newIntervals; 394 rc_ = mri_.getRegClass(li->reg); 395 spillIs_ = &spillIs; 396 397 if (split()) 398 return; 399 400 reMaterializeAll(); 401 402 // Remat may handle everything. 403 if (li_->empty()) 404 return; 405 406 stackSlot_ = vrm_.getStackSlot(li->reg); 407 if (stackSlot_ == VirtRegMap::NO_STACK_SLOT) 408 stackSlot_ = vrm_.assignVirt2StackSlot(li->reg); 409 410 // Iterate over instructions using register. 411 for (MachineRegisterInfo::reg_iterator RI = mri_.reg_begin(li->reg); 412 MachineInstr *MI = RI.skipInstruction();) { 413 414 // Debug values are not allowed to affect codegen. 415 if (MI->isDebugValue()) { 416 // Modify DBG_VALUE now that the value is in a spill slot. 417 uint64_t Offset = MI->getOperand(1).getImm(); 418 const MDNode *MDPtr = MI->getOperand(2).getMetadata(); 419 DebugLoc DL = MI->getDebugLoc(); 420 if (MachineInstr *NewDV = tii_.emitFrameIndexDebugValue(mf_, stackSlot_, 421 Offset, MDPtr, DL)) { 422 DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI); 423 MachineBasicBlock *MBB = MI->getParent(); 424 MBB->insert(MBB->erase(MI), NewDV); 425 } else { 426 DEBUG(dbgs() << "Removing debug info due to spill:" << "\t" << *MI); 427 MI->eraseFromParent(); 428 } 429 continue; 430 } 431 432 // Stack slot accesses may coalesce away. 433 if (coalesceStackAccess(MI)) 434 continue; 435 436 // Analyze instruction. 437 bool Reads, Writes; 438 SmallVector<unsigned, 8> Ops; 439 tie(Reads, Writes) = MI->readsWritesVirtualRegister(li->reg, &Ops); 440 441 // Attempt to fold memory ops. 442 if (foldMemoryOperand(MI, Ops)) 443 continue; 444 445 // Allocate interval around instruction. 446 // FIXME: Infer regclass from instruction alone. 447 unsigned NewVReg = mri_.createVirtualRegister(rc_); 448 vrm_.grow(); 449 LiveInterval &NewLI = lis_.getOrCreateInterval(NewVReg); 450 NewLI.markNotSpillable(); 451 452 if (Reads) 453 insertReload(NewLI, MI); 454 455 // Rewrite instruction operands. 456 bool hasLiveDef = false; 457 for (unsigned i = 0, e = Ops.size(); i != e; ++i) { 458 MachineOperand &MO = MI->getOperand(Ops[i]); 459 MO.setReg(NewVReg); 460 if (MO.isUse()) { 461 if (!MI->isRegTiedToDefOperand(Ops[i])) 462 MO.setIsKill(); 463 } else { 464 if (!MO.isDead()) 465 hasLiveDef = true; 466 } 467 } 468 469 // FIXME: Use a second vreg if instruction has no tied ops. 470 if (Writes && hasLiveDef) 471 insertSpill(NewLI, MI); 472 473 DEBUG(dbgs() << "\tinterval: " << NewLI << '\n'); 474 newIntervals.push_back(&NewLI); 475 } 476} 477