class GVNPass
Declaration
class GVNPass : public PassInfoMixin { /* full declaration omitted */ };
Description
The core GVN pass object. FIXME: We should have a good summary of the GVN algorithm implemented by this particular pass here.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:116
Inherits from: PassInfoMixin
Member Variables
- private llvm::GVNOptions Options
- private llvm::MemoryDependenceResults* MD = nullptr
- private llvm::DominatorTree* DT = nullptr
- private const llvm::TargetLibraryInfo* TLI = nullptr
- private llvm::AssumptionCache* AC = nullptr
- private SetVector<llvm::BasicBlock*> DeadBlocks
- private llvm::OptimizationRemarkEmitter* ORE = nullptr
- private llvm::ImplicitControlFlowTracking* ICF = nullptr
- private llvm::LoopInfo* LI = nullptr
- private llvm::MemorySSAUpdater* MSSAU = nullptr
- private llvm::GVNPass::ValueTable VN
- private DenseMap<uint32_t, llvm::GVNPass::LeaderTableEntry> LeaderTable
- private llvm::BumpPtrAllocator TableAllocator
- private SmallMapVector<llvm::Value*, llvm::Value*, 4> ReplaceOperandsWithMap
- private SmallVector<llvm::Instruction*, 8> InstrsToErase
- private DenseMap<AssertingVH<llvm::BasicBlock>, uint32_t> BlockRPONumber
- private bool InvalidBlockRPONumbers = true
- private SmallVector<std::pair<Instruction*, unsigned int>, 4> toSplit
Method Overview
- private void AnalyzeLoadAvailability(llvm::LoadInst * Load, llvm::GVNPass::LoadDepVect & Deps, llvm::GVNPass::AvailValInBlkVect & ValuesPerBlock, llvm::GVNPass::UnavailBlkVect & UnavailableBlocks)
- private bool AnalyzeLoadAvailability(llvm::LoadInst * Load, llvm::MemDepResult DepInfo, llvm::Value * Address, gvn::AvailableValue & Res)
- public GVNPass(llvm::GVNOptions Options = {})
- private bool PerformLoadPRE(llvm::LoadInst * Load, llvm::GVNPass::AvailValInBlkVect & ValuesPerBlock, llvm::GVNPass::UnavailBlkVect & UnavailableBlocks)
- private void addDeadBlock(llvm::BasicBlock * BB)
- private void addToLeaderTable(uint32_t N, llvm::Value * V, const llvm::BasicBlock * BB)
- private void assignBlockRPONumber(llvm::Function & F)
- private void assignValNumForDeadCode()
- private void cleanupGlobalSets()
- private void dump(DenseMap<uint32_t, llvm::Value *> & d) const
- private void eliminatePartiallyRedundantLoad(llvm::LoadInst * Load, llvm::GVNPass::AvailValInBlkVect & ValuesPerBlock, MapVector<llvm::BasicBlock *, llvm::Value *> & AvailableLoads)
- private llvm::Value * findLeader(const llvm::BasicBlock * BB, uint32_t num)
- public llvm::AAResults * getAliasAnalysis() const
- public llvm::DominatorTree & getDominatorTree() const
- public llvm::MemoryDependenceResults & getMemDep() const
- public bool isLoadInLoopPREEnabled() const
- public bool isLoadPREEnabled() const
- public bool isLoadPRESplitBackedgeEnabled() const
- public bool isMemDepEnabled() const
- public bool isPREEnabled() const
- private bool iterateOnFunction(llvm::Function & F)
- public void markInstructionForDeletion(llvm::Instruction * I)
- private bool performLoopLoadPRE(llvm::LoadInst * Load, llvm::GVNPass::AvailValInBlkVect & ValuesPerBlock, llvm::GVNPass::UnavailBlkVect & UnavailableBlocks)
- private bool performPRE(llvm::Function & F)
- private bool performScalarPRE(llvm::Instruction * I)
- private bool performScalarPREInsertion(llvm::Instruction * Instr, llvm::BasicBlock * Pred, llvm::BasicBlock * Curr, unsigned int ValNo)
- public void printPipeline(llvm::raw_ostream & OS, function_ref<llvm::StringRef (llvm::StringRef)> MapClassName2PassName)
- private bool processAssumeIntrinsic(llvm::AssumeInst * II)
- private bool processBlock(llvm::BasicBlock * BB)
- private bool processFoldableCondBr(llvm::BranchInst * BI)
- private bool processInstruction(llvm::Instruction * I)
- private bool processLoad(llvm::LoadInst * L)
- private bool processNonLocalLoad(llvm::LoadInst * L)
- private bool propagateEquality(llvm::Value * LHS, llvm::Value * RHS, const llvm::BasicBlockEdge & Root, bool DominatesByEdge)
- private void removeFromLeaderTable(uint32_t N, llvm::Instruction * I, llvm::BasicBlock * BB)
- private bool replaceOperandsForInBlockEquality(llvm::Instruction * I) const
- public llvm::PreservedAnalyses run(llvm::Function & F, llvm::FunctionAnalysisManager & AM)
- private bool runImpl(llvm::Function & F, llvm::AssumptionCache & RunAC, llvm::DominatorTree & RunDT, const llvm::TargetLibraryInfo & RunTLI, llvm::AAResults & RunAA, llvm::MemoryDependenceResults * RunMD, llvm::LoopInfo * LI, llvm::OptimizationRemarkEmitter * ORE, llvm::MemorySSA * MSSA = nullptr)
- private bool splitCriticalEdges()
- private llvm::BasicBlock * splitCriticalEdges(llvm::BasicBlock * Pred, llvm::BasicBlock * Succ)
- private void verifyRemoved(const llvm::Instruction * I) const
Methods
¶void AnalyzeLoadAvailability(
llvm::LoadInst* Load,
llvm::GVNPass::LoadDepVect& Deps,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
void AnalyzeLoadAvailability(
llvm::LoadInst* Load,
llvm::GVNPass::LoadDepVect& Deps,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
Description
Given a list of non-local dependencies, determine if a value is available for the load in each specified block. If it is, add it to ValuesPerBlock. If not, add it to UnavailableBlocks.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:328
Parameters
- llvm::LoadInst* Load
- llvm::GVNPass::LoadDepVect& Deps
- llvm::GVNPass::AvailValInBlkVect& ValuesPerBlock
- llvm::GVNPass::UnavailBlkVect& UnavailableBlocks
¶bool AnalyzeLoadAvailability(
llvm::LoadInst* Load,
llvm::MemDepResult DepInfo,
llvm::Value* Address,
gvn::AvailableValue& Res)
bool AnalyzeLoadAvailability(
llvm::LoadInst* Load,
llvm::MemDepResult DepInfo,
llvm::Value* Address,
gvn::AvailableValue& Res)
Description
Given a local dependency (Def or Clobber) determine if a value is available for the load. Returns true if an value is known to be available and populates Res. Returns false otherwise.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:322
Parameters
- llvm::LoadInst* Load
- llvm::MemDepResult DepInfo
- llvm::Value* Address
- gvn::AvailableValue& Res
¶GVNPass(llvm::GVNOptions Options = {})
GVNPass(llvm::GVNOptions Options = {})
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:122
Parameters
- llvm::GVNOptions Options = {}
¶bool PerformLoadPRE(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
bool PerformLoadPRE(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:332
Parameters
- llvm::LoadInst* Load
- llvm::GVNPass::AvailValInBlkVect& ValuesPerBlock
- llvm::GVNPass::UnavailBlkVect& UnavailableBlocks
¶void addDeadBlock(llvm::BasicBlock* BB)
void addDeadBlock(llvm::BasicBlock* BB)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:365
Parameters
- llvm::BasicBlock* BB
¶void addToLeaderTable(uint32_t N,
llvm::Value* V,
const llvm::BasicBlock* BB)
void addToLeaderTable(uint32_t N,
llvm::Value* V,
const llvm::BasicBlock* BB)
Description
Push a new Value to the LeaderTable onto the list for its value number.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:267
Parameters
- uint32_t N
- llvm::Value* V
- const llvm::BasicBlock* BB
¶void assignBlockRPONumber(llvm::Function& F)
void assignBlockRPONumber(llvm::Function& F)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:367
Parameters
¶void assignValNumForDeadCode()
void assignValNumForDeadCode()
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:366
¶void cleanupGlobalSets()
void cleanupGlobalSets()
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:357
¶void dump(
DenseMap<uint32_t, llvm::Value*>& d) const
void dump(
DenseMap<uint32_t, llvm::Value*>& d) const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:350
Parameters
- DenseMap<uint32_t, llvm::Value*>& d
¶void eliminatePartiallyRedundantLoad(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
MapVector<llvm::BasicBlock*, llvm::Value*>&
AvailableLoads)
void eliminatePartiallyRedundantLoad(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
MapVector<llvm::BasicBlock*, llvm::Value*>&
AvailableLoads)
Description
Eliminates partially redundant \p Load, replacing it with \p AvailableLoads (connected by Phis if needed).
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:343
Parameters
- llvm::LoadInst* Load
- llvm::GVNPass::AvailValInBlkVect& ValuesPerBlock
- MapVector<llvm::BasicBlock*, llvm::Value*>& AvailableLoads
¶llvm::Value* findLeader(
const llvm::BasicBlock* BB,
uint32_t num)
llvm::Value* findLeader(
const llvm::BasicBlock* BB,
uint32_t num)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:356
Parameters
- const llvm::BasicBlock* BB
- uint32_t num
¶llvm::AAResults* getAliasAnalysis() const
llvm::AAResults* getAliasAnalysis() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:138
¶llvm::DominatorTree& getDominatorTree() const
llvm::DominatorTree& getDominatorTree() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:137
¶llvm::MemoryDependenceResults& getMemDep() const
llvm::MemoryDependenceResults& getMemDep() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:139
¶bool isLoadInLoopPREEnabled() const
bool isLoadInLoopPREEnabled() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:143
¶bool isLoadPREEnabled() const
bool isLoadPREEnabled() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:142
¶bool isLoadPRESplitBackedgeEnabled() const
bool isLoadPRESplitBackedgeEnabled() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:144
¶bool isMemDepEnabled() const
bool isMemDepEnabled() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:145
¶bool isPREEnabled() const
bool isPREEnabled() const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:141
¶bool iterateOnFunction(llvm::Function& F)
bool iterateOnFunction(llvm::Function& F)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:351
Parameters
¶void markInstructionForDeletion(
llvm::Instruction* I)
void markInstructionForDeletion(
llvm::Instruction* I)
Description
This removes the specified instruction from our various maps and marks it for deletion.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:132
Parameters
¶bool performLoopLoadPRE(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
bool performLoopLoadPRE(
llvm::LoadInst* Load,
llvm::GVNPass::AvailValInBlkVect&
ValuesPerBlock,
llvm::GVNPass::UnavailBlkVect&
UnavailableBlocks)
Description
Try to replace a load which executes on each loop iteraiton with Phi translation of load in preheader and load(s) in conditionally executed paths.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:338
Parameters
- llvm::LoadInst* Load
- llvm::GVNPass::AvailValInBlkVect& ValuesPerBlock
- llvm::GVNPass::UnavailBlkVect& UnavailableBlocks
¶bool performPRE(llvm::Function& F)
bool performPRE(llvm::Function& F)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:352
Parameters
¶bool performScalarPRE(llvm::Instruction* I)
bool performScalarPRE(llvm::Instruction* I)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:353
Parameters
¶bool performScalarPREInsertion(
llvm::Instruction* Instr,
llvm::BasicBlock* Pred,
llvm::BasicBlock* Curr,
unsigned int ValNo)
bool performScalarPREInsertion(
llvm::Instruction* Instr,
llvm::BasicBlock* Pred,
llvm::BasicBlock* Curr,
unsigned int ValNo)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:354
Parameters
- llvm::Instruction* Instr
- llvm::BasicBlock* Pred
- llvm::BasicBlock* Curr
- unsigned int ValNo
¶void printPipeline(
llvm::raw_ostream& OS,
function_ref<llvm::StringRef(llvm::StringRef)>
MapClassName2PassName)
void printPipeline(
llvm::raw_ostream& OS,
function_ref<llvm::StringRef(llvm::StringRef)>
MapClassName2PassName)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:127
Parameters
- llvm::raw_ostream& OS
- function_ref<llvm::StringRef(llvm::StringRef)> MapClassName2PassName
¶bool processAssumeIntrinsic(llvm::AssumeInst* II)
bool processAssumeIntrinsic(llvm::AssumeInst* II)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:317
Parameters
- llvm::AssumeInst* II
¶bool processBlock(llvm::BasicBlock* BB)
bool processBlock(llvm::BasicBlock* BB)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:349
Parameters
- llvm::BasicBlock* BB
¶bool processFoldableCondBr(llvm::BranchInst* BI)
bool processFoldableCondBr(llvm::BranchInst* BI)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:364
Parameters
- llvm::BranchInst* BI
¶bool processInstruction(llvm::Instruction* I)
bool processInstruction(llvm::Instruction* I)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:348
Parameters
¶bool processLoad(llvm::LoadInst* L)
bool processLoad(llvm::LoadInst* L)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:315
Parameters
¶bool processNonLocalLoad(llvm::LoadInst* L)
bool processNonLocalLoad(llvm::LoadInst* L)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:316
Parameters
¶bool propagateEquality(
llvm::Value* LHS,
llvm::Value* RHS,
const llvm::BasicBlockEdge& Root,
bool DominatesByEdge)
bool propagateEquality(
llvm::Value* LHS,
llvm::Value* RHS,
const llvm::BasicBlockEdge& Root,
bool DominatesByEdge)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:362
Parameters
- llvm::Value* LHS
- llvm::Value* RHS
- const llvm::BasicBlockEdge& Root
- bool DominatesByEdge
¶void removeFromLeaderTable(uint32_t N,
llvm::Instruction* I,
llvm::BasicBlock* BB)
void removeFromLeaderTable(uint32_t N,
llvm::Instruction* I,
llvm::BasicBlock* BB)
Description
Scan the list of values corresponding to a given value number, and remove the given instruction if encountered.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:284
Parameters
- uint32_t N
- llvm::Instruction* I
- llvm::BasicBlock* BB
¶bool replaceOperandsForInBlockEquality(
llvm::Instruction* I) const
bool replaceOperandsForInBlockEquality(
llvm::Instruction* I) const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:361
Parameters
¶llvm::PreservedAnalyses run(
llvm::Function& F,
llvm::FunctionAnalysisManager& AM)
llvm::PreservedAnalyses run(
llvm::Function& F,
llvm::FunctionAnalysisManager& AM)
Description
Run the pass over the function.
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:125
Parameters
¶bool runImpl(
llvm::Function& F,
llvm::AssumptionCache& RunAC,
llvm::DominatorTree& RunDT,
const llvm::TargetLibraryInfo& RunTLI,
llvm::AAResults& RunAA,
llvm::MemoryDependenceResults* RunMD,
llvm::LoopInfo* LI,
llvm::OptimizationRemarkEmitter* ORE,
llvm::MemorySSA* MSSA = nullptr)
bool runImpl(
llvm::Function& F,
llvm::AssumptionCache& RunAC,
llvm::DominatorTree& RunDT,
const llvm::TargetLibraryInfo& RunTLI,
llvm::AAResults& RunAA,
llvm::MemoryDependenceResults* RunMD,
llvm::LoopInfo* LI,
llvm::OptimizationRemarkEmitter* ORE,
llvm::MemorySSA* MSSA = nullptr)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:261
Parameters
- llvm::Function& F
- llvm::AssumptionCache& RunAC
- llvm::DominatorTree& RunDT
- const llvm::TargetLibraryInfo& RunTLI
- llvm::AAResults& RunAA
- llvm::MemoryDependenceResults* RunMD
- llvm::LoopInfo* LI
- llvm::OptimizationRemarkEmitter* ORE
- llvm::MemorySSA* MSSA = nullptr
¶bool splitCriticalEdges()
bool splitCriticalEdges()
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:359
¶llvm::BasicBlock* splitCriticalEdges(
llvm::BasicBlock* Pred,
llvm::BasicBlock* Succ)
llvm::BasicBlock* splitCriticalEdges(
llvm::BasicBlock* Pred,
llvm::BasicBlock* Succ)
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:360
Parameters
- llvm::BasicBlock* Pred
- llvm::BasicBlock* Succ
¶void verifyRemoved(
const llvm::Instruction* I) const
void verifyRemoved(
const llvm::Instruction* I) const
Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:358
Parameters
- const llvm::Instruction* I