class RegScavenger

Declaration

class RegScavenger { /* full declaration omitted */ };

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:34

Member Variables

private const llvm::TargetRegisterInfo* TRI
private const llvm::TargetInstrInfo* TII
private llvm::MachineRegisterInfo* MRI
private llvm::MachineBasicBlock* MBB = nullptr
private MachineBasicBlock::iterator MBBI
private unsigned int NumRegUnits = 0
private bool Tracking = false
True if RegScavenger is currently tracking the liveness of registers.
private SmallVector<llvm::RegScavenger::ScavengedInfo, 2> Scavenged
A vector of information on scavenged registers.
private llvm::LiveRegUnits LiveUnits
private llvm::BitVector KillRegUnits
private llvm::BitVector DefRegUnits
private llvm::BitVector TmpRegUnits

Method Overview

  • public llvm::Register FindUnusedReg(const llvm::TargetRegisterClass * RC) const
  • public RegScavenger()
  • private void addRegUnits(llvm::BitVector & BV, llvm::MCRegister Reg)
  • public void addScavengingFrameIndex(int FI)
  • public void assignRegToScavengingIndex(int FI, llvm::Register Reg, llvm::MachineInstr * Restore = nullptr)
  • public void backward()
  • public void backward(MachineBasicBlock::iterator I)
  • private void determineKillsAndDefs()
  • public void enterBasicBlock(llvm::MachineBasicBlock & MBB)
  • public void enterBasicBlockEnd(llvm::MachineBasicBlock & MBB)
  • private llvm::Register findSurvivorReg(MachineBasicBlock::iterator StartMI, llvm::BitVector & Candidates, unsigned int InstrLimit, MachineBasicBlock::iterator & UseMI)
  • public void forward(MachineBasicBlock::iterator I)
  • public void forward()
  • public MachineBasicBlock::iterator getCurrentPosition() const
  • public llvm::BitVector getRegsAvailable(const llvm::TargetRegisterClass * RC)
  • public void getScavengingFrameIndices(SmallVectorImpl<int> & A) const
  • private void init(llvm::MachineBasicBlock & MBB)
  • public bool isRegUsed(llvm::Register Reg, bool includeReserved = true) const
  • private bool isReserved(llvm::Register Reg) const
  • public bool isScavengingFrameIndex(int FI) const
  • private void removeRegUnits(llvm::BitVector & BV, llvm::MCRegister Reg)
  • public llvm::Register scavengeRegister(const llvm::TargetRegisterClass * RegClass, int SPAdj, bool AllowSpill = true)
  • public llvm::Register scavengeRegister(const llvm::TargetRegisterClass * RC, MachineBasicBlock::iterator I, int SPAdj, bool AllowSpill = true)
  • public llvm::Register scavengeRegisterBackwards(const llvm::TargetRegisterClass & RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill = true)
  • public void setRegUsed(llvm::Register Reg, llvm::LaneBitmask LaneMask = LaneBitmask::getAll())
  • private void setUnused(const llvm::BitVector & RegUnits)
  • private void setUsed(const llvm::BitVector & RegUnits)
  • public void skipTo(MachineBasicBlock::iterator I)
  • private llvm::RegScavenger::ScavengedInfo & spill(llvm::Register Reg, const llvm::TargetRegisterClass & RC, int SPAdj, MachineBasicBlock::iterator Before, MachineBasicBlock::iterator & UseMI)

Methods

llvm::Register FindUnusedReg(
    const llvm::TargetRegisterClass* RC) const

Description

Find an unused register of the specified register class. Return 0 if none is found.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:140

Parameters

const llvm::TargetRegisterClass* RC

RegScavenger()

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:71

void addRegUnits(llvm::BitVector& BV,
                 llvm::MCRegister Reg)

Description

Add all Reg Units that Reg contains to BV.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:215

Parameters

llvm::BitVector& BV
llvm::MCRegister Reg

void addScavengingFrameIndex(int FI)

Description

Add a scavenging frame index.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:143

Parameters

int FI

void assignRegToScavengingIndex(
    int FI,
    llvm::Register Reg,
    llvm::MachineInstr* Restore = nullptr)

Description

Record that \p Reg is in use at scavenging index \p FI. This is for targets which need to directly manage the spilling process, and need to update the scavenger's internal state. It's expected this be called a second time with \p Restore set to a non-null value, so that the externally inserted restore instruction resets the scavenged slot liveness when encountered.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:79

Parameters

int FI
llvm::Register Reg
llvm::MachineInstr* Restore = nullptr

void backward()

Description

Update internal register state and move MBB iterator backwards. Contrary to unprocess() this method gives precise results even in the absence of kill flags.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:115

void backward(MachineBasicBlock::iterator I)

Description

Call backward() as long as the internal iterator does not point to \p I.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:118

Parameters

MachineBasicBlock::iterator I

void determineKillsAndDefs()

Description

Processes the current instruction and fill the KillRegUnits and DefRegUnits bit vectors.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:212

void enterBasicBlock(llvm::MachineBasicBlock& MBB)

Description

Start tracking liveness from the begin of basic block \p MBB.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:94

Parameters

llvm::MachineBasicBlock& MBB

void enterBasicBlockEnd(
    llvm::MachineBasicBlock& MBB)

Description

Start tracking liveness from the end of basic block \p MBB. Use backward() to move towards the beginning of the block. This is preferred to enterBasicBlock() and forward() because it does not depend on the presence of kill flags.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:100

Parameters

llvm::MachineBasicBlock& MBB

llvm::Register findSurvivorReg(
    MachineBasicBlock::iterator StartMI,
    llvm::BitVector& Candidates,
    unsigned int InstrLimit,
    MachineBasicBlock::iterator& UseMI)

Description

Return the candidate register that is unused for the longest after StartMI. UseMI is set to the instruction where the search stopped. No more than InstrLimit instructions are inspected.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:224

Parameters

MachineBasicBlock::iterator StartMI
llvm::BitVector& Candidates
unsigned int InstrLimit
MachineBasicBlock::iterator& UseMI

void forward(MachineBasicBlock::iterator I)

Description

Move the internal MBB iterator and update register states until it has processed the specific iterator.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:107

Parameters

MachineBasicBlock::iterator I

void forward()

Description

Move the internal MBB iterator and update register states.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:103

MachineBasicBlock::iterator getCurrentPosition()
    const

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:130

llvm::BitVector getRegsAvailable(
    const llvm::TargetRegisterClass* RC)

Description

Return all available registers in the register class in Mask.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:136

Parameters

const llvm::TargetRegisterClass* RC

void getScavengingFrameIndices(
    SmallVectorImpl<int>& A) const

Description

Get an array of scavenging frame indices.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:157

Parameters

SmallVectorImpl<int>& A

void init(llvm::MachineBasicBlock& MBB)

Description

Initialize RegisterScavenger.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:230

Parameters

llvm::MachineBasicBlock& MBB

bool isRegUsed(llvm::Register Reg,
               bool includeReserved = true) const

Description

Return if a specific register is currently used.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:133

Parameters

llvm::Register Reg
bool includeReserved = true

bool isReserved(llvm::Register Reg) const

Description

Returns true if a register is reserved. It is never "unused".

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:199

Parameters

llvm::Register Reg

bool isScavengingFrameIndex(int FI) const

Description

Query whether a frame index is a scavenging frame index.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:148

Parameters

int FI

void removeRegUnits(llvm::BitVector& BV,
                    llvm::MCRegister Reg)

Description

Remove all Reg Units that \p Reg contains from \p BV.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:218

Parameters

llvm::BitVector& BV
llvm::MCRegister Reg

llvm::Register scavengeRegister(
    const llvm::TargetRegisterClass* RegClass,
    int SPAdj,
    bool AllowSpill = true)

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:175

Parameters

const llvm::TargetRegisterClass* RegClass
int SPAdj
bool AllowSpill = true

llvm::Register scavengeRegister(
    const llvm::TargetRegisterClass* RC,
    MachineBasicBlock::iterator I,
    int SPAdj,
    bool AllowSpill = true)

Description

Make a register of the specific register class available and do the appropriate bookkeeping. SPAdj is the stack adjustment due to call frame, it's passed along to eliminateFrameIndex(). Returns the scavenged register. This is deprecated as it depends on the quality of the kill flags being present; Use scavengeRegisterBackwards() instead! If \p AllowSpill is false, fail if a spill is required to make the register available, and return NoRegister.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:172

Parameters

const llvm::TargetRegisterClass* RC
MachineBasicBlock::iterator I
int SPAdj
bool AllowSpill = true

llvm::Register scavengeRegisterBackwards(
    const llvm::TargetRegisterClass& RC,
    MachineBasicBlock::iterator To,
    bool RestoreAfter,
    int SPAdj,
    bool AllowSpill = true)

Description

Make a register of the specific register class available from the current position backwards to the place before \p To. If \p RestoreAfter is true this includes the instruction following the current position. SPAdj is the stack adjustment due to call frame, it's passed along to eliminateFrameIndex(). Returns the scavenged register. If \p AllowSpill is false, fail if a spill is required to make the register available, and return NoRegister.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:189

Parameters

const llvm::TargetRegisterClass& RC
MachineBasicBlock::iterator To
bool RestoreAfter
int SPAdj
bool AllowSpill = true

void setRegUsed(llvm::Register Reg,
                llvm::LaneBitmask LaneMask =
                    LaneBitmask::getAll())

Description

Tell the scavenger a register is used.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:195

Parameters

llvm::Register Reg
llvm::LaneBitmask LaneMask = LaneBitmask::getAll()

void setUnused(const llvm::BitVector& RegUnits)

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:206

Parameters

const llvm::BitVector& RegUnits

void setUsed(const llvm::BitVector& RegUnits)

Description

setUsed / setUnused - Mark the state of one or a number of register units.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:203

Parameters

const llvm::BitVector& RegUnits

void skipTo(MachineBasicBlock::iterator I)

Description

Move the internal MBB iterator but do not update register states.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:124

Parameters

MachineBasicBlock::iterator I

llvm::RegScavenger::ScavengedInfo& spill(
    llvm::Register Reg,
    const llvm::TargetRegisterClass& RC,
    int SPAdj,
    MachineBasicBlock::iterator Before,
    MachineBasicBlock::iterator& UseMI)

Description

Spill a register after position \p After and reload it before position\p UseMI.

Declared at: llvm/include/llvm/CodeGen/RegisterScavenging.h:234

Parameters

llvm::Register Reg
const llvm::TargetRegisterClass& RC
int SPAdj
MachineBasicBlock::iterator Before
MachineBasicBlock::iterator& UseMI