LLVM 22.0.0git
llvm::ReachingDefAnalysis Class Reference

This class provides the reaching def analysis. More...

#include "llvm/CodeGen/ReachingDefAnalysis.h"

Inheritance diagram for llvm::ReachingDefAnalysis:
[legend]

Public Member Functions

 ReachingDefAnalysis ()
void releaseMemory () override
 releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memory when it is no longer needed.
void getAnalysisUsage (AnalysisUsage &AU) const override
 getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
void printAllReachingDefs (MachineFunction &MF)
bool runOnMachineFunction (MachineFunction &MF) override
 runOnMachineFunction - This method must be overloaded to perform the desired machine code transformation or analysis.
MachineFunctionProperties getRequiredProperties () const override
void reset ()
 Re-run the analysis.
void init ()
 Initialize data structures.
void traverse ()
 Traverse the machine function, mapping definitions.
int getReachingDef (MachineInstr *MI, Register Reg) const
 Provides the instruction id of the closest reaching def instruction of Reg that reaches MI, relative to the begining of MI's basic block.
bool hasSameReachingDef (MachineInstr *A, MachineInstr *B, Register Reg) const
 Return whether A and B use the same def of Reg.
bool isReachingDefLiveOut (MachineInstr *MI, Register Reg) const
 Return whether the reaching def for MI also is live out of its parent block.
MachineInstrgetLocalLiveOutMIDef (MachineBasicBlock *MBB, Register Reg) const
 Return the local MI that produces the live out value for Reg, or nullptr for a non-live out or non-local def.
MachineInstrgetUniqueReachingMIDef (MachineInstr *MI, Register Reg) const
 If a single MachineInstr creates the reaching definition, then return it.
MachineInstrgetMIOperand (MachineInstr *MI, unsigned Idx) const
 If a single MachineInstr creates the reaching definition, for MIs operand at Idx, then return it.
MachineInstrgetMIOperand (MachineInstr *MI, MachineOperand &MO) const
 If a single MachineInstr creates the reaching definition, for MIs MO, then return it.
bool hasLocalDefBefore (MachineInstr *MI, Register Reg) const
 Provide whether the register has been defined in the same basic block as, and before, MI.
bool isRegUsedAfter (MachineInstr *MI, Register Reg) const
 Return whether the given register is used after MI, whether it's a local use or a live out.
bool isRegDefinedAfter (MachineInstr *MI, Register Reg) const
 Return whether the given register is defined after MI.
int getClearance (MachineInstr *MI, Register Reg) const
 Provides the clearance - the number of instructions since the closest reaching def instuction of Reg that reaches MI.
void getReachingLocalUses (MachineInstr *MI, Register Reg, InstSet &Uses) const
 Provides the uses, in the same block as MI, of register that MI defines.
void getLiveOuts (MachineBasicBlock *MBB, Register Reg, InstSet &Defs, BlockSet &VisitedBBs) const
 Search MBB for a definition of Reg and insert it into Defs.
void getLiveOuts (MachineBasicBlock *MBB, Register Reg, InstSet &Defs) const
bool getLiveInUses (MachineBasicBlock *MBB, Register Reg, InstSet &Uses) const
 For the given block, collect the instructions that use the live-in value of the provided register.
void getGlobalUses (MachineInstr *MI, Register Reg, InstSet &Uses) const
 Collect the users of the value stored in Reg, which is defined by MI.
void getGlobalReachingDefs (MachineInstr *MI, Register Reg, InstSet &Defs) const
 Collect all possible definitions of the value stored in Reg, which is used by MI.
bool isSafeToMoveForwards (MachineInstr *From, MachineInstr *To) const
 Return whether From can be moved forwards to just before To.
bool isSafeToMoveBackwards (MachineInstr *From, MachineInstr *To) const
 Return whether From can be moved backwards to just after To.
void collectKilledOperands (MachineInstr *MI, InstSet &Dead) const
 Assuming MI is dead, recursively search the incoming operands which are killed by MI and collect those that would become dead.
bool isSafeToRemove (MachineInstr *MI, InstSet &ToRemove) const
 Return whether removing this instruction will have no effect on the program, returning the redundant use-def chain.
bool isSafeToRemove (MachineInstr *MI, InstSet &ToRemove, InstSet &Ignore) const
 Return whether removing this instruction will have no effect on the program, ignoring the possible effects on some instructions, returning the redundant use-def chain.
bool isSafeToDefRegAt (MachineInstr *MI, Register Reg) const
 Return whether a MachineInstr could be inserted at MI and safely define the given register without affecting the program.
bool isSafeToDefRegAt (MachineInstr *MI, Register Reg, InstSet &Ignore) const
 Return whether a MachineInstr could be inserted at MI and safely define the given register without affecting the program, ignoring any effects on the provided instructions.
Public Member Functions inherited from llvm::MachineFunctionPass
bool doInitialization (Module &) override
 doInitialization - Virtual method overridden by subclasses to do any necessary initialization before any pass is run.
Public Member Functions inherited from llvm::FunctionPass
 FunctionPass (char &pid)
void assignPassManager (PMStack &PMS, PassManagerType T) override
 Find appropriate Function Pass Manager or Call Graph Pass Manager in the PM Stack and add self into that manager.
PassManagerType getPotentialPassManagerType () const override
 Return what kind of Pass Manager can manage this pass.
Public Member Functions inherited from llvm::Pass
 Pass (PassKind K, char &pid)
 Pass (const Pass &)=delete
Passoperator= (const Pass &)=delete
virtual ~Pass ()
PassKind getPassKind () const
virtual StringRef getPassName () const
 getPassName - Return a nice clean name for a pass.
StringRef getPassArgument () const
 Return a nice clean name for a pass corresponding to that used to enable the pass in opt.
AnalysisID getPassID () const
 getPassID - Return the PassID number that corresponds to this pass.
virtual bool doFinalization (Module &)
 doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes have run.
virtual void print (raw_ostream &OS, const Module *M) const
 print - Print out the internal state of the pass.
void dump () const
virtual void preparePassManager (PMStack &)
 Check if available pass managers are suitable for this pass or not.
void setResolver (AnalysisResolver *AR)
AnalysisResolvergetResolver () const
virtual ImmutablePassgetAsImmutablePass ()
virtual PMDataManagergetAsPMDataManager ()
virtual void verifyAnalysis () const
 verifyAnalysis() - This member can be implemented by a analysis pass to check state of analysis information.
virtual void dumpPassStructure (unsigned Offset=0)
template<typename AnalysisType>
AnalysisType * getAnalysisIfAvailable () const
 getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information that might be around, for example to update it.
bool mustPreserveAnalysisID (char &AID) const
 mustPreserveAnalysisID - This method serves the same function as getAnalysisIfAvailable, but works if you just have an AnalysisID.
template<typename AnalysisType>
AnalysisType & getAnalysis () const
 getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information that they claim to use by overriding the getAnalysisUsage function.
template<typename AnalysisType>
AnalysisType & getAnalysis (Function &F, bool *Changed=nullptr)
 getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information that they claim to use by overriding the getAnalysisUsage function.
template<typename AnalysisType>
AnalysisType & getAnalysisID (AnalysisID PI) const
template<typename AnalysisType>
AnalysisType & getAnalysisID (AnalysisID PI, Function &F, bool *Changed=nullptr)

Static Public Attributes

static char ID = 0

Additional Inherited Members

Static Public Member Functions inherited from llvm::Pass
static const PassInfolookupPassInfo (const void *TI)
static const PassInfolookupPassInfo (StringRef Arg)
static PasscreatePass (AnalysisID ID)
Protected Member Functions inherited from llvm::MachineFunctionPass
 MachineFunctionPass (char &ID)
virtual MachineFunctionProperties getSetProperties () const
virtual MachineFunctionProperties getClearedProperties () const
Protected Member Functions inherited from llvm::FunctionPass
bool skipFunction (const Function &F) const
 Optional passes call this function to check whether the pass should be skipped.

Detailed Description

This class provides the reaching def analysis.

Definition at line 113 of file ReachingDefAnalysis.h.

Constructor & Destructor Documentation

◆ ReachingDefAnalysis()

llvm::ReachingDefAnalysis::ReachingDefAnalysis ( )
inline

Member Function Documentation

◆ collectKilledOperands()

void ReachingDefAnalysis::collectKilledOperands ( MachineInstr * MI,
InstSet & Dead ) const

Assuming MI is dead, recursively search the incoming operands which are killed by MI and collect those that would become dead.

Definition at line 736 of file ReachingDefAnalysis.cpp.

References collectKilledOperands(), getGlobalUses(), getMIOperand(), IsDead, isValidRegDef(), isValidRegUse(), mayHaveSideEffects(), MI, llvm::set_is_subset(), and Uses.

Referenced by collectKilledOperands().

◆ getAnalysisUsage()

void llvm::ReachingDefAnalysis::getAnalysisUsage ( AnalysisUsage & AU) const
inlineoverridevirtual

getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.

For MachineFunctionPasses, calling AU.preservesCFG() indicates that the pass does not modify the MachineBasicBlock CFG.

Reimplemented from llvm::MachineFunctionPass.

Definition at line 166 of file ReachingDefAnalysis.h.

References llvm::MachineFunctionPass::getAnalysisUsage(), and llvm::AnalysisUsage::setPreservesAll().

◆ getClearance()

int ReachingDefAnalysis::getClearance ( MachineInstr * MI,
Register Reg ) const

Provides the clearance - the number of instructions since the closest reaching def instuction of Reg that reaches MI.

Definition at line 407 of file ReachingDefAnalysis.cpp.

References assert(), getReachingDef(), and MI.

◆ getGlobalReachingDefs()

void ReachingDefAnalysis::getGlobalReachingDefs ( MachineInstr * MI,
Register Reg,
InstSet & Defs ) const

Collect all possible definitions of the value stored in Reg, which is used by MI.

Definition at line 484 of file ReachingDefAnalysis.cpp.

References getLiveOuts(), getUniqueReachingMIDef(), llvm::SmallPtrSetImpl< PtrType >::insert(), MBB, and MI.

Referenced by printAllReachingDefs().

◆ getGlobalUses()

◆ getLiveInUses()

bool ReachingDefAnalysis::getLiveInUses ( MachineBasicBlock * MBB,
Register Reg,
InstSet & Uses ) const

For the given block, collect the instructions that use the live-in value of the provided register.

Return whether the value is still live on exit.

Definition at line 441 of file ReachingDefAnalysis.cpp.

References getReachingDef(), llvm::instructionsWithoutDebug(), isReachingDefLiveOut(), isValidRegUseOf(), llvm::Last, MBB, MI, and Uses.

Referenced by getGlobalUses().

◆ getLiveOuts() [1/2]

void ReachingDefAnalysis::getLiveOuts ( MachineBasicBlock * MBB,
Register Reg,
InstSet & Defs ) const

Definition at line 495 of file ReachingDefAnalysis.cpp.

References getLiveOuts(), and MBB.

◆ getLiveOuts() [2/2]

void ReachingDefAnalysis::getLiveOuts ( MachineBasicBlock * MBB,
Register Reg,
InstSet & Defs,
BlockSet & VisitedBBs ) const

Search MBB for a definition of Reg and insert it into Defs.

If no definition is found, recursively search the predecessor blocks for them.

Definition at line 501 of file ReachingDefAnalysis.cpp.

References llvm::SmallPtrSetImpl< PtrType >::count(), getLiveOuts(), getLocalLiveOutMIDef(), llvm::SmallPtrSetImpl< PtrType >::insert(), and MBB.

Referenced by getGlobalReachingDefs(), getLiveOuts(), getLiveOuts(), and getUniqueReachingMIDef().

◆ getLocalLiveOutMIDef()

MachineInstr * ReachingDefAnalysis::getLocalLiveOutMIDef ( MachineBasicBlock * MBB,
Register Reg ) const

Return the local MI that produces the live out value for Reg, or nullptr for a non-live out or non-local def.

Definition at line 607 of file ReachingDefAnalysis.cpp.

References getReachingDef(), isFIDef(), isValidRegDefOf(), llvm::Last, and MBB.

Referenced by getGlobalUses(), getLiveOuts(), and isRegDefinedAfter().

◆ getMIOperand() [1/2]

MachineInstr * ReachingDefAnalysis::getMIOperand ( MachineInstr * MI,
MachineOperand & MO ) const

If a single MachineInstr creates the reaching definition, for MIs MO, then return it.

Otherwise return null.

Definition at line 546 of file ReachingDefAnalysis.cpp.

References assert(), llvm::MachineOperand::getReg(), getUniqueReachingMIDef(), llvm::MachineOperand::isReg(), and MI.

◆ getMIOperand() [2/2]

MachineInstr * ReachingDefAnalysis::getMIOperand ( MachineInstr * MI,
unsigned Idx ) const

If a single MachineInstr creates the reaching definition, for MIs operand at Idx, then return it.

Otherwise return null.

Definition at line 540 of file ReachingDefAnalysis.cpp.

References assert(), getUniqueReachingMIDef(), and MI.

Referenced by collectKilledOperands().

◆ getReachingDef()

int ReachingDefAnalysis::getReachingDef ( MachineInstr * MI,
Register Reg ) const

Provides the instruction id of the closest reaching def instruction of Reg that reaches MI, relative to the begining of MI's basic block.

Note that Reg may represent a stack slot.

Definition at line 334 of file ReachingDefAnalysis.cpp.

References assert(), Lookup(), and MI.

Referenced by getClearance(), getLiveInUses(), getLocalLiveOutMIDef(), hasLocalDefBefore(), hasSameReachingDef(), isReachingDefLiveOut(), and isRegDefinedAfter().

◆ getReachingLocalUses()

void ReachingDefAnalysis::getReachingLocalUses ( MachineInstr * MI,
Register Reg,
InstSet & Uses ) const

Provides the uses, in the same block as MI, of register that MI defines.

This does not consider live-outs.

Definition at line 417 of file ReachingDefAnalysis.cpp.

References isValidRegUseOf(), MBB, MI, and Uses.

Referenced by getGlobalUses().

◆ getRequiredProperties()

MachineFunctionProperties llvm::ReachingDefAnalysis::getRequiredProperties ( ) const
inlineoverridevirtual

Reimplemented from llvm::MachineFunctionPass.

Definition at line 174 of file ReachingDefAnalysis.h.

◆ getUniqueReachingMIDef()

MachineInstr * ReachingDefAnalysis::getUniqueReachingMIDef ( MachineInstr * MI,
Register Reg ) const

If a single MachineInstr creates the reaching definition, then return it.

Otherwise return null.

Definition at line 520 of file ReachingDefAnalysis.cpp.

References getLiveOuts(), MI, and llvm::MachineBasicBlock::predecessors().

Referenced by getGlobalReachingDefs(), getMIOperand(), and getMIOperand().

◆ hasLocalDefBefore()

bool ReachingDefAnalysis::hasLocalDefBefore ( MachineInstr * MI,
Register Reg ) const

Provide whether the register has been defined in the same basic block as, and before, MI.

Definition at line 412 of file ReachingDefAnalysis.cpp.

References getReachingDef(), and MI.

◆ hasSameReachingDef()

bool ReachingDefAnalysis::hasSameReachingDef ( MachineInstr * A,
MachineInstr * B,
Register Reg ) const

Return whether A and B use the same def of Reg.

Definition at line 377 of file ReachingDefAnalysis.cpp.

References A(), B(), and getReachingDef().

◆ init()

void ReachingDefAnalysis::init ( )

Initialize data structures.

Definition at line 304 of file ReachingDefAnalysis.cpp.

References llvm::LoopTraversal::traverse().

Referenced by reset(), and runOnMachineFunction().

◆ isReachingDefLiveOut()

bool ReachingDefAnalysis::isReachingDefLiveOut ( MachineInstr * MI,
Register Reg ) const

Return whether the reaching def for MI also is live out of its parent block.

Definition at line 586 of file ReachingDefAnalysis.cpp.

References getReachingDef(), isValidRegDefOf(), llvm::Last, MBB, and MI.

Referenced by getLiveInUses().

◆ isRegDefinedAfter()

bool ReachingDefAnalysis::isRegDefinedAfter ( MachineInstr * MI,
Register Reg ) const

Return whether the given register is defined after MI.

Definition at line 572 of file ReachingDefAnalysis.cpp.

References getLocalLiveOutMIDef(), getReachingDef(), llvm::Last, MBB, and MI.

Referenced by isSafeToDefRegAt().

◆ isRegUsedAfter()

bool ReachingDefAnalysis::isRegUsedAfter ( MachineInstr * MI,
Register Reg ) const

Return whether the given register is used after MI, whether it's a local use or a live out.

Definition at line 552 of file ReachingDefAnalysis.cpp.

References llvm::instructionsWithoutDebug(), llvm::Last, MBB, and MI.

Referenced by isSafeToDefRegAt().

◆ isSafeToDefRegAt() [1/2]

bool ReachingDefAnalysis::isSafeToDefRegAt ( MachineInstr * MI,
Register Reg ) const

Return whether a MachineInstr could be inserted at MI and safely define the given register without affecting the program.

Definition at line 768 of file ReachingDefAnalysis.cpp.

References Ignore, isSafeToDefRegAt(), and MI.

Referenced by isSafeToDefRegAt().

◆ isSafeToDefRegAt() [2/2]

bool ReachingDefAnalysis::isSafeToDefRegAt ( MachineInstr * MI,
Register Reg,
InstSet & Ignore ) const

Return whether a MachineInstr could be inserted at MI and safely define the given register without affecting the program, ignoring any effects on the provided instructions.

Definition at line 774 of file ReachingDefAnalysis.cpp.

References getGlobalUses(), I, Ignore, isRegDefinedAfter(), isRegUsedAfter(), isValidRegDefOf(), MBB, MI, llvm::set_is_subset(), and Uses.

◆ isSafeToMoveBackwards()

bool ReachingDefAnalysis::isSafeToMoveBackwards ( MachineInstr * From,
MachineInstr * To ) const

Return whether From can be moved backwards to just after To.

Definition at line 682 of file ReachingDefAnalysis.cpp.

References llvm::MachineInstr::getParent(), I, and llvm::MachineBasicBlock::rend().

◆ isSafeToMoveForwards()

bool ReachingDefAnalysis::isSafeToMoveForwards ( MachineInstr * From,
MachineInstr * To ) const

Return whether From can be moved forwards to just before To.

Definition at line 672 of file ReachingDefAnalysis.cpp.

References llvm::MachineBasicBlock::end(), llvm::MachineInstr::getParent(), and I.

◆ isSafeToRemove() [1/2]

bool ReachingDefAnalysis::isSafeToRemove ( MachineInstr * MI,
InstSet & ToRemove ) const

Return whether removing this instruction will have no effect on the program, returning the redundant use-def chain.

Definition at line 692 of file ReachingDefAnalysis.cpp.

References Ignore, isSafeToRemove(), MI, and ToRemove.

Referenced by isSafeToRemove(), and isSafeToRemove().

◆ isSafeToRemove() [2/2]

bool ReachingDefAnalysis::isSafeToRemove ( MachineInstr * MI,
InstSet & ToRemove,
InstSet & Ignore ) const

Return whether removing this instruction will have no effect on the program, ignoring the possible effects on some instructions, returning the redundant use-def chain.

Definition at line 700 of file ReachingDefAnalysis.cpp.

References Ignore, isSafeToRemove(), MI, and ToRemove.

◆ printAllReachingDefs()

◆ releaseMemory()

void ReachingDefAnalysis::releaseMemory ( )
overridevirtual

releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memory when it is no longer needed.

The default behavior of passes is to hold onto memory for the entire duration of their lifetime (which is the entire compile time). For pipelined passes, this is not a big deal because that memory gets recycled every time the pass is invoked on another program unit. For IP passes, it is more important to free memory when it is unused.

Optionally implement this function to release pass memory when it is no longer used.

Reimplemented from llvm::Pass.

Definition at line 289 of file ReachingDefAnalysis.cpp.

Referenced by reset().

◆ reset()

void ReachingDefAnalysis::reset ( )

Re-run the analysis.

Definition at line 298 of file ReachingDefAnalysis.cpp.

References init(), releaseMemory(), and traverse().

◆ runOnMachineFunction()

bool ReachingDefAnalysis::runOnMachineFunction ( MachineFunction & MF)
overridevirtual

runOnMachineFunction - This method must be overloaded to perform the desired machine code transformation or analysis.

Implements llvm::MachineFunctionPass.

Definition at line 276 of file ReachingDefAnalysis.cpp.

References llvm::dbgs(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), init(), LLVM_DEBUG, PrintAllReachingDefs, printAllReachingDefs(), and traverse().

◆ traverse()

void ReachingDefAnalysis::traverse ( )

Traverse the machine function, mapping definitions.

Definition at line 315 of file ReachingDefAnalysis.cpp.

References assert().

Referenced by reset(), and runOnMachineFunction().

Member Data Documentation

◆ ID

char ReachingDefAnalysis::ID = 0
static

Definition at line 159 of file ReachingDefAnalysis.h.

Referenced by ReachingDefAnalysis().


The documentation for this class was generated from the following files: