21#include "llvm/Config/llvm-config.h"
32 SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers) {
34 while (LRI != LiveRegs.end()) {
37 Clobbers->push_back(std::make_pair(*LRI, &MO));
38 LRI = LiveRegs.erase(LRI);
47 if (MOP.isRegMask()) {
60 if (!MOP.isReg() || !MOP.readsReg())
81 SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers) {
88 if (!Reg.isPhysical())
93 Clobbers.push_back(std::make_pair(Reg.id(), &*O));
99 }
else if (O->isRegMask()) {
105 for (
auto Reg : Clobbers) {
108 if (Reg.second->isReg() && Reg.second->isDead())
110 if (Reg.second->isRegMask() &&
119 OS <<
"Live Registers:";
121 OS <<
" (uninitialized)\n";
135#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
137 dbgs() <<
" " << *
this;
143 if (LiveRegs.count(Reg.id()))
145 if (
MRI.isReserved(Reg))
148 if (LiveRegs.count(*R))
155void LivePhysRegs::addRegMaskPair(
160 assert(Mask.any() &&
"Invalid livein mask");
161 if (Mask.all() || !S.isValid()) {
165 for (; S.isValid(); ++S) {
166 unsigned SI = S.getSubRegIndex();
188 for (
const MCPhysReg *CSR =
MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
189 LiveRegs.addReg(*CSR);
215 Pristine.removeReg(
Info.getReg());
221 addBlockLiveOuts(
MBB);
235 if (
Info.isRestored())
250 addBlockLiveIns(
MBB);
254 addBlockLiveIns(
MBB);
263 LiveRegs.addLiveOutsNoPristines(
MBB);
265 LiveRegs.stepBackward(
MI);
274 if (
MRI.isReserved(Reg))
278 return LiveRegs.contains(SReg) && !MRI.isReserved(SReg);
294 LiveRegs.addLiveOutsNoPristines(
MBB);
299 if (!MO->isReg() || !MO->isDef() || MO->isDebug())
307 bool IsNotLive = LiveRegs.available(
MRI, Reg);
313 if (
Info.getReg() == Reg.asMCReg()) {
314 IsNotLive = !
Info.isRestored();
320 MO->setIsDead(IsNotLive);
324 LiveRegs.removeDefs(
MI);
328 if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
336 bool IsNotLive = LiveRegs.available(
MRI, Reg);
337 MO->setIsKill(IsNotLive);
341 LiveRegs.addUses(
MI);
354 assert(Reg.isPhysical() &&
"Apply to physical register only");
359 if (
MI.readsRegister(Reg,
nullptr))
362 if (
MI.definesRegister(Reg,
nullptr))
369 if (LO.PhysReg == Reg.asMCReg() && LO.LaneMask.any())
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Analysis containing CSE Info
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static void addCalleeSavedRegs(LivePhysRegs &LiveRegs, const MachineFunction &MF)
Adds all callee saved registers to LiveRegs.
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
Register const TargetRegisterInfo * TRI
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
A set of physical registers with utility functions to track liveness when walking backward/forward th...
void addReg(MCRegister Reg)
Adds a physical register and all its sub-registers to the set.
void stepForward(const MachineInstr &MI, SmallVectorImpl< std::pair< MCPhysReg, const MachineOperand * > > &Clobbers)
Simulates liveness when stepping forward over an instruction(bundle).
void print(raw_ostream &OS) const
Prints the currently live registers to OS.
void stepBackward(const MachineInstr &MI)
Simulates liveness when stepping backwards over an instruction(bundle).
void init(const TargetRegisterInfo &TRI)
(re-)initializes and clears the set.
void addLiveIns(const MachineBasicBlock &MBB)
Adds all live-in registers of basic block MBB.
bool available(const MachineRegisterInfo &MRI, MCRegister Reg) const
Returns true if register Reg and no aliasing register is in the set.
void addUses(const MachineInstr &MI)
Add uses to the set.
void removeDefs(const MachineInstr &MI)
Remove defined registers and regmask kills from the set.
void addLiveOutsNoPristines(const MachineBasicBlock &MBB)
Adds all live-out registers of basic block MBB but skips pristine registers.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds all live-out registers of basic block MBB.
void removeReg(MCRegister Reg)
Removes a physical register, all its sub-registers, and all its super-registers from the set.
void addLiveInsNoPristines(const MachineBasicBlock &MBB)
Adds all live-in registers of basic block MBB but skips pristine registers.
void removeRegsInMask(const MachineOperand &MO, SmallVectorImpl< std::pair< MCPhysReg, const MachineOperand * > > *Clobbers=nullptr)
Removes physical registers clobbered by the regmask operand MO.
bool empty() const
Returns true if the set is empty.
void dump() const
Dumps the currently live registers to the debug output.
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
Iterator that enumerates the sub-registers of a Reg and the associated sub-register indices.
bool isValid() const
isValid - Returns true until all the operands have been visited.
MIBundleOperands - Iterate over all operands in a bundle of machine instructions.
iterator_range< liveout_iterator > liveouts() const
iterator_range< livein_iterator > liveins() const
bool livein_empty() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename DenseT::iterator iterator
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LaneBitmask getSubRegIndexLaneMask(unsigned SubIdx) const
Return a bitmask representing the parts of a register that are covered by SubIdx.
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< filter_iterator< ConstMIBundleOperands, bool(*)(const MachineOperand &)> > phys_regs_and_masks(const MachineInstr &MI)
Returns an iterator range over all physical register and mask operands for MI and bundled instruction...
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void recomputeLivenessFlags(MachineBasicBlock &MBB)
Recomputes dead and kill flags in MBB.
bool isPhysRegUsedAfter(Register Reg, MachineBasicBlock::iterator MBI)
Check if physical register Reg is used after MBI.
void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
void computeLiveIns(LivePhysRegs &LiveRegs, const MachineBasicBlock &MBB)
Computes registers live-in to MBB assuming all of its successors live-in lists are up-to-date.
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.
void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
Pair of physical register and lane mask.