LLVM 18.0.0git
|
SCCPSolver - This interface class is a general purpose solver for Sparse Conditional Constant Propagation (SCCP). More...
#include "llvm/Transforms/Utils/SCCPSolver.h"
Public Member Functions | |
SCCPSolver (const DataLayout &DL, std::function< const TargetLibraryInfo &(Function &)> GetTLI, LLVMContext &Ctx) | |
~SCCPSolver () | |
void | addPredicateInfo (Function &F, DominatorTree &DT, AssumptionCache &AC) |
bool | markBlockExecutable (BasicBlock *BB) |
markBlockExecutable - This method can be used by clients to mark all of the blocks that are known to be intrinsically live in the processed unit. | |
const PredicateBase * | getPredicateInfoFor (Instruction *I) |
void | trackValueOfGlobalVariable (GlobalVariable *GV) |
trackValueOfGlobalVariable - Clients can use this method to inform the SCCPSolver that it should track loads and stores to the specified global variable if it can. | |
void | addTrackedFunction (Function *F) |
addTrackedFunction - If the SCCP solver is supposed to track calls into and out of the specified function (which cannot have its address taken), this method must be called. | |
void | addToMustPreserveReturnsInFunctions (Function *F) |
Add function to the list of functions whose return cannot be modified. | |
bool | mustPreserveReturn (Function *F) |
Returns true if the return of the given function cannot be modified. | |
void | addArgumentTrackedFunction (Function *F) |
bool | isArgumentTrackedFunction (Function *F) |
Returns true if the given function is in the solver's set of argument-tracked functions. | |
void | solve () |
Solve - Solve for constants and executable blocks. | |
bool | resolvedUndefsIn (Function &F) |
resolvedUndefsIn - While solving the dataflow for a function, we assume that branches on undef values cannot reach any of their successors. | |
void | solveWhileResolvedUndefsIn (Module &M) |
void | solveWhileResolvedUndefsIn (SmallVectorImpl< Function * > &WorkList) |
void | solveWhileResolvedUndefs () |
bool | isBlockExecutable (BasicBlock *BB) const |
bool | isEdgeFeasible (BasicBlock *From, BasicBlock *To) const |
std::vector< ValueLatticeElement > | getStructLatticeValueFor (Value *V) const |
void | removeLatticeValueFor (Value *V) |
void | resetLatticeValueFor (CallBase *Call) |
Invalidate the Lattice Value of Call and its users after specializing the call. | |
const ValueLatticeElement & | getLatticeValueFor (Value *V) const |
const MapVector< Function *, ValueLatticeElement > & | getTrackedRetVals () |
getTrackedRetVals - Get the inferred return value map. | |
const DenseMap< GlobalVariable *, ValueLatticeElement > & | getTrackedGlobals () |
getTrackedGlobals - Get and return the set of inferred initializers for global variables. | |
const SmallPtrSet< Function *, 16 > | getMRVFunctionsTracked () |
getMRVFunctionsTracked - Get the set of functions which return multiple values tracked by the pass. | |
void | markOverdefined (Value *V) |
markOverdefined - Mark the specified value overdefined. | |
bool | isStructLatticeConstant (Function *F, StructType *STy) |
Constant * | getConstant (const ValueLatticeElement &LV, Type *Ty) const |
Helper to return a Constant if LV is either a constant or a constant range with a single element. | |
Constant * | getConstantOrNull (Value *V) const |
Return either a Constant or nullptr for a given Value. | |
SmallPtrSetImpl< Function * > & | getArgumentTrackedFunctions () |
Return a reference to the set of argument tracked functions. | |
void | setLatticeValueForSpecializationArguments (Function *F, const SmallVectorImpl< ArgInfo > &Args) |
Set the Lattice Value for the arguments of a specialization F . | |
void | markFunctionUnreachable (Function *F) |
Mark all of the blocks in function F non-executable. | |
void | visit (Instruction *I) |
void | visitCall (CallInst &I) |
bool | simplifyInstsInBlock (BasicBlock &BB, SmallPtrSetImpl< Value * > &InsertedValues, Statistic &InstRemovedStat, Statistic &InstReplacedStat) |
bool | removeNonFeasibleEdges (BasicBlock *BB, DomTreeUpdater &DTU, BasicBlock *&NewUnreachableBB) const |
bool | tryToReplaceWithConstant (Value *V) |
Static Public Member Functions | |
static bool | isConstant (const ValueLatticeElement &LV) |
static bool | isOverdefined (const ValueLatticeElement &LV) |
SCCPSolver - This interface class is a general purpose solver for Sparse Conditional Constant Propagation (SCCP).
Definition at line 65 of file SCCPSolver.h.
SCCPSolver::SCCPSolver | ( | const DataLayout & | DL, |
std::function< const TargetLibraryInfo &(Function &)> | GetTLI, | ||
LLVMContext & | Ctx | ||
) |
Definition at line 1965 of file SCCPSolver.cpp.
|
default |
void SCCPSolver::addArgumentTrackedFunction | ( | Function * | F | ) |
void SCCPSolver::addPredicateInfo | ( | Function & | F, |
DominatorTree & | DT, | ||
AssumptionCache & | AC | ||
) |
void SCCPSolver::addToMustPreserveReturnsInFunctions | ( | Function * | F | ) |
Add function to the list of functions whose return cannot be modified.
Definition at line 1994 of file SCCPSolver.cpp.
References F.
Referenced by tryToReplaceWithConstant().
void SCCPSolver::addTrackedFunction | ( | Function * | F | ) |
addTrackedFunction - If the SCCP solver is supposed to track calls into and out of the specified function (which cannot have its address taken), this method must be called.
Definition at line 1990 of file SCCPSolver.cpp.
References F.
Referenced by runIPSCCP().
SmallPtrSetImpl< Function * > & SCCPSolver::getArgumentTrackedFunctions | ( | ) |
Return a reference to the set of argument tracked functions.
Definition at line 2083 of file SCCPSolver.cpp.
Constant * SCCPSolver::getConstant | ( | const ValueLatticeElement & | LV, |
Type * | Ty | ||
) | const |
Helper to return a Constant if LV
is either a constant or a constant range with a single element.
Definition at line 2074 of file SCCPSolver.cpp.
Return either a Constant or nullptr for a given Value.
Definition at line 2079 of file SCCPSolver.cpp.
Referenced by tryToReplaceWithConstant().
const ValueLatticeElement & SCCPSolver::getLatticeValueFor | ( | Value * | V | ) | const |
Definition at line 2050 of file SCCPSolver.cpp.
Referenced by findReturnsToZap(), llvm::refineInstruction(), and llvm::replaceSignedInst().
const SmallPtrSet< Function *, 16 > SCCPSolver::getMRVFunctionsTracked | ( | ) |
getMRVFunctionsTracked - Get the set of functions which return multiple values tracked by the pass.
Definition at line 2064 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
const PredicateBase * SCCPSolver::getPredicateInfoFor | ( | Instruction * | I | ) |
std::vector< ValueLatticeElement > SCCPSolver::getStructLatticeValueFor | ( | Value * | V | ) | const |
Definition at line 2038 of file SCCPSolver.cpp.
const DenseMap< GlobalVariable *, ValueLatticeElement > & SCCPSolver::getTrackedGlobals | ( | ) |
getTrackedGlobals - Get and return the set of inferred initializers for global variables.
Definition at line 2060 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
const MapVector< Function *, ValueLatticeElement > & SCCPSolver::getTrackedRetVals | ( | ) |
getTrackedRetVals - Get the inferred return value map.
Definition at line 2055 of file SCCPSolver.cpp.
Referenced by llvm::FunctionSpecializer::run(), and runIPSCCP().
Returns true if the given function is in the solver's set of argument-tracked functions.
Definition at line 2006 of file SCCPSolver.cpp.
References F.
Referenced by findReturnsToZap().
bool SCCPSolver::isBlockExecutable | ( | BasicBlock * | BB | ) | const |
Definition at line 2029 of file SCCPSolver.cpp.
Referenced by llvm::InstCostVisitor::isBlockExecutable(), runIPSCCP(), and runSCCP().
|
static |
Definition at line 55 of file SCCPSolver.cpp.
References llvm::ValueLatticeElement::getConstantRange(), llvm::ValueLatticeElement::isConstant(), llvm::ValueLatticeElement::isConstantRange(), and llvm::ConstantRange::isSingleElement().
Referenced by llvm::SCCPInstVisitor::getConstantOrNull(), isOverdefined(), llvm::SCCPInstVisitor::isStructLatticeConstant(), and runIPSCCP().
bool SCCPSolver::isEdgeFeasible | ( | BasicBlock * | From, |
BasicBlock * | To | ||
) | const |
Definition at line 2033 of file SCCPSolver.cpp.
References From.
Referenced by removeNonFeasibleEdges().
|
static |
Definition at line 60 of file SCCPSolver.cpp.
References isConstant(), and llvm::ValueLatticeElement::isUnknownOrUndef().
Referenced by findReturnsToZap(), llvm::SCCPInstVisitor::getConstantOrNull(), llvm::FunctionSpecializer::run(), and runIPSCCP().
bool SCCPSolver::isStructLatticeConstant | ( | Function * | F, |
StructType * | STy | ||
) |
Definition at line 2070 of file SCCPSolver.cpp.
References F.
Referenced by llvm::FunctionSpecializer::run(), and runIPSCCP().
bool SCCPSolver::markBlockExecutable | ( | BasicBlock * | BB | ) |
markBlockExecutable - This method can be used by clients to mark all of the blocks that are known to be intrinsically live in the processed unit.
This returns true if the block was not considered live before.
Definition at line 1978 of file SCCPSolver.cpp.
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::markFunctionUnreachable | ( | Function * | F | ) |
Mark all of the blocks in function F
non-executable.
Clients can used this method to erase a function from the module (e.g., if it has been completely specialized and is no longer needed).
Definition at line 2092 of file SCCPSolver.cpp.
References F.
void SCCPSolver::markOverdefined | ( | Value * | V | ) |
markOverdefined - Mark the specified value overdefined.
This works with both scalars and structs.
Definition at line 2068 of file SCCPSolver.cpp.
Referenced by runIPSCCP(), and runSCCP().
Returns true if the return of the given function cannot be modified.
Definition at line 1998 of file SCCPSolver.cpp.
References F.
Referenced by findReturnsToZap().
void SCCPSolver::removeLatticeValueFor | ( | Value * | V | ) |
Definition at line 2042 of file SCCPSolver.cpp.
Referenced by llvm::replaceSignedInst().
bool llvm::SCCPSolver::removeNonFeasibleEdges | ( | BasicBlock * | BB, |
DomTreeUpdater & | DTU, | ||
BasicBlock *& | NewUnreachableBB | ||
) | const |
Definition at line 234 of file SCCPSolver.cpp.
References llvm::DomTreeUpdater::applyUpdatesPermissive(), assert(), llvm::SmallPtrSetImpl< PtrType >::begin(), llvm::SmallPtrSetImpl< PtrType >::contains(), llvm::BranchInst::Create(), llvm::BasicBlock::Create(), llvm::DominatorTreeBase< BasicBlock, false >::Delete, llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getContext(), llvm::BasicBlock::getParent(), llvm::BasicBlock::getTerminator(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::DominatorTreeBase< BasicBlock, false >::Insert, isEdgeFeasible(), llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::BasicBlock::removePredecessor(), llvm::SmallPtrSetImplBase::size(), and llvm::successors().
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::resetLatticeValueFor | ( | CallBase * | Call | ) |
Invalidate the Lattice Value of Call
and its users after specializing the call.
Then recompute it.
Definition at line 2046 of file SCCPSolver.cpp.
Referenced by llvm::FunctionSpecializer::run().
resolvedUndefsIn - While solving the dataflow for a function, we assume that branches on undef values cannot reach any of their successors.
However, this is not a safe assumption. After we solve dataflow, this method should be use to handle this. If this returns true, the solver should be rerun.
Definition at line 2012 of file SCCPSolver.cpp.
References F.
Referenced by runSCCP().
void SCCPSolver::setLatticeValueForSpecializationArguments | ( | Function * | F, |
const SmallVectorImpl< ArgInfo > & | Args | ||
) |
Set the Lattice Value for the arguments of a specialization F
.
If an argument is Constant then its lattice value is marked with the corresponding actual argument in Args
. Otherwise, its lattice value is inherited (copied) from the corresponding formal argument in Args
.
Definition at line 2087 of file SCCPSolver.cpp.
References F.
bool llvm::SCCPSolver::simplifyInstsInBlock | ( | BasicBlock & | BB, |
SmallPtrSetImpl< Value * > & | InsertedValues, | ||
Statistic & | InstRemovedStat, | ||
Statistic & | InstReplacedStat | ||
) |
Definition at line 210 of file SCCPSolver.cpp.
References llvm::canRemoveInstruction(), llvm::make_early_inc_range(), llvm::refineInstruction(), llvm::replaceSignedInst(), and tryToReplaceWithConstant().
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::solve | ( | ) |
Solve - Solve for constants and executable blocks.
Definition at line 2010 of file SCCPSolver.cpp.
Referenced by runSCCP().
void SCCPSolver::solveWhileResolvedUndefs | ( | ) |
Definition at line 2025 of file SCCPSolver.cpp.
Referenced by llvm::FunctionSpecializer::run().
void SCCPSolver::solveWhileResolvedUndefsIn | ( | Module & | M | ) |
Definition at line 2016 of file SCCPSolver.cpp.
Referenced by llvm::FunctionSpecializer::run(), and runIPSCCP().
void SCCPSolver::solveWhileResolvedUndefsIn | ( | SmallVectorImpl< Function * > & | WorkList | ) |
Definition at line 2021 of file SCCPSolver.cpp.
void SCCPSolver::trackValueOfGlobalVariable | ( | GlobalVariable * | GV | ) |
trackValueOfGlobalVariable - Clients can use this method to inform the SCCPSolver that it should track loads and stores to the specified global variable if it can.
This is only legal to call if performing Interprocedural SCCP.
Definition at line 1986 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
Definition at line 76 of file SCCPSolver.cpp.
References addToMustPreserveReturnsInFunctions(), llvm::canRemoveInstruction(), llvm::dbgs(), F, llvm::CallBase::getCalledFunction(), getConstantOrNull(), llvm::CallBase::getOperandBundle(), llvm::CallBase::isMustTailCall(), LLVM_DEBUG, and llvm::LLVMContext::OB_clang_arc_attachedcall.
Referenced by runIPSCCP(), and simplifyInstsInBlock().
void SCCPSolver::visit | ( | Instruction * | I | ) |
Definition at line 2096 of file SCCPSolver.cpp.
References I.
void SCCPSolver::visitCall | ( | CallInst & | I | ) |
Definition at line 2098 of file SCCPSolver.cpp.
References I.