LLVM 22.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 | |
LLVM_ABI | SCCPSolver (const DataLayout &DL, std::function< const TargetLibraryInfo &(Function &)> GetTLI, LLVMContext &Ctx) |
LLVM_ABI | ~SCCPSolver () |
LLVM_ABI void | addPredicateInfo (Function &F, DominatorTree &DT, AssumptionCache &AC) |
LLVM_ABI void | removeSSACopies (Function &F) |
LLVM_ABI 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. | |
LLVM_ABI const PredicateBase * | getPredicateInfoFor (Instruction *I) |
LLVM_ABI 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. | |
LLVM_ABI 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. | |
LLVM_ABI void | addToMustPreserveReturnsInFunctions (Function *F) |
Add function to the list of functions whose return cannot be modified. | |
LLVM_ABI bool | mustPreserveReturn (Function *F) |
Returns true if the return of the given function cannot be modified. | |
LLVM_ABI void | addArgumentTrackedFunction (Function *F) |
LLVM_ABI bool | isArgumentTrackedFunction (Function *F) |
Returns true if the given function is in the solver's set of argument-tracked functions. | |
LLVM_ABI const SmallPtrSetImpl< Function * > & | getArgumentTrackedFunctions () const |
LLVM_ABI void | solve () |
Solve - Solve for constants and executable blocks. | |
LLVM_ABI 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. | |
LLVM_ABI void | solveWhileResolvedUndefsIn (Module &M) |
LLVM_ABI void | solveWhileResolvedUndefsIn (SmallVectorImpl< Function * > &WorkList) |
LLVM_ABI void | solveWhileResolvedUndefs () |
LLVM_ABI bool | isBlockExecutable (BasicBlock *BB) const |
LLVM_ABI bool | isEdgeFeasible (BasicBlock *From, BasicBlock *To) const |
LLVM_ABI std::vector< ValueLatticeElement > | getStructLatticeValueFor (Value *V) const |
LLVM_ABI void | removeLatticeValueFor (Value *V) |
LLVM_ABI void | resetLatticeValueFor (CallBase *Call) |
Invalidate the Lattice Value of Call and its users after specializing the call. | |
LLVM_ABI const ValueLatticeElement & | getLatticeValueFor (Value *V) const |
LLVM_ABI const MapVector< Function *, ValueLatticeElement > & | getTrackedRetVals () const |
getTrackedRetVals - Get the inferred return value map. | |
LLVM_ABI const DenseMap< GlobalVariable *, ValueLatticeElement > & | getTrackedGlobals () const |
getTrackedGlobals - Get and return the set of inferred initializers for global variables. | |
LLVM_ABI const SmallPtrSet< Function *, 16 > & | getMRVFunctionsTracked () const |
getMRVFunctionsTracked - Get the set of functions which return multiple values tracked by the pass. | |
LLVM_ABI void | markOverdefined (Value *V) |
markOverdefined - Mark the specified value overdefined. | |
LLVM_ABI void | trackValueOfArgument (Argument *V) |
trackValueOfArgument - Mark the specified argument overdefined unless it have range attribute. | |
LLVM_ABI bool | isStructLatticeConstant (Function *F, StructType *STy) |
LLVM_ABI 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. | |
LLVM_ABI Constant * | getConstantOrNull (Value *V) const |
Return either a Constant or nullptr for a given Value. | |
LLVM_ABI void | setLatticeValueForSpecializationArguments (Function *F, const SmallVectorImpl< ArgInfo > &Args) |
Set the Lattice Value for the arguments of a specialization F . | |
LLVM_ABI void | markFunctionUnreachable (Function *F) |
Mark all of the blocks in function F non-executable. | |
LLVM_ABI void | visit (Instruction *I) |
LLVM_ABI void | visitCall (CallInst &I) |
LLVM_ABI bool | simplifyInstsInBlock (BasicBlock &BB, SmallPtrSetImpl< Value * > &InsertedValues, Statistic &InstRemovedStat, Statistic &InstReplacedStat) |
LLVM_ABI bool | removeNonFeasibleEdges (BasicBlock *BB, DomTreeUpdater &DTU, BasicBlock *&NewUnreachableBB) const |
LLVM_ABI void | inferReturnAttributes () const |
LLVM_ABI void | inferArgAttributes () const |
LLVM_ABI bool | tryToReplaceWithConstant (Value *V) |
Static Public Member Functions | |
static LLVM_ABI bool | isConstant (const ValueLatticeElement &LV) |
static LLVM_ABI bool | isOverdefined (const ValueLatticeElement &LV) |
SCCPSolver - This interface class is a general purpose solver for Sparse Conditional Constant Propagation (SCCP).
Definition at line 66 of file SCCPSolver.h.
SCCPSolver::SCCPSolver | ( | const DataLayout & | DL, |
std::function< const TargetLibraryInfo &(Function &)> | GetTLI, | ||
LLVMContext & | Ctx ) |
Definition at line 2244 of file SCCPSolver.cpp.
References DL, and llvm::move().
void SCCPSolver::addArgumentTrackedFunction | ( | Function * | F | ) |
void SCCPSolver::addPredicateInfo | ( | Function & | F, |
DominatorTree & | DT, | ||
AssumptionCache & | AC ) |
Definition at line 2252 of file SCCPSolver.cpp.
References F.
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::addToMustPreserveReturnsInFunctions | ( | Function * | F | ) |
Add function to the list of functions whose return cannot be modified.
Definition at line 2277 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 2273 of file SCCPSolver.cpp.
References F.
Referenced by runIPSCCP(), and runSCCP().
const SmallPtrSetImpl< Function * > & SCCPSolver::getArgumentTrackedFunctions | ( | ) | const |
Definition at line 2294 of file SCCPSolver.cpp.
Referenced by inferArgAttributes().
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 2366 of file SCCPSolver.cpp.
Return either a Constant or nullptr for a given Value.
Definition at line 2371 of file SCCPSolver.cpp.
Referenced by tryToReplaceWithConstant().
const ValueLatticeElement & SCCPSolver::getLatticeValueFor | ( | Value * | V | ) | const |
Definition at line 2338 of file SCCPSolver.cpp.
Referenced by findReturnsToZap(), llvm::getRange(), and inferArgAttributes().
const SmallPtrSet< Function *, 16 > & SCCPSolver::getMRVFunctionsTracked | ( | ) | const |
getMRVFunctionsTracked - Get the set of functions which return multiple values tracked by the pass.
Definition at line 2352 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
const PredicateBase * SCCPSolver::getPredicateInfoFor | ( | Instruction * | I | ) |
Definition at line 2265 of file SCCPSolver.cpp.
References I.
std::vector< ValueLatticeElement > SCCPSolver::getStructLatticeValueFor | ( | Value * | V | ) | const |
Definition at line 2326 of file SCCPSolver.cpp.
const DenseMap< GlobalVariable *, ValueLatticeElement > & SCCPSolver::getTrackedGlobals | ( | ) | const |
getTrackedGlobals - Get and return the set of inferred initializers for global variables.
Definition at line 2348 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
const MapVector< Function *, ValueLatticeElement > & SCCPSolver::getTrackedRetVals | ( | ) | const |
getTrackedRetVals - Get the inferred return value map.
Definition at line 2343 of file SCCPSolver.cpp.
Referenced by inferReturnAttributes(), and runIPSCCP().
void llvm::SCCPSolver::inferArgAttributes | ( | ) | const |
Definition at line 506 of file SCCPSolver.cpp.
References A(), F, getArgumentTrackedFunctions(), getLatticeValueFor(), llvm::inferAttribute(), and isBlockExecutable().
Referenced by runIPSCCP().
void llvm::SCCPSolver::inferReturnAttributes | ( | ) | const |
Definition at line 501 of file SCCPSolver.cpp.
References F, getTrackedRetVals(), and llvm::inferAttribute().
Referenced by runIPSCCP(), and runSCCP().
Returns true if the given function is in the solver's set of argument-tracked functions.
Definition at line 2289 of file SCCPSolver.cpp.
References F.
Referenced by findReturnsToZap().
bool SCCPSolver::isBlockExecutable | ( | BasicBlock * | BB | ) | const |
Definition at line 2317 of file SCCPSolver.cpp.
Referenced by inferArgAttributes(), runIPSCCP(), and runSCCP().
|
static |
Definition at line 54 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 2321 of file SCCPSolver.cpp.
Referenced by removeNonFeasibleEdges().
|
static |
Definition at line 59 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 ) |
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 2261 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 2380 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 2356 of file SCCPSolver.cpp.
Returns true if the return of the given function cannot be modified.
Definition at line 2281 of file SCCPSolver.cpp.
References F.
Referenced by findReturnsToZap().
void SCCPSolver::removeLatticeValueFor | ( | Value * | V | ) |
Definition at line 2330 of file SCCPSolver.cpp.
Referenced by llvm::replaceSignedInst().
bool llvm::SCCPSolver::removeNonFeasibleEdges | ( | BasicBlock * | BB, |
DomTreeUpdater & | DTU, | ||
BasicBlock *& | NewUnreachableBB ) const |
Definition at line 378 of file SCCPSolver.cpp.
References llvm::GenericDomTreeUpdater< DerivedT, DomTreeT, PostDomTreeT >::applyUpdatesPermissive(), assert(), llvm::SmallPtrSetImpl< PtrType >::begin(), llvm::cast(), llvm::SmallPtrSetImpl< PtrType >::contains(), llvm::BasicBlock::Create(), llvm::BranchInst::Create(), llvm::DominatorTreeBase< BasicBlock, false >::Delete, llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getContext(), llvm::Instruction::getDebugLoc(), llvm::BasicBlock::getParent(), llvm::DebugLoc::getTemporary(), llvm::BasicBlock::getTerminator(), llvm::DominatorTreeBase< BasicBlock, false >::Insert, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isa(), isEdgeFeasible(), llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::BasicBlock::removePredecessor(), llvm::Instruction::setDebugLoc(), llvm::SmallPtrSetImplBase::size(), and llvm::successors().
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::removeSSACopies | ( | Function & | F | ) |
Definition at line 2257 of file SCCPSolver.cpp.
References F.
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 2334 of file SCCPSolver.cpp.
References Call.
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 2300 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 2375 of file SCCPSolver.cpp.
References F.
bool llvm::SCCPSolver::simplifyInstsInBlock | ( | BasicBlock & | BB, |
SmallPtrSetImpl< Value * > & | InsertedValues, | ||
Statistic & | InstRemovedStat, | ||
Statistic & | InstReplacedStat ) |
Definition at line 349 of file SCCPSolver.cpp.
References llvm::make_early_inc_range(), llvm::refineInstruction(), llvm::replaceSignedInst(), llvm::simplifyInstruction(), tryToReplaceWithConstant(), and llvm::wouldInstructionBeTriviallyDead().
Referenced by runIPSCCP(), and runSCCP().
void SCCPSolver::solve | ( | ) |
Solve - Solve for constants and executable blocks.
Definition at line 2298 of file SCCPSolver.cpp.
Referenced by runSCCP().
void SCCPSolver::solveWhileResolvedUndefs | ( | ) |
Definition at line 2313 of file SCCPSolver.cpp.
void SCCPSolver::solveWhileResolvedUndefsIn | ( | Module & | M | ) |
Definition at line 2304 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
void SCCPSolver::solveWhileResolvedUndefsIn | ( | SmallVectorImpl< Function * > & | WorkList | ) |
Definition at line 2309 of file SCCPSolver.cpp.
void SCCPSolver::trackValueOfArgument | ( | Argument * | V | ) |
trackValueOfArgument - Mark the specified argument overdefined unless it have range attribute.
This works with both scalars and structs.
Definition at line 2358 of file SCCPSolver.cpp.
Referenced by runIPSCCP(), and runSCCP().
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 2269 of file SCCPSolver.cpp.
Referenced by runIPSCCP().
Definition at line 63 of file SCCPSolver.cpp.
References addToMustPreserveReturnsInFunctions(), llvm::dbgs(), llvm::dyn_cast(), F, llvm::CallBase::getCalledFunction(), getConstantOrNull(), llvm::CallBase::getOperandBundle(), llvm::CallBase::isMustTailCall(), LLVM_DEBUG, llvm::LLVMContext::OB_clang_arc_attachedcall, and llvm::wouldInstructionBeTriviallyDead().
Referenced by runIPSCCP(), and simplifyInstsInBlock().
void SCCPSolver::visit | ( | Instruction * | I | ) |
Definition at line 2384 of file SCCPSolver.cpp.
References I.
void SCCPSolver::visitCall | ( | CallInst & | I | ) |
Definition at line 2386 of file SCCPSolver.cpp.
References I.