LLVM 17.0.0git
RegisterScavenging.cpp
Go to the documentation of this file.
1//===- RegisterScavenging.cpp - Machine register scavenging ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// This file implements the machine register scavenger. It can provide
11/// information, such as unused registers, at any point in a machine basic
12/// block. It also provides a mechanism to make registers available by evicting
13/// them to spill slots.
14//
15//===----------------------------------------------------------------------===//
16
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
21#include "llvm/ADT/Statistic.h"
36#include "llvm/Pass.h"
37#include "llvm/Support/Debug.h"
40#include <cassert>
41#include <iterator>
42#include <limits>
43#include <utility>
44
45using namespace llvm;
46
47#define DEBUG_TYPE "reg-scavenging"
48
49STATISTIC(NumScavengedRegs, "Number of frame index regs scavenged");
50
52 LiveUnits.addRegMasked(Reg, LaneMask);
53}
54
55void RegScavenger::init(MachineBasicBlock &MBB) {
57 TII = MF.getSubtarget().getInstrInfo();
58 TRI = MF.getSubtarget().getRegisterInfo();
59 MRI = &MF.getRegInfo();
60 LiveUnits.init(*TRI);
61
62 assert((NumRegUnits == 0 || NumRegUnits == TRI->getNumRegUnits()) &&
63 "Target changed?");
64
65 // Self-initialize.
66 if (!this->MBB) {
67 NumRegUnits = TRI->getNumRegUnits();
68 KillRegUnits.resize(NumRegUnits);
69 DefRegUnits.resize(NumRegUnits);
70 TmpRegUnits.resize(NumRegUnits);
71 }
72 this->MBB = &MBB;
73
74 for (ScavengedInfo &SI : Scavenged) {
75 SI.Reg = 0;
76 SI.Restore = nullptr;
77 }
78
79 Tracking = false;
80}
81
83 init(MBB);
84 LiveUnits.addLiveIns(MBB);
85}
86
88 init(MBB);
89 LiveUnits.addLiveOuts(MBB);
90
91 // Move internal iterator at the last instruction of the block.
92 if (!MBB.empty()) {
93 MBBI = std::prev(MBB.end());
94 Tracking = true;
95 }
96}
97
98void RegScavenger::addRegUnits(BitVector &BV, MCRegister Reg) {
99 for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
100 BV.set(*RUI);
101}
102
103void RegScavenger::removeRegUnits(BitVector &BV, MCRegister Reg) {
104 for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
105 BV.reset(*RUI);
106}
107
108void RegScavenger::determineKillsAndDefs() {
109 assert(Tracking && "Must be tracking to determine kills and defs");
110
111 MachineInstr &MI = *MBBI;
112 assert(!MI.isDebugInstr() && "Debug values have no kills or defs");
113
114 // Find out which registers are early clobbered, killed, defined, and marked
115 // def-dead in this instruction.
116 KillRegUnits.reset();
117 DefRegUnits.reset();
118 for (const MachineOperand &MO : MI.operands()) {
119 if (MO.isRegMask()) {
120 TmpRegUnits.reset();
121 for (unsigned RU = 0, RUEnd = TRI->getNumRegUnits(); RU != RUEnd; ++RU) {
122 for (MCRegUnitRootIterator RURI(RU, TRI); RURI.isValid(); ++RURI) {
123 if (MO.clobbersPhysReg(*RURI)) {
124 TmpRegUnits.set(RU);
125 break;
126 }
127 }
128 }
129
130 // Apply the mask.
131 KillRegUnits |= TmpRegUnits;
132 }
133 if (!MO.isReg())
134 continue;
135 if (!MO.getReg().isPhysical() || isReserved(MO.getReg()))
136 continue;
137 MCRegister Reg = MO.getReg().asMCReg();
138
139 if (MO.isUse()) {
140 // Ignore undef uses.
141 if (MO.isUndef())
142 continue;
143 if (MO.isKill())
144 addRegUnits(KillRegUnits, Reg);
145 } else {
146 assert(MO.isDef());
147 if (MO.isDead())
148 addRegUnits(KillRegUnits, Reg);
149 else
150 addRegUnits(DefRegUnits, Reg);
151 }
152 }
153}
154
156 // Move ptr forward.
157 if (!Tracking) {
158 MBBI = MBB->begin();
159 Tracking = true;
160 } else {
161 assert(MBBI != MBB->end() && "Already past the end of the basic block!");
162 MBBI = std::next(MBBI);
163 }
164 assert(MBBI != MBB->end() && "Already at the end of the basic block!");
165
166 MachineInstr &MI = *MBBI;
167
168 for (ScavengedInfo &I : Scavenged) {
169 if (I.Restore != &MI)
170 continue;
171
172 I.Reg = 0;
173 I.Restore = nullptr;
174 }
175
176 if (MI.isDebugOrPseudoInstr())
177 return;
178
179 determineKillsAndDefs();
180
181 // Verify uses and defs.
182#ifndef NDEBUG
183 for (const MachineOperand &MO : MI.operands()) {
184 if (!MO.isReg())
185 continue;
186 Register Reg = MO.getReg();
187 if (!Reg.isPhysical() || isReserved(Reg))
188 continue;
189 if (MO.isUse()) {
190 if (MO.isUndef())
191 continue;
192 if (!isRegUsed(Reg)) {
193 // Check if it's partial live: e.g.
194 // D0 = insert_subreg undef D0, S0
195 // ... D0
196 // The problem is the insert_subreg could be eliminated. The use of
197 // D0 is using a partially undef value. This is not *incorrect* since
198 // S1 is can be freely clobbered.
199 // Ideally we would like a way to model this, but leaving the
200 // insert_subreg around causes both correctness and performance issues.
201 if (none_of(TRI->subregs(Reg),
202 [&](MCPhysReg SR) { return isRegUsed(SR); }) &&
203 none_of(TRI->superregs(Reg),
204 [&](MCPhysReg SR) { return isRegUsed(SR); })) {
205 MBB->getParent()->verify(nullptr, "In Register Scavenger");
206 llvm_unreachable("Using an undefined register!");
207 }
208 }
209 } else {
210 assert(MO.isDef());
211#if 0
212 // FIXME: Enable this once we've figured out how to correctly transfer
213 // implicit kills during codegen passes like the coalescer.
214 assert((KillRegs.test(Reg) || isUnused(Reg) ||
215 isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
216 "Re-defining a live register!");
217#endif
218 }
219 }
220#endif // NDEBUG
221
222 // Commit the changes.
223 setUnused(KillRegUnits);
224 setUsed(DefRegUnits);
225}
226
228 assert(Tracking && "Must be tracking to determine kills and defs");
229
230 const MachineInstr &MI = *MBBI;
231 LiveUnits.stepBackward(MI);
232
233 // Expire scavenge spill frameindex uses.
234 for (ScavengedInfo &I : Scavenged) {
235 if (I.Restore == &MI) {
236 I.Reg = 0;
237 I.Restore = nullptr;
238 }
239 }
240
241 if (MBBI == MBB->begin()) {
242 MBBI = MachineBasicBlock::iterator(nullptr);
243 Tracking = false;
244 } else
245 --MBBI;
246}
247
248bool RegScavenger::isRegUsed(Register Reg, bool includeReserved) const {
249 if (isReserved(Reg))
250 return includeReserved;
251 return !LiveUnits.available(Reg);
252}
253
255 for (Register Reg : *RC) {
256 if (!isRegUsed(Reg)) {
257 LLVM_DEBUG(dbgs() << "Scavenger found unused reg: " << printReg(Reg, TRI)
258 << "\n");
259 return Reg;
260 }
261 }
262 return 0;
263}
264
266 BitVector Mask(TRI->getNumRegs());
267 for (Register Reg : *RC)
268 if (!isRegUsed(Reg))
269 Mask.set(Reg);
270 return Mask;
271}
272
273/// Given the bitvector \p Available of free register units at position
274/// \p From. Search backwards to find a register that is part of \p
275/// Candidates and not used/clobbered until the point \p To. If there is
276/// multiple candidates continue searching and pick the one that is not used/
277/// clobbered for the longest time.
278/// Returns the register and the earliest position we know it to be free or
279/// the position MBB.end() if no register is available.
280static std::pair<MCPhysReg, MachineBasicBlock::iterator>
284 bool RestoreAfter) {
285 bool FoundTo = false;
286 MCPhysReg Survivor = 0;
288 MachineBasicBlock &MBB = *From->getParent();
289 unsigned InstrLimit = 25;
290 unsigned InstrCountDown = InstrLimit;
291 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
292 LiveRegUnits Used(TRI);
293
294 assert(From->getParent() == To->getParent() &&
295 "Target instruction is in other than current basic block, use "
296 "enterBasicBlockEnd first");
297
298 for (MachineBasicBlock::iterator I = From;; --I) {
299 const MachineInstr &MI = *I;
300
301 Used.accumulate(MI);
302
303 if (I == To) {
304 // See if one of the registers in RC wasn't used so far.
305 for (MCPhysReg Reg : AllocationOrder) {
306 if (!MRI.isReserved(Reg) && Used.available(Reg) &&
307 LiveOut.available(Reg))
308 return std::make_pair(Reg, MBB.end());
309 }
310 // Otherwise we will continue up to InstrLimit instructions to find
311 // the register which is not defined/used for the longest time.
312 FoundTo = true;
313 Pos = To;
314 // Note: It was fine so far to start our search at From, however now that
315 // we have to spill, and can only place the restore after From then
316 // add the regs used/defed by std::next(From) to the set.
317 if (RestoreAfter)
318 Used.accumulate(*std::next(From));
319 }
320 if (FoundTo) {
321 // Don't search to FrameSetup instructions if we were searching from
322 // Non-FrameSetup instructions. Otherwise, the spill position may point
323 // before FrameSetup instructions.
324 if (!From->getFlag(MachineInstr::FrameSetup) &&
326 break;
327
328 if (Survivor == 0 || !Used.available(Survivor)) {
329 MCPhysReg AvilableReg = 0;
330 for (MCPhysReg Reg : AllocationOrder) {
331 if (!MRI.isReserved(Reg) && Used.available(Reg)) {
332 AvilableReg = Reg;
333 break;
334 }
335 }
336 if (AvilableReg == 0)
337 break;
338 Survivor = AvilableReg;
339 }
340 if (--InstrCountDown == 0)
341 break;
342
343 // Keep searching when we find a vreg since the spilled register will
344 // be usefull for this other vreg as well later.
345 bool FoundVReg = false;
346 for (const MachineOperand &MO : MI.operands()) {
347 if (MO.isReg() && MO.getReg().isVirtual()) {
348 FoundVReg = true;
349 break;
350 }
351 }
352 if (FoundVReg) {
353 InstrCountDown = InstrLimit;
354 Pos = I;
355 }
356 if (I == MBB.begin())
357 break;
358 }
359 assert(I != MBB.begin() && "Did not find target instruction while "
360 "iterating backwards");
361 }
362
363 return std::make_pair(Survivor, Pos);
364}
365
367 unsigned i = 0;
368 while (!MI.getOperand(i).isFI()) {
369 ++i;
370 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
371 }
372 return i;
373}
374
375RegScavenger::ScavengedInfo &
376RegScavenger::spill(Register Reg, const TargetRegisterClass &RC, int SPAdj,
379 // Find an available scavenging slot with size and alignment matching
380 // the requirements of the class RC.
381 const MachineFunction &MF = *Before->getMF();
382 const MachineFrameInfo &MFI = MF.getFrameInfo();
383 unsigned NeedSize = TRI->getSpillSize(RC);
384 Align NeedAlign = TRI->getSpillAlign(RC);
385
386 unsigned SI = Scavenged.size(), Diff = std::numeric_limits<unsigned>::max();
387 int FIB = MFI.getObjectIndexBegin(), FIE = MFI.getObjectIndexEnd();
388 for (unsigned I = 0; I < Scavenged.size(); ++I) {
389 if (Scavenged[I].Reg != 0)
390 continue;
391 // Verify that this slot is valid for this register.
392 int FI = Scavenged[I].FrameIndex;
393 if (FI < FIB || FI >= FIE)
394 continue;
395 unsigned S = MFI.getObjectSize(FI);
396 Align A = MFI.getObjectAlign(FI);
397 if (NeedSize > S || NeedAlign > A)
398 continue;
399 // Avoid wasting slots with large size and/or large alignment. Pick one
400 // that is the best fit for this register class (in street metric).
401 // Picking a larger slot than necessary could happen if a slot for a
402 // larger register is reserved before a slot for a smaller one. When
403 // trying to spill a smaller register, the large slot would be found
404 // first, thus making it impossible to spill the larger register later.
405 unsigned D = (S - NeedSize) + (A.value() - NeedAlign.value());
406 if (D < Diff) {
407 SI = I;
408 Diff = D;
409 }
410 }
411
412 if (SI == Scavenged.size()) {
413 // We need to scavenge a register but have no spill slot, the target
414 // must know how to do it (if not, we'll assert below).
415 Scavenged.push_back(ScavengedInfo(FIE));
416 }
417
418 // Avoid infinite regress
419 Scavenged[SI].Reg = Reg;
420
421 // If the target knows how to save/restore the register, let it do so;
422 // otherwise, use the emergency stack spill slot.
423 if (!TRI->saveScavengerRegister(*MBB, Before, UseMI, &RC, Reg)) {
424 // Spill the scavenged register before \p Before.
425 int FI = Scavenged[SI].FrameIndex;
426 if (FI < FIB || FI >= FIE) {
427 report_fatal_error(Twine("Error while trying to spill ") +
428 TRI->getName(Reg) + " from class " +
429 TRI->getRegClassName(&RC) +
430 ": Cannot scavenge register without an emergency "
431 "spill slot!");
432 }
433 TII->storeRegToStackSlot(*MBB, Before, Reg, true, FI, &RC, TRI, Register());
434 MachineBasicBlock::iterator II = std::prev(Before);
435
436 unsigned FIOperandNum = getFrameIndexOperandNum(*II);
437 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
438
439 // Restore the scavenged register before its use (or first terminator).
440 TII->loadRegFromStackSlot(*MBB, UseMI, Reg, FI, &RC, TRI, Register());
441 II = std::prev(UseMI);
442
443 FIOperandNum = getFrameIndexOperandNum(*II);
444 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
445 }
446 return Scavenged[SI];
447}
448
451 bool RestoreAfter, int SPAdj,
452 bool AllowSpill) {
453 const MachineBasicBlock &MBB = *To->getParent();
454 const MachineFunction &MF = *MBB.getParent();
455
456 // Find the register whose use is furthest away.
459 std::pair<MCPhysReg, MachineBasicBlock::iterator> P =
460 findSurvivorBackwards(*MRI, MBBI, To, LiveUnits, AllocationOrder,
461 RestoreAfter);
462 MCPhysReg Reg = P.first;
463 MachineBasicBlock::iterator SpillBefore = P.second;
464 // Found an available register?
465 if (Reg != 0 && SpillBefore == MBB.end()) {
466 LLVM_DEBUG(dbgs() << "Scavenged free register: " << printReg(Reg, TRI)
467 << '\n');
468 return Reg;
469 }
470
471 if (!AllowSpill)
472 return 0;
473
474 assert(Reg != 0 && "No register left to scavenge!");
475
476 MachineBasicBlock::iterator ReloadAfter =
477 RestoreAfter ? std::next(MBBI) : MBBI;
478 MachineBasicBlock::iterator ReloadBefore = std::next(ReloadAfter);
479 if (ReloadBefore != MBB.end())
480 LLVM_DEBUG(dbgs() << "Reload before: " << *ReloadBefore << '\n');
481 ScavengedInfo &Scavenged = spill(Reg, RC, SPAdj, SpillBefore, ReloadBefore);
482 Scavenged.Restore = &*std::prev(SpillBefore);
483 LiveUnits.removeReg(Reg);
484 LLVM_DEBUG(dbgs() << "Scavenged register with spill: " << printReg(Reg, TRI)
485 << " until " << *SpillBefore);
486 return Reg;
487}
488
489/// Allocate a register for the virtual register \p VReg. The last use of
490/// \p VReg is around the current position of the register scavenger \p RS.
491/// \p ReserveAfter controls whether the scavenged register needs to be reserved
492/// after the current instruction, otherwise it will only be reserved before the
493/// current instruction.
495 Register VReg, bool ReserveAfter) {
496 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
497#ifndef NDEBUG
498 // Verify that all definitions and uses are in the same basic block.
499 const MachineBasicBlock *CommonMBB = nullptr;
500 // Real definition for the reg, re-definitions are not considered.
501 const MachineInstr *RealDef = nullptr;
502 for (MachineOperand &MO : MRI.reg_nodbg_operands(VReg)) {
503 MachineBasicBlock *MBB = MO.getParent()->getParent();
504 if (CommonMBB == nullptr)
505 CommonMBB = MBB;
506 assert(MBB == CommonMBB && "All defs+uses must be in the same basic block");
507 if (MO.isDef()) {
508 const MachineInstr &MI = *MO.getParent();
509 if (!MI.readsRegister(VReg, &TRI)) {
510 assert((!RealDef || RealDef == &MI) &&
511 "Can have at most one definition which is not a redefinition");
512 RealDef = &MI;
513 }
514 }
515 }
516 assert(RealDef != nullptr && "Must have at least 1 Def");
517#endif
518
519 // We should only have one definition of the register. However to accommodate
520 // the requirements of two address code we also allow definitions in
521 // subsequent instructions provided they also read the register. That way
522 // we get a single contiguous lifetime.
523 //
524 // Definitions in MRI.def_begin() are unordered, search for the first.
526 MRI.def_operands(VReg), [VReg, &TRI](const MachineOperand &MO) {
527 return !MO.getParent()->readsRegister(VReg, &TRI);
528 });
529 assert(FirstDef != MRI.def_end() &&
530 "Must have one definition that does not redefine vreg");
531 MachineInstr &DefMI = *FirstDef->getParent();
532
533 // The register scavenger will report a free register inserting an emergency
534 // spill/reload if necessary.
535 int SPAdj = 0;
536 const TargetRegisterClass &RC = *MRI.getRegClass(VReg);
537 Register SReg = RS.scavengeRegisterBackwards(RC, DefMI.getIterator(),
538 ReserveAfter, SPAdj);
539 MRI.replaceRegWith(VReg, SReg);
540 ++NumScavengedRegs;
541 return SReg;
542}
543
544/// Allocate (scavenge) vregs inside a single basic block.
545/// Returns true if the target spill callback created new vregs and a 2nd pass
546/// is necessary.
548 RegScavenger &RS,
550 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
552
553 unsigned InitialNumVirtRegs = MRI.getNumVirtRegs();
554 bool NextInstructionReadsVReg = false;
555 for (MachineBasicBlock::iterator I = MBB.end(); I != MBB.begin(); ) {
556 --I;
557 // Move RegScavenger to the position between *I and *std::next(I).
558 RS.backward(I);
559
560 // Look for unassigned vregs in the uses of *std::next(I).
561 if (NextInstructionReadsVReg) {
562 MachineBasicBlock::iterator N = std::next(I);
563 const MachineInstr &NMI = *N;
564 for (const MachineOperand &MO : NMI.operands()) {
565 if (!MO.isReg())
566 continue;
567 Register Reg = MO.getReg();
568 // We only care about virtual registers and ignore virtual registers
569 // created by the target callbacks in the process (those will be handled
570 // in a scavenging round).
571 if (!Reg.isVirtual() ||
572 Register::virtReg2Index(Reg) >= InitialNumVirtRegs)
573 continue;
574 if (!MO.readsReg())
575 continue;
576
577 Register SReg = scavengeVReg(MRI, RS, Reg, true);
578 N->addRegisterKilled(SReg, &TRI, false);
579 RS.setRegUsed(SReg);
580 }
581 }
582
583 // Look for unassigned vregs in the defs of *I.
584 NextInstructionReadsVReg = false;
585 const MachineInstr &MI = *I;
586 for (const MachineOperand &MO : MI.operands()) {
587 if (!MO.isReg())
588 continue;
589 Register Reg = MO.getReg();
590 // Only vregs, no newly created vregs (see above).
591 if (!Reg.isVirtual() ||
592 Register::virtReg2Index(Reg) >= InitialNumVirtRegs)
593 continue;
594 // We have to look at all operands anyway so we can precalculate here
595 // whether there is a reading operand. This allows use to skip the use
596 // step in the next iteration if there was none.
597 assert(!MO.isInternalRead() && "Cannot assign inside bundles");
598 assert((!MO.isUndef() || MO.isDef()) && "Cannot handle undef uses");
599 if (MO.readsReg()) {
600 NextInstructionReadsVReg = true;
601 }
602 if (MO.isDef()) {
603 Register SReg = scavengeVReg(MRI, RS, Reg, false);
604 I->addRegisterDead(SReg, &TRI, false);
605 }
606 }
607 }
608#ifndef NDEBUG
609 for (const MachineOperand &MO : MBB.front().operands()) {
610 if (!MO.isReg() || !MO.getReg().isVirtual())
611 continue;
612 assert(!MO.isInternalRead() && "Cannot assign inside bundles");
613 assert((!MO.isUndef() || MO.isDef()) && "Cannot handle undef uses");
614 assert(!MO.readsReg() && "Vreg use in first instruction not allowed");
615 }
616#endif
617
618 return MRI.getNumVirtRegs() != InitialNumVirtRegs;
619}
620
622 // FIXME: Iterating over the instruction stream is unnecessary. We can simply
623 // iterate over the vreg use list, which at this point only contains machine
624 // operands for which eliminateFrameIndex need a new scratch reg.
626 // Shortcut.
627 if (MRI.getNumVirtRegs() == 0) {
629 return;
630 }
631
632 // Run through the instructions and find any virtual registers.
633 for (MachineBasicBlock &MBB : MF) {
634 if (MBB.empty())
635 continue;
636
637 bool Again = scavengeFrameVirtualRegsInBlock(MRI, RS, MBB);
638 if (Again) {
639 LLVM_DEBUG(dbgs() << "Warning: Required two scavenging passes for block "
640 << MBB.getName() << '\n');
642 // The target required a 2nd run (because it created new vregs while
643 // spilling). Refuse to do another pass to keep compiletime in check.
644 if (Again)
645 report_fatal_error("Incomplete scavenging after 2nd pass");
646 }
647 }
648
649 MRI.clearVirtRegs();
651}
652
653namespace {
654
655/// This class runs register scavenging independ of the PrologEpilogInserter.
656/// This is used in for testing.
657class ScavengerTest : public MachineFunctionPass {
658public:
659 static char ID;
660
661 ScavengerTest() : MachineFunctionPass(ID) {}
662
663 bool runOnMachineFunction(MachineFunction &MF) override {
664 const TargetSubtargetInfo &STI = MF.getSubtarget();
665 const TargetFrameLowering &TFL = *STI.getFrameLowering();
666
667 RegScavenger RS;
668 // Let's hope that calling those outside of PrologEpilogueInserter works
669 // well enough to initialize the scavenger with some emergency spillslots
670 // for the target.
671 BitVector SavedRegs;
672 TFL.determineCalleeSaves(MF, SavedRegs, &RS);
674
675 // Let's scavenge the current function
677 return true;
678 }
679};
680
681} // end anonymous namespace
682
683char ScavengerTest::ID;
684
685INITIALIZE_PASS(ScavengerTest, "scavenger-test",
686 "Scavenge virtual registers inside basic blocks", false, false)
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
MachineBasicBlock & MBB
This file implements the BitVector class.
BlockVerifier::State From
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static cl::opt< unsigned > InstrLimit("dfa-instr-limit", cl::Hidden, cl::init(0), cl::desc("If present, stops packetizing after N instructions"))
#define LLVM_DEBUG(X)
Definition: Debug.h:101
IRTranslator LLVM IR MI
A set of register units.
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
#define P(N)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:38
static Register scavengeVReg(MachineRegisterInfo &MRI, RegScavenger &RS, Register VReg, bool ReserveAfter)
Allocate a register for the virtual register VReg.
static unsigned getFrameIndexOperandNum(MachineInstr &MI)
static bool scavengeFrameVirtualRegsInBlock(MachineRegisterInfo &MRI, RegScavenger &RS, MachineBasicBlock &MBB)
Allocate (scavenge) vregs inside a single basic block.
static std::pair< MCPhysReg, MachineBasicBlock::iterator > findSurvivorBackwards(const MachineRegisterInfo &MRI, MachineBasicBlock::iterator From, MachineBasicBlock::iterator To, const LiveRegUnits &LiveOut, ArrayRef< MCPhysReg > AllocationOrder, bool RestoreAfter)
Given the bitvector Available of free register units at position From.
This file declares the machine register scavenger class.
@ SI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
BitVector & reset()
Definition: BitVector.h:392
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:341
BitVector & set()
Definition: BitVector.h:351
A set of register units used to track register liveness.
Definition: LiveRegUnits.h:30
void addRegMasked(MCPhysReg Reg, LaneBitmask Mask)
Adds register units covered by physical register Reg that are part of the lanemask Mask.
Definition: LiveRegUnits.h:93
bool available(MCPhysReg Reg) const
Returns true if no part of physical register Reg is live.
Definition: LiveRegUnits.h:116
void init(const TargetRegisterInfo &TRI)
Initialize and clear the set.
Definition: LiveRegUnits.h:73
void stepBackward(const MachineInstr &MI)
Updates liveness when stepping backwards over the instruction MI.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds registers living out of block MBB.
void addLiveIns(const MachineBasicBlock &MBB)
Adds registers living into block MBB.
void removeReg(MCPhysReg Reg)
Removes all register units covered by physical register Reg.
Definition: LiveRegUnits.h:102
MCRegUnitRootIterator enumerates the root registers of a register unit.
bool isValid() const
Check if the iterator is at the end of the list.
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
unsigned getNumRegUnits() const
Return the number of (native) register units in the target.
const char * getName(MCRegister RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register.
iterator_range< mc_superreg_iterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
iterator_range< mc_subreg_iterator > subregs(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, excluding Reg.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:24
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
int getObjectIndexBegin() const
Return the minimum frame object index.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
MachineFunctionProperties & set(Property P)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
Representation of each machine instruction.
Definition: MachineInstr.h:68
iterator_range< mop_iterator > operands()
Definition: MachineInstr.h:648
MachineOperand class - Representation of each machine instruction operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
reg_begin/reg_end - Provide iteration support to walk over all definitions and uses of a register wit...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
void enterBasicBlockEnd(MachineBasicBlock &MBB)
Start tracking liveness from the end of basic block MBB.
bool isRegUsed(Register Reg, bool includeReserved=true) const
Return if a specific register is currently used.
Register FindUnusedReg(const TargetRegisterClass *RC) const
Find an unused register of the specified register class.
void setRegUsed(Register Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Tell the scavenger a register is used.
void backward()
Update internal register state and move MBB iterator backwards.
void enterBasicBlock(MachineBasicBlock &MBB)
Start tracking liveness from the begin of basic block MBB.
Register scavengeRegisterBackwards(const TargetRegisterClass &RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill=true)
Make a register of the specific register class available from the current position backwards to the p...
BitVector getRegsAvailable(const TargetRegisterClass *RC)
Return all available registers in the register class in Mask.
void forward()
Move the internal MBB iterator and update register states.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static unsigned virtReg2Index(Register Reg)
Convert a virtual register number to a 0-based index.
Definition: Register.h:77
size_t size() const
Definition: SmallVector.h:91
void push_back(const T &Elt)
Definition: SmallVector.h:416
Information about stack frame layout on the target.
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS=nullptr) const
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const
Load the specified register of the given register class from the specified stack frame index.
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const
Store the specified register of the given register class to the specified stack frame index.
ArrayRef< MCPhysReg > getRawAllocationOrder(const MachineFunction &MF) const
Returns the preferred order for allocating registers from this register class in MF.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Align getSpillAlign(const TargetRegisterClass &RC) const
Return the minimum required alignment in bytes for a spill slot for a register of this class.
virtual bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const =0
This method must be overriden to eliminate abstract frame indices from instructions which may use the...
virtual bool saveScavengerRegister(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineBasicBlock::iterator &UseMI, const TargetRegisterClass *RC, Register Reg) const
Spill the register so it can be used by the register scavenger.
unsigned getSpillSize(const TargetRegisterClass &RC) const
Return the size in bytes of the stack slot allocated to hold a spilled copy of a register from class ...
const char * getRegClassName(const TargetRegisterClass *Class) const
Returns the name of the register class.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void scavengeFrameVirtualRegs(MachineFunction &MF, RegScavenger &RS)
Replaces all frame index virtual registers with physical registers.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1833
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:145
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1846
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85