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()) {
79 for (
size_t I = 0, E = VirtRegInfo.size();
I != E; ++
I) {
81 OS <<
"Virtual register '%" <<
I <<
"':\n";
82 VirtRegInfo[Reg].print(OS);
89 if (
MI->getParent() ==
MBB)
95 OS <<
" Alive in blocks: ";
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!");
115 VirtRegInfo.grow(Reg);
116 return VirtRegInfo[Reg];
122 unsigned BBNum =
MBB->getNumber();
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()) {
158 assert(MRI->getVRegDef(Reg) &&
"Register use before def!");
160 unsigned BBNum =
MBB->getNumber();
165 if (!VRInfo.
Kills.empty() && VRInfo.
Kills.back()->getParent() ==
MBB) {
174 assert(Kill->getParent() !=
MBB &&
"entry should be at end!");
193 if (
MBB == MRI->getVRegDef(Reg)->getParent())
217 unsigned LastDefDist = 0;
223 unsigned Dist = DistanceMap[Def];
224 if (Dist > LastDefDist) {
239void LiveVariables::HandlePhysRegUse(
Register Reg, MachineInstr &
MI) {
240 MachineInstr *LastDef = PhysRegDef[
Reg.
id()];
242 if (!LastDef && !PhysRegUse[
Reg.
id()]) {
251 MachineInstr *LastPartialDef = FindLastPartialDef(
Reg);
253 if (LastPartialDef) {
257 }
else if (LastDef && !PhysRegUse[
Reg.
id()] &&
270MachineInstr *LiveVariables::FindLastRefOrPartRef(
Register Reg) {
271 MachineInstr *LastDef = PhysRegDef[
Reg.
id()];
272 MachineInstr *LastUse = 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;
287 }
else if (MachineInstr *Use = PhysRegUse[
SubReg]) {
288 unsigned Dist = DistanceMap[
Use];
289 if (Dist > LastRefOrPartRefDist) {
290 LastRefOrPartRefDist = Dist;
291 LastRefOrPartRef =
Use;
296 return LastRefOrPartRef;
299bool LiveVariables::HandlePhysRegKill(
Register Reg, MachineInstr *
MI) {
300 MachineInstr *LastDef = PhysRegDef[
Reg.
id()];
301 MachineInstr *LastUse = PhysRegUse[
Reg.
id()];
302 if (!LastDef && !LastUse)
305 MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
306 unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
324 MachineInstr *LastPartDef =
nullptr;
325 unsigned LastPartDefDist = 0;
326 SmallSet<unsigned, 8> PartUses;
329 if (Def && Def != LastDef) {
332 unsigned Dist = DistanceMap[
Def];
333 if (Dist > LastPartDefDist) {
334 LastPartDefDist = Dist;
339 if (MachineInstr *Use = PhysRegUse[
SubReg]) {
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);
360 MachineOperand *MO = PhysRegDef[
Reg.
id()]->findRegisterDefOperand(
368 PhysRegDef[
Reg.
id()]->addOperand(
370 MachineInstr *LastSubRef = FindLastRefOrPartRef(
SubReg);
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);
429void LiveVariables::HandlePhysRegDef(
Register Reg, MachineInstr *
MI,
430 SmallVectorImpl<Register> &Defs) {
432 SmallSet<unsigned, 32> Live;
433 if (PhysRegDef[
Reg.
id()] || PhysRegUse[
Reg.
id()]) {
452 HandlePhysRegKill(
Reg,
MI);
465void LiveVariables::UpdatePhysRegDefs(MachineInstr &
MI,
466 SmallVectorImpl<Register> &Defs) {
467 while (!Defs.
empty()) {
471 PhysRegUse[
SubReg] =
nullptr;
476void LiveVariables::runOnInstr(MachineInstr &
MI,
477 SmallVectorImpl<Register> &Defs,
481 unsigned NumOperandsToProcess =
MI.getNumOperands();
486 NumOperandsToProcess = 1;
492 for (
unsigned i = 0; i != NumOperandsToProcess; ++i) {
493 MachineOperand &MO =
MI.getOperand(i);
502 if (!(MOReg.
isPhysical() && MRI->isReserved(MOReg)))
510 if (MOReg.
isPhysical() && !MRI->isReserved(MOReg))
516 MachineBasicBlock *
MBB =
MI.getParent();
521 else if (!MRI->isReserved(MOReg))
522 HandlePhysRegUse(MOReg,
MI);
526 for (
unsigned Mask : RegMasks)
527 HandleRegMask(
MI.getOperand(Mask), NumRegs);
533 else if (!MRI->isReserved(MOReg))
534 HandlePhysRegDef(MOReg, &
MI, Defs);
536 UpdatePhysRegDefs(
MI, Defs);
539void LiveVariables::runOnBlock(MachineBasicBlock *
MBB,
unsigned NumRegs) {
543 assert(LI.PhysReg.isPhysical() &&
544 "Cannot have a live-in virtual register!");
545 HandlePhysRegDef(LI.PhysReg,
nullptr, Defs);
551 for (MachineInstr &
MI : *
MBB) {
552 if (
MI.isDebugOrPseudoInstr())
554 DistanceMap.insert(std::make_pair(&
MI, Dist++));
556 runOnInstr(
MI, Defs, NumRegs);
564 SmallVectorImpl<Register> &VarInfoVec = PHIVarInfo[
MBB->
getNumber()];
574 SmallSet<unsigned, 4> LiveOuts;
576 if (SuccMBB->isEHPad())
578 for (
const auto &LI : SuccMBB->liveins()) {
579 if (!TRI->isInAllocatableClass(LI.PhysReg))
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);
592void LiveVariables::analyze(MachineFunction &mf) {
595 TRI = MF->getSubtarget().getRegisterInfo();
597 const unsigned NumRegs = TRI->getNumSupportedRegs(mf);
598 PhysRegDef.assign(NumRegs,
nullptr);
599 PhysRegUse.assign(NumRegs,
nullptr);
600 PHIVarInfo.resize(MF->getNumBlockIDs());
614 MachineBasicBlock *
Entry = &MF->front();
615 df_iterator_default_set<MachineBasicBlock*,16> Visited;
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)
629 if (VirtRegInfo[
Reg].Kills[j] == MRI->getVRegDef(
Reg))
630 VirtRegInfo[
Reg].Kills[
j]->addRegisterDead(
Reg, TRI);
632 VirtRegInfo[
Reg].Kills[
j]->addRegisterKilled(
Reg, TRI);
639 for (
const MachineBasicBlock &
MBB : *MF)
652 VI.AliveBlocks.clear();
664 unsigned NumRealUses = 0;
665 for (
auto &UseMO : MRI->use_nodbg_operands(Reg)) {
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());
774 unsigned Num =
MBB.getNumber();
782 if (Def && Def->getParent() == &
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())
845 for (
unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
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())
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
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
Promote Memory to Register
#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.
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.
Implements a dense probed hash-table based set.
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LiveVariablesWrapperPass()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
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< livein_iterator > liveins() const
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
pred_iterator pred_begin()
iterator_range< succ_iterator > successors()
MachineInstrBundleIterator< MachineInstr > iterator
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
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,...
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 unsigned id() const
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.
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
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.
NodeAddr< DefNode * > Def
NodeAddr< UseNode * > Use
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)
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
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.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
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?