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

Methods

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)

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 = {})

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)

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)

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)

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)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:367

Parameters

llvm::Function& F

void assignValNumForDeadCode()

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:366

void cleanupGlobalSets()

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:357

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)

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)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:356

Parameters

const llvm::BasicBlock* BB
uint32_t num

llvm::AAResults* getAliasAnalysis() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:138

llvm::DominatorTree& getDominatorTree() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:137

llvm::MemoryDependenceResults& getMemDep() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:139

bool isLoadInLoopPREEnabled() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:143

bool isLoadPREEnabled() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:142

bool isLoadPRESplitBackedgeEnabled() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:144

bool isMemDepEnabled() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:145

bool isPREEnabled() const

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:141

bool iterateOnFunction(llvm::Function& F)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:351

Parameters

llvm::Function& F

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

llvm::Instruction* I

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)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:352

Parameters

llvm::Function& F

bool performScalarPRE(llvm::Instruction* I)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:353

Parameters

llvm::Instruction* I

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)

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)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:317

Parameters

llvm::AssumeInst* II

bool processBlock(llvm::BasicBlock* BB)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:349

Parameters

llvm::BasicBlock* BB

bool processFoldableCondBr(llvm::BranchInst* BI)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:364

Parameters

llvm::BranchInst* BI

bool processInstruction(llvm::Instruction* I)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:348

Parameters

llvm::Instruction* I

bool processLoad(llvm::LoadInst* L)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:315

Parameters

llvm::LoadInst* L

bool processNonLocalLoad(llvm::LoadInst* L)

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:316

Parameters

llvm::LoadInst* L

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)

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

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:361

Parameters

llvm::Instruction* I

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

llvm::Function& F
llvm::FunctionAnalysisManager& AM

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()

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:359

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

Declared at: llvm/include/llvm/Transforms/Scalar/GVN.h:358

Parameters

const llvm::Instruction* I