LLVM: lib/Transforms/Scalar/GVN.cpp File Reference (original) (raw)

Go to the source code of this file.

Classes
struct llvm::GVNPass::Expression
struct llvm::DenseMapInfo< GVNPass::Expression >
struct llvm::gvn::AvailableValue
Represents a particular available value that we know how to materialize. More...
struct llvm::gvn::AvailableValueInBlock
Represents an AvailableValue which can be rematerialized at the end of the associated BasicBlock. More...
class llvm::gvn::GVNLegacyPass
Macros
#define DEBUG_TYPE "gvn"
Enumerations
enum class AvailabilityState : char { Unavailable = 0 , Available = 1 , SpeculativelyAvailable = 2 }
Functions
STATISTIC (NumGVNInstr, "Number of instructions deleted")
STATISTIC (NumGVNLoad, "Number of loads deleted")
STATISTIC (NumGVNPRE, "Number of instructions PRE'd")
STATISTIC (NumGVNBlocks, "Number of blocks merged")
STATISTIC (NumGVNSimpl, "Number of instructions simplified")
STATISTIC (NumGVNEqProp, "Number of equalities propagated")
STATISTIC (NumPRELoad, "Number of loads PRE'd")
STATISTIC (NumPRELoopLoad, "Number of loop loads PRE'd")
STATISTIC (NumPRELoadMoved2CEPred, "Number of loads moved to predecessor of a critical edge in PRE")
STATISTIC (IsValueFullyAvailableInBlockNumSpeculationsMax, "Number of blocks speculated as available in " "IsValueFullyAvailableInBlock(), max")
STATISTIC (MaxBBSpeculationCutoffReachedTimes, "Number of times we we reached gvn-max-block-speculations cut-off " "preventing further exploration")
static bool IsValueFullyAvailableInBlock (BasicBlock *BB, DenseMap< BasicBlock *, AvailabilityState > &FullyAvailableBlocks)
Return true if we can prove that the value we're analyzing is fully available in the specified block.
static void replaceValuesPerBlockEntry (SmallVectorImpl< AvailableValueInBlock > &ValuesPerBlock, Value *OldValue, Value *NewValue)
If the specified OldValue exists in ValuesPerBlock, replace its value with NewValue.
static Value * ConstructSSAForLoadSet (LoadInst *Load, SmallVectorImpl< AvailableValueInBlock > &ValuesPerBlock, GVNPass &GVN)
Given a set of loads specified by ValuesPerBlock, construct SSA form, allowing us to eliminate Load.
static bool isLifetimeStart (const Instruction *Inst)
static bool liesBetween (const Instruction *From, Instruction *Between, const Instruction *To, const DominatorTree *DT)
Assuming To can be reached from both From and Between, does Between lie on every path from From to To?
static const Instruction * findMayClobberedPtrAccess (LoadInst *Load, const DominatorTree *DT)
static void reportMayClobberedLoad (LoadInst *Load, MemDepResult DepInfo, const DominatorTree *DT, OptimizationRemarkEmitter *ORE)
Try to locate the three instruction involved in a missed load-elimination case that is due to an intervening store.
static Value * findDominatingValue (const MemoryLocation &Loc, Type *LoadTy, Instruction *From, AAResults *AA)
static void reportLoadElim (LoadInst *Load, Value *AvailableValue, OptimizationRemarkEmitter *ORE)
static void patchAndReplaceAllUsesWith (Instruction *I, Value *Repl)
static bool isOnlyReachableViaThisEdge (const BasicBlockEdge &E, DominatorTree *DT)
There is an edge from 'Src' to 'Dst'.
Variables
static cl::opt< bool > GVNEnablePRE ("enable-pre", cl::init(true), cl::Hidden)
static cl::opt< bool > GVNEnableLoadPRE ("enable-load-pre", cl::init(true))
static cl::opt< bool > GVNEnableLoadInLoopPRE ("enable-load-in-loop-pre", cl::init(true))
static cl::opt< bool > GVNEnableSplitBackedgeInLoadPRE ("enable-split-backedge-in-load-pre", cl::init(false))
static cl::opt< bool > GVNEnableMemDep ("enable-gvn-memdep", cl::init(true))
static cl::opt< bool > GVNEnableMemorySSA ("enable-gvn-memoryssa", cl::init(false))
static cl::opt< uint32_t > MaxNumDeps ("gvn-max-num-deps", cl::Hidden, cl::init(100), cl::desc("Max number of dependences to attempt Load PRE (default = 100)"))
static cl::opt< uint32_t > MaxBBSpeculations ("gvn-max-block-speculations", cl::Hidden, cl::init(600), cl::desc("Max number of blocks we're willing to speculate on (and recurse " "into) when deducing if a value is fully available or not in GVN " "(default = 600)"))
static cl::opt< uint32_t > MaxNumVisitedInsts ("gvn-max-num-visited-insts", cl::Hidden, cl::init(100), cl::desc("Max number of visited instructions when trying to find " "dominating value of select dependency (default = 100)"))
static cl::opt< uint32_t > MaxNumInsnsPerBlock ("gvn-max-num-insns", cl::Hidden, cl::init(100), cl::desc("Max number of instructions to scan in each basic block in GVN " "(default = 100)"))

DEBUG_TYPE

AvailabilityState

Enumerator
Unavailable We know the block is not fully available. This is a fixpoint.
Available We know the block is fully available. This is a fixpoint.
SpeculativelyAvailable We do not know whether the block is fully available or not, but we are currently speculating that it will be. If it would have turned out that the block was, in fact, not fully available, this would have been cleaned up into an Unavailable.

Definition at line 947 of file GVN.cpp.

ConstructSSAForLoadSet()

Given a set of loads specified by ValuesPerBlock, construct SSA form, allowing us to eliminate Load.

This returns the value that should be used at Load's definition site.

Definition at line 1102 of file GVN.cpp.

References llvm::SSAUpdater::AddAvailableValue(), assert(), llvm::GVNPass::getDominatorTree(), llvm::SSAUpdater::GetValueInMiddleOfBlock(), llvm::SSAUpdater::HasValueForBlock(), llvm::SSAUpdater::Initialize(), llvm::DominatorTreeBase< NodeT, IsPostDom >::properlyDominates(), and llvm::SmallVectorTemplateCommon< T, typename >::size().

findDominatingValue()

Definition at line 1303 of file GVN.cpp.

References llvm::dyn_cast(), llvm::BatchAAResults::getModRefInfo(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getPrevNode(), llvm::BasicBlock::getSinglePredecessor(), llvm::BasicBlock::getTerminator(), llvm::isModSet(), and MaxNumVisitedInsts.

findMayClobberedPtrAccess()

isLifetimeStart()

isOnlyReachableViaThisEdge()

There is an edge from 'Src' to 'Dst'.

Return true if every path from the entry block to 'Dst' passes via this edge. In particular 'Dst' must not be reachable via another edge from 'Src'.

Definition at line 2421 of file GVN.cpp.

References assert(), and E().

IsValueFullyAvailableInBlock()

Return true if we can prove that the value we're analyzing is fully available in the specified block.

As we go, keep track of which blocks we know are fully alive in FullyAvailableBlocks. This map is actually a tri-state map with the following values: 0) we know the block is not fully available. 1) we know the block is fully available. 2) we do not know whether the block is fully available or not, but we are currently speculating that it will be.

Definition at line 967 of file GVN.cpp.

References llvm::SmallVectorImpl< T >::append(), assert(), Available, llvm::SmallVectorImpl< T >::clear(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallPtrSetImplBase::empty(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::SmallPtrSetImpl< PtrType >::erase(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::SmallPtrSetImpl< PtrType >::insert(), IV, MaxBBSpeculations, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::pred_begin(), llvm::pred_empty(), llvm::pred_end(), SpeculativelyAvailable, llvm::succ_begin(), llvm::succ_end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::try_emplace(), and Unavailable.

liesBetween()

patchAndReplaceAllUsesWith()

replaceValuesPerBlockEntry()

If the specified OldValue exists in ValuesPerBlock, replace its value with NewValue.

Definition at line 1083 of file GVN.cpp.

reportLoadElim()

reportMayClobberedLoad()

STATISTIC() [1/11]

STATISTIC ( IsValueFullyAvailableInBlockNumSpeculationsMax ,
"Number of blocks speculated as available in " " IsValueFullyAvailableInBlock(),
max" )

STATISTIC() [2/11]

STATISTIC ( MaxBBSpeculationCutoffReachedTimes ,
"Number of times we we reached gvn-max-block-speculations cut-off " "preventing further exploration" )

STATISTIC() [3/11]

STATISTIC ( NumGVNBlocks ,
"Number of blocks merged" )

STATISTIC() [4/11]

STATISTIC ( NumGVNEqProp ,
"Number of equalities propagated" )

STATISTIC() [5/11]

STATISTIC ( NumGVNInstr ,
"Number of instructions deleted" )

STATISTIC() [6/11]

STATISTIC ( NumGVNLoad ,
"Number of loads deleted" )

STATISTIC() [7/11]

STATISTIC() [8/11]

STATISTIC ( NumGVNSimpl ,
"Number of instructions simplified" )

STATISTIC() [9/11]

STATISTIC ( NumPRELoad ,
"Number of loads PRE'd" )

STATISTIC() [10/11]

STATISTIC ( NumPRELoadMoved2CEPred ,
"Number of loads moved to predecessor of a critical edge in PRE" )

STATISTIC() [11/11]

STATISTIC ( NumPRELoopLoad ,
"Number of loop loads PRE'd" )

GVNEnableLoadInLoopPRE

cl::opt< bool > GVNEnableLoadInLoopPRE("enable-load-in-loop-pre", cl::init(true)) ( "enable-load-in-loop-pre" , cl::init(true) ) static

GVNEnableLoadPRE

cl::opt< bool > GVNEnableLoadPRE("enable-load-pre", cl::init(true)) ( "enable-load-pre" , cl::init(true) ) static

GVNEnableMemDep

cl::opt< bool > GVNEnableMemDep("enable-gvn-memdep", cl::init(true)) ( "enable-gvn-memdep" , cl::init(true) ) static

GVNEnableMemorySSA

cl::opt< bool > GVNEnableMemorySSA("enable-gvn-memoryssa", cl::init(false)) ( "enable-gvn-memoryssa" , cl::init(false) ) static

GVNEnablePRE

cl::opt< bool > GVNEnablePRE("enable-pre", cl::init(true), cl::Hidden) ( "enable-pre" , cl::init(true) , cl::Hidden ) static

GVNEnableSplitBackedgeInLoadPRE

cl::opt< bool > GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre", cl::init(false)) ( "enable-split-backedge-in-load-pre" , cl::init(false) ) static

MaxBBSpeculations

cl::opt< uint32_t > MaxBBSpeculations("gvn-max-block-speculations", cl::Hidden, cl::init(600), cl::desc("Max number of blocks we're willing to speculate on (and recurse " "into) when deducing if a value is fully available or not in GVN " "(default = 600)")) ( "gvn-max-block-speculations" , cl::Hidden , cl::init(600) , cl::desc("Max number of blocks we're willing to speculate on (and recurse " "into) when deducing if a value is fully available or not in GVN " "(default = 600)") ) static

MaxNumDeps

cl::opt< uint32_t > MaxNumDeps("gvn-max-num-deps", cl::Hidden, cl::init(100), cl::desc("Max number of dependences to attempt Load PRE (default = 100)")) ( "gvn-max-num-deps" , cl::Hidden , cl::init(100) , cl::desc("Max number of dependences to attempt Load PRE (default = 100)") ) static

MaxNumInsnsPerBlock

MaxNumVisitedInsts

cl::opt< uint32_t > MaxNumVisitedInsts("gvn-max-num-visited-insts", cl::Hidden, cl::init(100), cl::desc("Max number of visited instructions when trying to find " "dominating value of select dependency (default = 100)")) ( "gvn-max-num-visited-insts" , cl::Hidden , cl::init(100) , cl::desc("Max number of visited instructions when trying to find " "dominating value of select dependency (default = 100)") ) static