LLVM 23.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"
35#include "llvm/Pass.h"
36#include "llvm/Support/Debug.h"
39#include <cassert>
40#include <iterator>
41#include <limits>
42#include <utility>
43
44using namespace llvm;
45
46#define DEBUG_TYPE "reg-scavenging"
47
48STATISTIC(NumScavengedRegs, "Number of frame index regs scavenged");
49
51 LiveUnits.addRegMasked(Reg, LaneMask);
52}
53
54void RegScavenger::init(MachineBasicBlock &MBB) {
55 MachineFunction &MF = *MBB.getParent();
58 MRI = &MF.getRegInfo();
59 LiveUnits.init(*TRI);
60
61 this->MBB = &MBB;
62
63 for (ScavengedInfo &SI : Scavenged) {
64 SI.Reg = 0;
65 SI.Restore = nullptr;
66 }
67}
68
70 init(MBB);
71 LiveUnits.addLiveIns(MBB);
72 MBBI = MBB.begin();
73}
74
76 init(MBB);
77 LiveUnits.addLiveOuts(MBB);
78 MBBI = MBB.end();
79}
80
82 const MachineInstr &MI = *--MBBI;
83 if (!MI.isDebugInstr())
84 LiveUnits.stepBackward(MI);
85
86 // Expire scavenge spill frameindex uses.
87 for (ScavengedInfo &I : Scavenged) {
88 if (I.Restore == &MI) {
89 I.Reg = 0;
90 I.Restore = nullptr;
91 }
92 }
93}
94
95bool RegScavenger::isRegUsed(Register Reg, bool includeReserved) const {
96 if (isReserved(Reg))
97 return includeReserved;
98 return !LiveUnits.available(Reg);
99}
100
102 for (Register Reg : *RC) {
103 if (!isRegUsed(Reg)) {
104 LLVM_DEBUG(dbgs() << "Scavenger found unused reg: " << printReg(Reg, TRI)
105 << "\n");
106 return Reg;
107 }
108 }
109 return 0;
110}
111
113 BitVector Mask(TRI->getNumRegs());
114 for (Register Reg : *RC)
115 if (!isRegUsed(Reg))
116 Mask.set(Reg.id());
117 return Mask;
118}
119
120/// Given the bitvector \p Available of free register units at position
121/// \p From. Search backwards to find a register that is part of \p
122/// Candidates and not used/clobbered until the point \p To. If there is
123/// multiple candidates continue searching and pick the one that is not used/
124/// clobbered for the longest time.
125/// Returns the register and the earliest position we know it to be free or
126/// the position MBB.end() if no register is available.
127static std::pair<MCPhysReg, MachineBasicBlock::iterator>
131 bool RestoreAfter) {
132 bool FoundTo = false;
133 MCPhysReg Survivor = 0;
135 MachineBasicBlock &MBB = *From->getParent();
136 unsigned InstrLimit = 25;
137 unsigned InstrCountDown = InstrLimit;
139 LiveRegUnits Used(TRI);
140
141 assert(From->getParent() == To->getParent() &&
142 "Target instruction is in other than current basic block, use "
143 "enterBasicBlockEnd first");
144
145 // If RestoreAfter is set, the scavenged register is needed at
146 // std::next(From), so we need to take into account any possible early-clobber
147 // def regs defined there.
148 if (RestoreAfter) {
149 for (const MachineOperand &MOP : std::next(From)->all_defs()) {
150 if (MOP.getReg().isPhysical() && MOP.isEarlyClobber())
151 Used.addReg(MOP.getReg());
152 }
153 }
154
155 for (MachineBasicBlock::iterator I = From;; --I) {
156 const MachineInstr &MI = *I;
157
158 Used.accumulate(MI);
159
160 if (I == To) {
161 // See if one of the registers in RC wasn't used so far.
163 if (!MRI.isReserved(Reg) && Used.available(Reg) &&
164 LiveOut.available(Reg))
165 return std::make_pair(Reg, MBB.end());
166 }
167 // Otherwise we will continue up to InstrLimit instructions to find
168 // the register which is not defined/used for the longest time.
169 FoundTo = true;
170 Pos = To;
171 // Note: It was fine so far to start our search at From, however now that
172 // we have to spill, and can only place the restore after From then
173 // add the regs used/defed by std::next(From) to the set.
174 if (RestoreAfter)
175 Used.accumulate(*std::next(From));
176 }
177 if (FoundTo) {
178 // Don't search to FrameSetup instructions if we were searching from
179 // Non-FrameSetup instructions. Otherwise, the spill position may point
180 // before FrameSetup instructions.
181 if (!From->getFlag(MachineInstr::FrameSetup) &&
183 break;
184
185 if (Survivor == 0 || !Used.available(Survivor)) {
186 MCPhysReg AvilableReg = 0;
188 if (!MRI.isReserved(Reg) && Used.available(Reg)) {
189 AvilableReg = Reg;
190 break;
191 }
192 }
193 if (AvilableReg == 0)
194 break;
195 Survivor = AvilableReg;
196 }
197 if (--InstrCountDown == 0)
198 break;
199
200 // Keep searching when we find a vreg since the spilled register will
201 // be usefull for this other vreg as well later.
202 bool FoundVReg = false;
203 for (const MachineOperand &MO : MI.operands()) {
204 if (MO.isReg() && MO.getReg().isVirtual()) {
205 FoundVReg = true;
206 break;
207 }
208 }
209 if (FoundVReg) {
210 InstrCountDown = InstrLimit;
211 Pos = I;
212 }
213 if (I == MBB.begin())
214 break;
215 }
216 assert(I != MBB.begin() && "Did not find target instruction while "
217 "iterating backwards");
218 }
219
220 return std::make_pair(Survivor, Pos);
221}
222
224 unsigned i = 0;
225 while (!MI.getOperand(i).isFI()) {
226 ++i;
227 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
228 }
229 return i;
230}
231
232RegScavenger::ScavengedInfo &
233RegScavenger::spill(Register Reg, const TargetRegisterClass &RC, int SPAdj,
236 // Find an available scavenging slot with size and alignment matching
237 // the requirements of the class RC.
238 const MachineFunction &MF = *Before->getMF();
239 const MachineFrameInfo &MFI = MF.getFrameInfo();
240 unsigned NeedSize = TRI->getSpillSize(RC);
241 Align NeedAlign = TRI->getSpillAlign(RC);
242
243 unsigned SI = Scavenged.size(), Diff = std::numeric_limits<unsigned>::max();
244 int FIB = MFI.getObjectIndexBegin(), FIE = MFI.getObjectIndexEnd();
245 for (unsigned I = 0; I < Scavenged.size(); ++I) {
246 if (Scavenged[I].Reg != 0)
247 continue;
248 // Verify that this slot is valid for this register.
249 int FI = Scavenged[I].FrameIndex;
250 if (FI < FIB || FI >= FIE)
251 continue;
252 unsigned S = MFI.getObjectSize(FI);
253 Align A = MFI.getObjectAlign(FI);
254 if (NeedSize > S || NeedAlign > A)
255 continue;
256 // Avoid wasting slots with large size and/or large alignment. Pick one
257 // that is the best fit for this register class (in street metric).
258 // Picking a larger slot than necessary could happen if a slot for a
259 // larger register is reserved before a slot for a smaller one. When
260 // trying to spill a smaller register, the large slot would be found
261 // first, thus making it impossible to spill the larger register later.
262 unsigned D = (S - NeedSize) + (A.value() - NeedAlign.value());
263 if (D < Diff) {
264 SI = I;
265 Diff = D;
266 }
267 }
268
269 if (SI == Scavenged.size()) {
270 // We need to scavenge a register but have no spill slot, the target
271 // must know how to do it (if not, we'll assert below).
272 Scavenged.push_back(ScavengedInfo(FIE));
273 }
274
275 // Avoid infinite regress
276 Scavenged[SI].Reg = Reg;
277
278 // If the target knows how to save/restore the register, let it do so;
279 // otherwise, use the emergency stack spill slot.
280 if (!TRI->saveScavengerRegister(*MBB, Before, UseMI, &RC, Reg)) {
281 // Spill the scavenged register before \p Before.
282 int FI = Scavenged[SI].FrameIndex;
283 if (FI < FIB || FI >= FIE) {
284 report_fatal_error(Twine("Error while trying to spill ") +
285 TRI->getName(Reg) + " from class " +
286 TRI->getRegClassName(&RC) +
287 ": Cannot scavenge register without an emergency "
288 "spill slot!");
289 }
290 TII->storeRegToStackSlot(*MBB, Before, Reg, true, FI, &RC, Register());
291 MachineBasicBlock::iterator II = std::prev(Before);
292
293 unsigned FIOperandNum = getFrameIndexOperandNum(*II);
294 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
295
296 // Restore the scavenged register before its use (or first terminator).
297 TII->loadRegFromStackSlot(*MBB, UseMI, Reg, FI, &RC, Register());
298 II = std::prev(UseMI);
299
300 FIOperandNum = getFrameIndexOperandNum(*II);
301 TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
302 }
303 return Scavenged[SI];
304}
305
308 bool RestoreAfter, int SPAdj,
309 bool AllowSpill) {
310 const MachineBasicBlock &MBB = *To->getParent();
311 const MachineFunction &MF = *MBB.getParent();
312
313 // Find the register whose use is furthest away.
315 std::pair<MCPhysReg, MachineBasicBlock::iterator> P = findSurvivorBackwards(
316 *MRI, std::prev(MBBI), To, LiveUnits, AllocationOrder, RestoreAfter);
317 MCPhysReg Reg = P.first;
318 MachineBasicBlock::iterator SpillBefore = P.second;
319 // Found an available register?
320 if (Reg != 0 && SpillBefore == MBB.end()) {
321 LLVM_DEBUG(dbgs() << "Scavenged free register: " << printReg(Reg, TRI)
322 << '\n');
323 return Reg;
324 }
325
326 if (!AllowSpill)
327 return 0;
328
329 assert(Reg != 0 && "No register left to scavenge!");
330
331 MachineBasicBlock::iterator ReloadBefore =
332 RestoreAfter ? std::next(MBBI) : MBBI;
333 if (ReloadBefore != MBB.end())
334 LLVM_DEBUG(dbgs() << "Reload before: " << *ReloadBefore << '\n');
335 ScavengedInfo &Scavenged = spill(Reg, RC, SPAdj, SpillBefore, ReloadBefore);
336 Scavenged.Restore = &*std::prev(SpillBefore);
337 LiveUnits.removeReg(Reg);
338 LLVM_DEBUG(dbgs() << "Scavenged register with spill: " << printReg(Reg, TRI)
339 << " until " << *SpillBefore);
340 return Reg;
341}
342
343/// Allocate a register for the virtual register \p VReg. The last use of
344/// \p VReg is around the current position of the register scavenger \p RS.
345/// \p ReserveAfter controls whether the scavenged register needs to be reserved
346/// after the current instruction, otherwise it will only be reserved before the
347/// current instruction.
349 Register VReg, bool ReserveAfter) {
351#ifndef NDEBUG
352 // Verify that all definitions and uses are in the same basic block.
353 const MachineBasicBlock *CommonMBB = nullptr;
354 // Real definition for the reg, re-definitions are not considered.
355 const MachineInstr *RealDef = nullptr;
356 for (MachineOperand &MO : MRI.reg_nodbg_operands(VReg)) {
357 MachineBasicBlock *MBB = MO.getParent()->getParent();
358 if (CommonMBB == nullptr)
359 CommonMBB = MBB;
360 assert(MBB == CommonMBB && "All defs+uses must be in the same basic block");
361 if (MO.isDef()) {
362 const MachineInstr &MI = *MO.getParent();
363 if (!MI.readsRegister(VReg, &TRI)) {
364 assert((!RealDef || RealDef == &MI) &&
365 "Can have at most one definition which is not a redefinition");
366 RealDef = &MI;
367 }
368 }
369 }
370 assert(RealDef != nullptr && "Must have at least 1 Def");
371#endif
372
373 // We should only have one definition of the register. However to accommodate
374 // the requirements of two address code we also allow definitions in
375 // subsequent instructions provided they also read the register. That way
376 // we get a single contiguous lifetime.
377 //
378 // Definitions in MRI.def_begin() are unordered, search for the first.
380 MRI.def_operands(VReg), [VReg, &TRI](const MachineOperand &MO) {
381 return !MO.getParent()->readsRegister(VReg, &TRI);
382 });
383 assert(FirstDef != MRI.def_end() &&
384 "Must have one definition that does not redefine vreg");
385 MachineInstr &DefMI = *FirstDef->getParent();
386
387 // The register scavenger will report a free register inserting an emergency
388 // spill/reload if necessary.
389 int SPAdj = 0;
390 const TargetRegisterClass &RC = *MRI.getRegClass(VReg);
391 Register SReg = RS.scavengeRegisterBackwards(RC, DefMI.getIterator(),
392 ReserveAfter, SPAdj);
393 MRI.replaceRegWith(VReg, SReg);
394 ++NumScavengedRegs;
395 return SReg;
396}
397
398/// Allocate (scavenge) vregs inside a single basic block.
399/// Returns true if the target spill callback created new vregs and a 2nd pass
400/// is necessary.
402 RegScavenger &RS,
405 RS.enterBasicBlockEnd(MBB);
406
407 unsigned InitialNumVirtRegs = MRI.getNumVirtRegs();
408 bool NextInstructionReadsVReg = false;
409 for (MachineBasicBlock::iterator I = MBB.end(); I != MBB.begin(); ) {
410 // Move RegScavenger to the position between *std::prev(I) and *I.
411 RS.backward(I);
412 --I;
413
414 // Look for unassigned vregs in the uses of *std::next(I).
415 if (NextInstructionReadsVReg) {
416 MachineBasicBlock::iterator N = std::next(I);
417 const MachineInstr &NMI = *N;
418 for (const MachineOperand &MO : NMI.operands()) {
419 if (!MO.isReg())
420 continue;
421 Register Reg = MO.getReg();
422 // We only care about virtual registers and ignore virtual registers
423 // created by the target callbacks in the process (those will be handled
424 // in a scavenging round).
425 if (!Reg.isVirtual() || Reg.virtRegIndex() >= InitialNumVirtRegs)
426 continue;
427 if (!MO.readsReg())
428 continue;
429
430 Register SReg = scavengeVReg(MRI, RS, Reg, true);
431 N->addRegisterKilled(SReg, &TRI, false);
432 RS.setRegUsed(SReg);
433 }
434 }
435
436 // Look for unassigned vregs in the defs of *I.
437 NextInstructionReadsVReg = false;
438 const MachineInstr &MI = *I;
439 for (const MachineOperand &MO : MI.operands()) {
440 if (!MO.isReg())
441 continue;
442 Register Reg = MO.getReg();
443 // Only vregs, no newly created vregs (see above).
444 if (!Reg.isVirtual() || Reg.virtRegIndex() >= InitialNumVirtRegs)
445 continue;
446 // We have to look at all operands anyway so we can precalculate here
447 // whether there is a reading operand. This allows use to skip the use
448 // step in the next iteration if there was none.
449 assert(!MO.isInternalRead() && "Cannot assign inside bundles");
450 assert((!MO.isUndef() || MO.isDef()) && "Cannot handle undef uses");
451 if (MO.readsReg()) {
452 NextInstructionReadsVReg = true;
453 }
454 if (MO.isDef()) {
455 Register SReg = scavengeVReg(MRI, RS, Reg, false);
456 I->addRegisterDead(SReg, &TRI, false);
457 }
458 }
459 }
460#ifndef NDEBUG
461 for (const MachineOperand &MO : MBB.front().operands()) {
462 if (!MO.isReg() || !MO.getReg().isVirtual())
463 continue;
464 assert(!MO.isInternalRead() && "Cannot assign inside bundles");
465 assert((!MO.isUndef() || MO.isDef()) && "Cannot handle undef uses");
466 assert(!MO.readsReg() && "Vreg use in first instruction not allowed");
467 }
468#endif
469
470 return MRI.getNumVirtRegs() != InitialNumVirtRegs;
471}
472
474 // FIXME: Iterating over the instruction stream is unnecessary. We can simply
475 // iterate over the vreg use list, which at this point only contains machine
476 // operands for which eliminateFrameIndex need a new scratch reg.
478 // Shortcut.
479 if (MRI.getNumVirtRegs() == 0) {
480 MF.getProperties().setNoVRegs();
481 return;
482 }
483
484 // Run through the instructions and find any virtual registers.
485 for (MachineBasicBlock &MBB : MF) {
486 if (MBB.empty())
487 continue;
488
489 bool Again = scavengeFrameVirtualRegsInBlock(MRI, RS, MBB);
490 if (Again) {
491 LLVM_DEBUG(dbgs() << "Warning: Required two scavenging passes for block "
492 << MBB.getName() << '\n');
493 Again = scavengeFrameVirtualRegsInBlock(MRI, RS, MBB);
494 // The target required a 2nd run (because it created new vregs while
495 // spilling). Refuse to do another pass to keep compiletime in check.
496 if (Again)
497 report_fatal_error("Incomplete scavenging after 2nd pass");
498 }
499 }
500
501 MRI.clearVirtRegs();
502 MF.getProperties().setNoVRegs();
503}
504
505namespace {
506
507/// This class runs register scavenging independ of the PrologEpilogInserter.
508/// This is used in for testing.
509class ScavengerTest : public MachineFunctionPass {
510public:
511 static char ID;
512
513 ScavengerTest() : MachineFunctionPass(ID) {}
514
515 bool runOnMachineFunction(MachineFunction &MF) override {
516 const TargetSubtargetInfo &STI = MF.getSubtarget();
517 const TargetFrameLowering &TFL = *STI.getFrameLowering();
518
519 RegScavenger RS;
520 // Let's hope that calling those outside of PrologEpilogueInserter works
521 // well enough to initialize the scavenger with some emergency spillslots
522 // for the target.
523 BitVector SavedRegs;
524 TFL.determineCalleeSaves(MF, SavedRegs, &RS);
526
527 // Let's scavenge the current function
529 return true;
530 }
531};
532
533} // end anonymous namespace
534
535char ScavengerTest::ID;
536
537INITIALIZE_PASS(ScavengerTest, "scavenger-test",
538 "Scavenge virtual registers inside basic blocks", false, false)
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
This file implements the BitVector class.
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"))
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
A set of register units.
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
uint64_t IntrinsicInst * II
#define P(N)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
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.
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:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A set of register units used to track register liveness.
bool available(MCRegister Reg) const
Returns true if no part of physical register Reg is live.
void init(const TargetRegisterInfo &TRI)
Initialize and clear the set.
MachineInstrBundleIterator< MachineInstr > iterator
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...
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.
Representation of each machine instruction.
mop_range operands()
MachineOperand class - Representation of each machine instruction operand.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
LLVM_ABI void clearVirtRegs()
clearVirtRegs - Remove all virtual registers (after physreg assignment).
defusechain_iterator< false, true, false, true, false > def_iterator
def_iterator/def_begin/def_end - Walk all defs of the specified register.
iterator_range< def_iterator > def_operands(Register Reg) const
static def_iterator def_end()
const TargetRegisterInfo * getTargetRegisterInfo() const
iterator_range< reg_nodbg_iterator > reg_nodbg_operands(Register Reg) const
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVM_ABI void replaceRegWith(Register FromReg, Register ToReg)
replaceRegWith - Replace all instances of FromReg with ToReg in the machine function.
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.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
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...
ArrayRef< MCPhysReg > getRawAllocationOrder(const MachineFunction &MF, bool Rev=false) 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...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
void scavengeFrameVirtualRegs(MachineFunction &MF, RegScavenger &RS)
Replaces all frame index virtual registers with physical registers.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
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:1771
LLVM_ABI 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
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77