37#include "llvm/Config/llvm-config.h"
54 OS <<
"Live variables in machine function: " << MF.
getName() <<
'\n';
62 "Live Variable Analysis",
false,
false)
74 : MF(&MF),
MRI(&MF.getRegInfo()),
TRI(MF.getSubtarget().getRegisterInfo()) {
81 OS <<
"Virtual register '%" <<
I <<
"':\n";
89 if (
MI->getParent() ==
MBB)
95 OS <<
" Alive in blocks: ";
96 for (
unsigned AB : AliveBlocks)
98 OS <<
"\n Killed by:";
100 OS <<
" No instructions.\n\n";
102 for (
unsigned i = 0, e = Kills.size(); i != e; ++i)
103 OS <<
"\n #" << i <<
": " << *Kills[i];
108#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
114 assert(Reg.isVirtual() &&
"getVarInfo: not a virtual register!");
126 for (
unsigned i = 0, e = VRInfo.
Kills.size(); i != e; ++i)
127 if (VRInfo.
Kills[i]->getParent() ==
MBB) {
132 if (
MBB == DefBlock)
return;
140 assert(
MBB != &MF->
front() &&
"Can't find reaching def for virtreg");
150 while (!WorkList.
empty()) {
165 if (!VRInfo.
Kills.empty() && VRInfo.
Kills.back()->getParent() ==
MBB) {
174 assert(Kill->getParent() !=
MBB &&
"entry should be at end!");
217 unsigned LastDefDist = 0;
223 unsigned Dist = DistanceMap[Def];
224 if (Dist > LastDefDist) {
242 if (!LastDef && !PhysRegUse[
Reg.id()]) {
253 if (LastPartialDef) {
257 }
else if (LastDef && !PhysRegUse[
Reg.id()] &&
273 if (!LastDef && !LastUse)
276 MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
277 unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
278 unsigned LastPartDefDist = 0;
281 if (Def && Def != LastDef) {
284 unsigned Dist = DistanceMap[
Def];
285 if (Dist > LastPartDefDist)
286 LastPartDefDist = Dist;
288 unsigned Dist = DistanceMap[
Use];
289 if (Dist > LastRefOrPartRefDist) {
290 LastRefOrPartRefDist = Dist;
291 LastRefOrPartRef =
Use;
296 return LastRefOrPartRef;
302 if (!LastDef && !LastUse)
305 MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
306 unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
325 unsigned LastPartDefDist = 0;
329 if (Def && Def != LastDef) {
332 unsigned Dist = DistanceMap[
Def];
333 if (Dist > LastPartDefDist) {
334 LastPartDefDist = Dist;
341 unsigned Dist = DistanceMap[
Use];
342 if (Dist > LastRefOrPartRefDist) {
343 LastRefOrPartRefDist = Dist;
344 LastRefOrPartRef =
Use;
349 if (!PhysRegUse[
Reg.id()]) {
354 PhysRegDef[
Reg.id()]->addRegisterDead(Reg, TRI,
true);
359 if (PhysRegDef[
Reg.id()] == PhysRegDef[
SubReg]) {
368 PhysRegDef[
Reg.id()]->addOperand(
376 PhysRegUse[
SS] = LastRefOrPartRef;
381 }
else if (LastRefOrPartRef == PhysRegDef[
Reg.id()] &&
382 LastRefOrPartRef !=
MI) {
407void LiveVariables::HandleRegMask(
const MachineOperand &MO,
unsigned NumRegs) {
411 for (
unsigned Reg = 1;
Reg != NumRegs; ++
Reg) {
413 if (!PhysRegDef[Reg] && !PhysRegUse[Reg])
420 unsigned Super =
Reg;
422 if (SR < NumRegs && (PhysRegDef[SR] || PhysRegUse[SR]) &&
425 HandlePhysRegKill(Super,
nullptr);
433 if (PhysRegDef[
Reg.id()] || PhysRegUse[
Reg.id()]) {
452 HandlePhysRegKill(Reg,
MI);
467 while (!Defs.
empty()) {
471 PhysRegUse[
SubReg] =
nullptr;
481 unsigned NumOperandsToProcess =
MI.getNumOperands();
486 NumOperandsToProcess = 1;
492 for (
unsigned i = 0; i != NumOperandsToProcess; ++i) {
522 HandlePhysRegUse(MOReg,
MI);
526 for (
unsigned Mask : RegMasks)
527 HandleRegMask(
MI.getOperand(Mask), NumRegs);
534 HandlePhysRegDef(MOReg, &
MI, Defs);
536 UpdatePhysRegDefs(
MI, Defs);
543 assert(LI.PhysReg.isPhysical() &&
544 "Cannot have a live-in virtual register!");
545 HandlePhysRegDef(LI.PhysReg,
nullptr, Defs);
552 if (
MI.isDebugOrPseudoInstr())
554 DistanceMap.insert(std::make_pair(&
MI, Dist++));
556 runOnInstr(
MI, Defs, NumRegs);
576 if (SuccMBB->isEHPad())
578 for (
const auto &LI : SuccMBB->liveins()) {
581 LiveOuts.
insert(LI.PhysReg);
587 for (
unsigned i = 0; i != NumRegs; ++i)
588 if ((PhysRegDef[i] || PhysRegUse[i]) && !LiveOuts.
count(i))
589 HandlePhysRegDef(i,
nullptr, Defs);
598 PhysRegDef.assign(NumRegs,
nullptr);
599 PhysRegUse.assign(NumRegs,
nullptr);
618 runOnBlock(
MBB, NumRegs);
620 PhysRegDef.assign(NumRegs,
nullptr);
621 PhysRegUse.assign(NumRegs,
nullptr);
626 for (
unsigned i = 0, e1 =
VirtRegInfo.size(); i != e1; ++i) {
628 for (
unsigned j = 0, e2 =
VirtRegInfo[Reg].Kills.size(); j != e2; ++j)
652 VI.AliveBlocks.clear();
664 unsigned NumRealUses = 0;
666 UseMO.setIsKill(
false);
667 if (!UseMO.readsReg())
676 unsigned Idx = UseMO.getOperandNo();
678 }
else if (&UseBB == &DefBB) {
687 if (NumRealUses == 0) {
688 VI.Kills.push_back(&
DefMI);
689 DefMI.addRegisterDead(Reg,
nullptr);
692 DefMI.clearRegisterDeads(Reg);
695 bool LiveToEndOfDefBB =
false;
696 while (!LiveToEndBlocks.
empty()) {
699 LiveToEndOfDefBB =
true;
711 for (
unsigned UseBBNum : UseBlocks) {
712 if (VI.AliveBlocks.test(UseBBNum))
715 if (&UseBB == &DefBB && LiveToEndOfDefBB)
718 if (
MI.isDebugOrPseudoInstr())
722 if (
MI.readsVirtualRegister(Reg)) {
723 assert(!
MI.killsRegister(Reg,
nullptr));
724 MI.addRegisterKilled(Reg,
nullptr);
725 VI.Kills.push_back(&
MI);
747 if (Reg.isVirtual()) {
749 assert(removed &&
"kill not in register's VarInfo?");
761 for (
const auto &
MBB : Fn)
762 for (
const auto &BBI :
MBB) {
765 for (
unsigned i = 1, e = BBI.getNumOperands(); i != e; i += 2)
766 if (BBI.getOperand(i).readsReg())
767 PHIVarInfo[BBI.getOperand(i + 1).getMBB()->getNumber()]
768 .push_back(BBI.getOperand(i).getReg());
777 if (AliveBlocks.test(Num))
782 if (Def && Def->getParent() == &
MBB)
786 return findKill(&
MBB);
800 unsigned SuccIdx = SuccMBB->getNumber();
801 if (VI.AliveBlocks.test(SuccIdx))
804 if (Kills.
count(SuccMBB))
822 for (; BBI != BBE && BBI->isPHI(); ++BBI) {
824 Defs.
insert(BBI->getOperand(0).getReg());
827 for (
unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
828 if (BBI->getOperand(i+1).getMBB() == BB)
833 for (; BBI != BBE; ++BBI) {
835 if (
Op.isReg() &&
Op.getReg().isVirtual()) {
838 else if (
Op.isKill())
856 VI.AliveBlocks.set(NumNew);
871 for (
unsigned R : BV) {
874 VI.AliveBlocks.set(NumNew);
879 BBI != BBE && BBI->isPHI(); ++BBI) {
880 for (
unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
881 if (BBI->getOperand(i + 1).getMBB() == BB &&
882 BBI->getOperand(i).readsReg())
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
block Block Frequency Analysis
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is Live
This file defines the DenseSet and SmallDenseSet classes.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
A container for analyses that lazily runs them and caches their results.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
This class represents an Operation in the Expression.
Implements a dense probed hash-table based set.
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI void replaceKillInstruction(Register Reg, MachineInstr &OldMI, MachineInstr &NewMI)
replaceKillInstruction - Update register kill info by replacing a kill instruction with a new one.
LLVM_ABI void MarkVirtRegAliveInBlock(VarInfo &VRInfo, MachineBasicBlock *DefBlock, MachineBasicBlock *BB)
LLVM_ABI void removeVirtualRegistersKilled(MachineInstr &MI)
removeVirtualRegistersKilled - Remove all killed info for the specified instruction.
LLVM_ABI bool isLiveOut(Register Reg, const MachineBasicBlock &MBB)
isLiveOut - Determine if Reg is live out from MBB, when not considering PHI nodes.
LLVM_ABI void HandleVirtRegDef(Register reg, MachineInstr &MI)
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI void recomputeForSingleDefVirtReg(Register Reg)
Recompute liveness from scratch for a virtual register Reg that is known to have a single def that do...
LLVM_ABI void HandleVirtRegUse(Register reg, MachineBasicBlock *MBB, MachineInstr &MI)
LLVM_ABI VarInfo & getVarInfo(Register Reg)
getVarInfo - Return the VarInfo structure for the specified VIRTUAL register.
LLVM_ABI void addNewBlock(MachineBasicBlock *BB, MachineBasicBlock *DomBB, MachineBasicBlock *SuccBB)
addNewBlock - Add a new basic block BB between DomBB and SuccBB.
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
iterator_range< MCSubRegIterator > subregs_inclusive(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, including Reg.
iterator_range< MCSubRegIterator > subregs(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, excluding Reg.
iterator_range< livein_iterator > liveins() const
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
pred_reverse_iterator pred_rbegin()
pred_reverse_iterator pred_rend()
pred_iterator pred_begin()
iterator_range< succ_iterator > successors()
iterator_range< pred_iterator > predecessors()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
const MachineBasicBlock & front() const
Representation of each machine instruction.
const MachineBasicBlock * getParent() const
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
LLVM_ABI bool addRegisterKilled(Register IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI kills a register.
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
LLVM_ABI bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
MachineOperand class - Representation of each machine instruction operand.
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
void setIsDead(bool Val=true)
void setIsKill(bool Val=true)
void setIsEarlyClobber(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
iterator_range< use_nodbg_iterator > use_nodbg_operands(Register Reg) const
bool isReserved(MCRegister PhysReg) const
isReserved - Returns true when PhysReg is a reserved register.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVM_ABI MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
bool test(unsigned Idx) const
virtual unsigned getNumSupportedRegs(const MachineFunction &) const
Return the number of registers for the function. (may overestimate)
bool isInAllocatableClass(MCRegister RegNo) const
Return true if the register is in the allocation of any register class.
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
A Use represents the edge between a Value definition and its users.
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
This class implements an extremely fast bulk output stream that can only output to a stream.
Reg
All possible values of the reg field in the ModR/M byte.
NodeAddr< DefNode * > Def
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< df_ext_iterator< T, SetTy > > depth_first_ext(const T &G, SetTy &S)
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto reverse(ContainerTy &&C)
LLVM_ABI char & UnreachableMachineBlockElimID
UnreachableMachineBlockElimination - This pass removes unreachable machine basic blocks.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI char & LiveVariablesID
LiveVariables pass - This pass computes the set of blocks in which each variable is life and sets mac...
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
A special type used by analysis passes to provide an address that identifies that particular analysis...
VarInfo - This represents the regions where a virtual register is live in the program.
bool removeKill(MachineInstr &MI)
removeKill - Delete a kill corresponding to the specified machine instruction.
LLVM_ABI void dump() const
std::vector< MachineInstr * > Kills
Kills - List of MachineInstruction's which are the last use of this virtual register (kill it) in the...
SparseBitVector AliveBlocks
AliveBlocks - Set of blocks in which this value is alive completely through.
LLVM_ABI MachineInstr * findKill(const MachineBasicBlock *MBB) const
findKill - Find a kill instruction in MBB. Return NULL if none is found.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI bool isLiveIn(const MachineBasicBlock &MBB, Register Reg, MachineRegisterInfo &MRI)
isLiveIn - Is Reg live in to MBB? This means that Reg is live through MBB, or it is killed in MBB.
VirtRegInfo - Information about a virtual register used by a set of operands.