1 //===-- RegisterScavenging.cpp - Machine register scavenging --------------===//
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 /// \file
11 /// This file implements the machine register scavenger. It can provide
12 /// information, such as unused registers, at any point in a machine basic
13 /// block. It also provides a mechanism to make registers available by evicting
14 /// them to spill slots.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #include "llvm/CodeGen/RegisterScavenging.h"
19 #include "llvm/CodeGen/MachineBasicBlock.h"
20 #include "llvm/CodeGen/MachineFrameInfo.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineInstr.h"
23 #include "llvm/CodeGen/MachineRegisterInfo.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/ErrorHandling.h"
26 #include "llvm/Support/raw_ostream.h"
27 #include "llvm/Target/TargetInstrInfo.h"
28 #include "llvm/Target/TargetRegisterInfo.h"
29 #include "llvm/Target/TargetSubtargetInfo.h"
30 using namespace llvm;
31
32 #define DEBUG_TYPE "reg-scavenging"
33
setRegUsed(unsigned Reg,LaneBitmask LaneMask)34 void RegScavenger::setRegUsed(unsigned Reg, LaneBitmask LaneMask) {
35 for (MCRegUnitMaskIterator RUI(Reg, TRI); RUI.isValid(); ++RUI) {
36 LaneBitmask UnitMask = (*RUI).second;
37 if (UnitMask == 0 || (LaneMask & UnitMask) != 0)
38 RegUnitsAvailable.reset((*RUI).first);
39 }
40 }
41
initRegState()42 void RegScavenger::initRegState() {
43 for (SmallVectorImpl<ScavengedInfo>::iterator I = Scavenged.begin(),
44 IE = Scavenged.end(); I != IE; ++I) {
45 I->Reg = 0;
46 I->Restore = nullptr;
47 }
48
49 // All register units start out unused.
50 RegUnitsAvailable.set();
51
52 // Live-in registers are in use.
53 for (const auto &LI : MBB->liveins())
54 setRegUsed(LI.PhysReg, LI.LaneMask);
55
56 // Pristine CSRs are also unavailable.
57 const MachineFunction &MF = *MBB->getParent();
58 BitVector PR = MF.getFrameInfo()->getPristineRegs(MF);
59 for (int I = PR.find_first(); I>0; I = PR.find_next(I))
60 setRegUsed(I);
61 }
62
enterBasicBlock(MachineBasicBlock & MBB)63 void RegScavenger::enterBasicBlock(MachineBasicBlock &MBB) {
64 MachineFunction &MF = *MBB.getParent();
65 TII = MF.getSubtarget().getInstrInfo();
66 TRI = MF.getSubtarget().getRegisterInfo();
67 MRI = &MF.getRegInfo();
68
69 assert((NumRegUnits == 0 || NumRegUnits == TRI->getNumRegUnits()) &&
70 "Target changed?");
71
72 // It is not possible to use the register scavenger after late optimization
73 // passes that don't preserve accurate liveness information.
74 assert(MRI->tracksLiveness() &&
75 "Cannot use register scavenger with inaccurate liveness");
76
77 // Self-initialize.
78 if (!this->MBB) {
79 NumRegUnits = TRI->getNumRegUnits();
80 RegUnitsAvailable.resize(NumRegUnits);
81 KillRegUnits.resize(NumRegUnits);
82 DefRegUnits.resize(NumRegUnits);
83 TmpRegUnits.resize(NumRegUnits);
84 }
85 this->MBB = &MBB;
86
87 initRegState();
88
89 Tracking = false;
90 }
91
addRegUnits(BitVector & BV,unsigned Reg)92 void RegScavenger::addRegUnits(BitVector &BV, unsigned Reg) {
93 for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
94 BV.set(*RUI);
95 }
96
determineKillsAndDefs()97 void RegScavenger::determineKillsAndDefs() {
98 assert(Tracking && "Must be tracking to determine kills and defs");
99
100 MachineInstr &MI = *MBBI;
101 assert(!MI.isDebugValue() && "Debug values have no kills or defs");
102
103 // Find out which registers are early clobbered, killed, defined, and marked
104 // def-dead in this instruction.
105 KillRegUnits.reset();
106 DefRegUnits.reset();
107 for (const MachineOperand &MO : MI.operands()) {
108 if (MO.isRegMask()) {
109 TmpRegUnits.clear();
110 for (unsigned RU = 0, RUEnd = TRI->getNumRegUnits(); RU != RUEnd; ++RU) {
111 for (MCRegUnitRootIterator RURI(RU, TRI); RURI.isValid(); ++RURI) {
112 if (MO.clobbersPhysReg(*RURI)) {
113 TmpRegUnits.set(RU);
114 break;
115 }
116 }
117 }
118
119 // Apply the mask.
120 KillRegUnits |= TmpRegUnits;
121 }
122 if (!MO.isReg())
123 continue;
124 unsigned Reg = MO.getReg();
125 if (!TargetRegisterInfo::isPhysicalRegister(Reg) || isReserved(Reg))
126 continue;
127
128 if (MO.isUse()) {
129 // Ignore undef uses.
130 if (MO.isUndef())
131 continue;
132 if (MO.isKill())
133 addRegUnits(KillRegUnits, Reg);
134 } else {
135 assert(MO.isDef());
136 if (MO.isDead())
137 addRegUnits(KillRegUnits, Reg);
138 else
139 addRegUnits(DefRegUnits, Reg);
140 }
141 }
142 }
143
unprocess()144 void RegScavenger::unprocess() {
145 assert(Tracking && "Cannot unprocess because we're not tracking");
146
147 MachineInstr &MI = *MBBI;
148 if (!MI.isDebugValue()) {
149 determineKillsAndDefs();
150
151 // Commit the changes.
152 setUsed(KillRegUnits);
153 setUnused(DefRegUnits);
154 }
155
156 if (MBBI == MBB->begin()) {
157 MBBI = MachineBasicBlock::iterator(nullptr);
158 Tracking = false;
159 } else
160 --MBBI;
161 }
162
forward()163 void RegScavenger::forward() {
164 // Move ptr forward.
165 if (!Tracking) {
166 MBBI = MBB->begin();
167 Tracking = true;
168 } else {
169 assert(MBBI != MBB->end() && "Already past the end of the basic block!");
170 MBBI = std::next(MBBI);
171 }
172 assert(MBBI != MBB->end() && "Already at the end of the basic block!");
173
174 MachineInstr &MI = *MBBI;
175
176 for (SmallVectorImpl<ScavengedInfo>::iterator I = Scavenged.begin(),
177 IE = Scavenged.end(); I != IE; ++I) {
178 if (I->Restore != &MI)
179 continue;
180
181 I->Reg = 0;
182 I->Restore = nullptr;
183 }
184
185 if (MI.isDebugValue())
186 return;
187
188 determineKillsAndDefs();
189
190 // Verify uses and defs.
191 #ifndef NDEBUG
192 for (const MachineOperand &MO : MI.operands()) {
193 if (!MO.isReg())
194 continue;
195 unsigned Reg = MO.getReg();
196 if (!TargetRegisterInfo::isPhysicalRegister(Reg) || isReserved(Reg))
197 continue;
198 if (MO.isUse()) {
199 if (MO.isUndef())
200 continue;
201 if (!isRegUsed(Reg)) {
202 // Check if it's partial live: e.g.
203 // D0 = insert_subreg D0<undef>, S0
204 // ... D0
205 // The problem is the insert_subreg could be eliminated. The use of
206 // D0 is using a partially undef value. This is not *incorrect* since
207 // S1 is can be freely clobbered.
208 // Ideally we would like a way to model this, but leaving the
209 // insert_subreg around causes both correctness and performance issues.
210 bool SubUsed = false;
211 for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
212 if (isRegUsed(*SubRegs)) {
213 SubUsed = true;
214 break;
215 }
216 bool SuperUsed = false;
217 for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR) {
218 if (isRegUsed(*SR)) {
219 SuperUsed = true;
220 break;
221 }
222 }
223 if (!SubUsed && !SuperUsed) {
224 MBB->getParent()->verify(nullptr, "In Register Scavenger");
225 llvm_unreachable("Using an undefined register!");
226 }
227 (void)SubUsed;
228 (void)SuperUsed;
229 }
230 } else {
231 assert(MO.isDef());
232 #if 0
233 // FIXME: Enable this once we've figured out how to correctly transfer
234 // implicit kills during codegen passes like the coalescer.
235 assert((KillRegs.test(Reg) || isUnused(Reg) ||
236 isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
237 "Re-defining a live register!");
238 #endif
239 }
240 }
241 #endif // NDEBUG
242
243 // Commit the changes.
244 setUnused(KillRegUnits);
245 setUsed(DefRegUnits);
246 }
247
isRegUsed(unsigned Reg,bool includeReserved) const248 bool RegScavenger::isRegUsed(unsigned Reg, bool includeReserved) const {
249 if (includeReserved && isReserved(Reg))
250 return true;
251 for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
252 if (!RegUnitsAvailable.test(*RUI))
253 return true;
254 return false;
255 }
256
FindUnusedReg(const TargetRegisterClass * RC) const257 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {
258 for (unsigned Reg : *RC) {
259 if (!isRegUsed(Reg)) {
260 DEBUG(dbgs() << "Scavenger found unused reg: " << TRI->getName(Reg) <<
261 "\n");
262 return Reg;
263 }
264 }
265 return 0;
266 }
267
getRegsAvailable(const TargetRegisterClass * RC)268 BitVector RegScavenger::getRegsAvailable(const TargetRegisterClass *RC) {
269 BitVector Mask(TRI->getNumRegs());
270 for (unsigned Reg : *RC)
271 if (!isRegUsed(Reg))
272 Mask.set(Reg);
273 return Mask;
274 }
275
findSurvivorReg(MachineBasicBlock::iterator StartMI,BitVector & Candidates,unsigned InstrLimit,MachineBasicBlock::iterator & UseMI)276 unsigned RegScavenger::findSurvivorReg(MachineBasicBlock::iterator StartMI,
277 BitVector &Candidates,
278 unsigned InstrLimit,
279 MachineBasicBlock::iterator &UseMI) {
280 int Survivor = Candidates.find_first();
281 assert(Survivor > 0 && "No candidates for scavenging");
282
283 MachineBasicBlock::iterator ME = MBB->getFirstTerminator();
284 assert(StartMI != ME && "MI already at terminator");
285 MachineBasicBlock::iterator RestorePointMI = StartMI;
286 MachineBasicBlock::iterator MI = StartMI;
287
288 bool inVirtLiveRange = false;
289 for (++MI; InstrLimit > 0 && MI != ME; ++MI, --InstrLimit) {
290 if (MI->isDebugValue()) {
291 ++InstrLimit; // Don't count debug instructions
292 continue;
293 }
294 bool isVirtKillInsn = false;
295 bool isVirtDefInsn = false;
296 // Remove any candidates touched by instruction.
297 for (const MachineOperand &MO : MI->operands()) {
298 if (MO.isRegMask())
299 Candidates.clearBitsNotInMask(MO.getRegMask());
300 if (!MO.isReg() || MO.isUndef() || !MO.getReg())
301 continue;
302 if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
303 if (MO.isDef())
304 isVirtDefInsn = true;
305 else if (MO.isKill())
306 isVirtKillInsn = true;
307 continue;
308 }
309 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI)
310 Candidates.reset(*AI);
311 }
312 // If we're not in a virtual reg's live range, this is a valid
313 // restore point.
314 if (!inVirtLiveRange) RestorePointMI = MI;
315
316 // Update whether we're in the live range of a virtual register
317 if (isVirtKillInsn) inVirtLiveRange = false;
318 if (isVirtDefInsn) inVirtLiveRange = true;
319
320 // Was our survivor untouched by this instruction?
321 if (Candidates.test(Survivor))
322 continue;
323
324 // All candidates gone?
325 if (Candidates.none())
326 break;
327
328 Survivor = Candidates.find_first();
329 }
330 // If we ran off the end, that's where we want to restore.
331 if (MI == ME) RestorePointMI = ME;
332 assert(RestorePointMI != StartMI &&
333 "No available scavenger restore location!");
334
335 // We ran out of candidates, so stop the search.
336 UseMI = RestorePointMI;
337 return Survivor;
338 }
339
getFrameIndexOperandNum(MachineInstr & MI)340 static unsigned getFrameIndexOperandNum(MachineInstr &MI) {
341 unsigned i = 0;
342 while (!MI.getOperand(i).isFI()) {
343 ++i;
344 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
345 }
346 return i;
347 }
348
scavengeRegister(const TargetRegisterClass * RC,MachineBasicBlock::iterator I,int SPAdj)349 unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
350 MachineBasicBlock::iterator I,
351 int SPAdj) {
352 MachineInstr &MI = *I;
353 const MachineFunction &MF = *MI.getParent()->getParent();
354 // Consider all allocatable registers in the register class initially
355 BitVector Candidates = TRI->getAllocatableSet(MF, RC);
356
357 // Exclude all the registers being used by the instruction.
358 for (const MachineOperand &MO : MI.operands()) {
359 if (MO.isReg() && MO.getReg() != 0 && !(MO.isUse() && MO.isUndef()) &&
360 !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
361 Candidates.reset(MO.getReg());
362 }
363
364 // Try to find a register that's unused if there is one, as then we won't
365 // have to spill.
366 BitVector Available = getRegsAvailable(RC);
367 Available &= Candidates;
368 if (Available.any())
369 Candidates = Available;
370
371 // Find the register whose use is furthest away.
372 MachineBasicBlock::iterator UseMI;
373 unsigned SReg = findSurvivorReg(I, Candidates, 25, UseMI);
374
375 // If we found an unused register there is no reason to spill it.
376 if (!isRegUsed(SReg)) {
377 DEBUG(dbgs() << "Scavenged register: " << TRI->getName(SReg) << "\n");
378 return SReg;
379 }
380
381 // Find an available scavenging slot with size and alignment matching
382 // the requirements of the class RC.
383 const MachineFrameInfo &MFI = *MF.getFrameInfo();
384 unsigned NeedSize = RC->getSize();
385 unsigned NeedAlign = RC->getAlignment();
386
387 unsigned SI = Scavenged.size(), Diff = UINT_MAX;
388 int FIB = MFI.getObjectIndexBegin(), FIE = MFI.getObjectIndexEnd();
389 for (unsigned I = 0; I < Scavenged.size(); ++I) {
390 if (Scavenged[I].Reg != 0)
391 continue;
392 // Verify that this slot is valid for this register.
393 int FI = Scavenged[I].FrameIndex;
394 if (FI < FIB || FI >= FIE)
395 continue;
396 unsigned S = MFI.getObjectSize(FI);
397 unsigned A = MFI.getObjectAlignment(FI);
398 if (NeedSize > S || NeedAlign > A)
399 continue;
400 // Avoid wasting slots with large size and/or large alignment. Pick one
401 // that is the best fit for this register class (in street metric).
402 // Picking a larger slot than necessary could happen if a slot for a
403 // larger register is reserved before a slot for a smaller one. When
404 // trying to spill a smaller register, the large slot would be found
405 // first, thus making it impossible to spill the larger register later.
406 unsigned D = (S-NeedSize) + (A-NeedAlign);
407 if (D < Diff) {
408 SI = I;
409 Diff = D;
410 }
411 }
412
413 if (SI == Scavenged.size()) {
414 // We need to scavenge a register but have no spill slot, the target
415 // must know how to do it (if not, we'll assert below).
416 Scavenged.push_back(ScavengedInfo(FIE));
417 }
418
419 // Avoid infinite regress
420 Scavenged[SI].Reg = SReg;
421
422 // If the target knows how to save/restore the register, let it do so;
423 // otherwise, use the emergency stack spill slot.
424 if (!TRI->saveScavengerRegister(*MBB, I, UseMI, RC, SReg)) {
425 // Spill the scavenged register before I.
426 int FI = Scavenged[SI].FrameIndex;
427 if (FI < FIB || FI >= FIE) {
428 std::string Msg = std::string("Error while trying to spill ") +
429 TRI->getName(SReg) + " from class " + TRI->getRegClassName(RC) +
430 ": Cannot scavenge register without an emergency spill slot!";
431 report_fatal_error(Msg.c_str());
432 }
433 TII->storeRegToStackSlot(*MBB, I, SReg, true, Scavenged[SI].FrameIndex,
434 RC, TRI);
435 MachineBasicBlock::iterator II = std::prev(I);
436
437 unsigned FIOperandNum = getFrameIndexOperandNum(*II);
438 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
439
440 // Restore the scavenged register before its use (or first terminator).
441 TII->loadRegFromStackSlot(*MBB, UseMI, SReg, Scavenged[SI].FrameIndex,
442 RC, TRI);
443 II = std::prev(UseMI);
444
445 FIOperandNum = getFrameIndexOperandNum(*II);
446 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
447 }
448
449 Scavenged[SI].Restore = &*std::prev(UseMI);
450
451 // Doing this here leads to infinite regress.
452 // Scavenged[SI].Reg = SReg;
453
454 DEBUG(dbgs() << "Scavenged register (with spill): " << TRI->getName(SReg) <<
455 "\n");
456
457 return SReg;
458 }
459