class SCCPInstVisitor

Declaration

class SCCPInstVisitor : public InstVisitor { /* full declaration omitted */ };

Description

Helper class for SCCPSolver. This implements the instruction visitor and holds all the state.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:67

Inherits from: InstVisitor

Member Variables

private const llvm::DataLayout& DL
private std::function<const TargetLibraryInfo&(Function&)> GetTLI
private SmallPtrSet<llvm::BasicBlock*, 8> BBExecutable
private DenseMap<llvm::Value*, llvm::ValueLatticeElement> ValueState
private DenseMap<std::pair<Value*, unsigned int>, llvm::ValueLatticeElement> StructValueState
StructValueState - This maintains ValueState for values that have StructType, for example for formal arguments, calls, insertelement, etc.
private DenseMap<llvm::GlobalVariable*, llvm::ValueLatticeElement> TrackedGlobals
GlobalValue - If we are tracking any values for the contents of a global variable, we keep a mapping from the constant accessor to the element of the global, to the currently known value. If the value becomes overdefined, it's entry is simply removed from this map.
private MapVector<llvm::Function*, llvm::ValueLatticeElement> TrackedRetVals
TrackedRetVals - If we are tracking arguments into and the return value out of a function, it will have an entry in this map, indicating what the known return value for the function is.
private MapVector<std::pair<Function*, unsigned int>, llvm::ValueLatticeElement> TrackedMultipleRetVals
TrackedMultipleRetVals - Same as TrackedRetVals, but used for functions that return multiple values.
private SmallPtrSet<llvm::Function*, 16> MRVFunctionsTracked
MRVFunctionsTracked - Each function in TrackedMultipleRetVals is represented here for efficient lookup.
private SmallPtrSet<llvm::Function*, 16> MustPreserveReturnsInFunctions
A list of functions whose return cannot be modified.
private SmallPtrSet<llvm::Function*, 16> TrackingIncomingArguments
TrackingIncomingArguments - This is the set of functions for whose arguments we make optimistic assumptions about and try to prove as constants.
private SmallVector<llvm::Value*, 64> OverdefinedInstWorkList
By having a separate worklist, we accomplish this because everything possibly overdefined will become overdefined at the soonest possible point.
private SmallVector<llvm::Value*, 64> InstWorkList
private SmallVector<llvm::BasicBlock*, 64> BBWorkList
private DenseSet<llvm::SCCPInstVisitor::Edge> KnownFeasibleEdges
private DenseMap<llvm::Function*, llvm::AnalysisResultsForFn> AnalysisResults
private DenseMap<llvm::Value*, SmallPtrSet<llvm::User*, 2>> AdditionalUsers
private llvm::LLVMContext& Ctx

Method Overview

Methods

SCCPInstVisitor(
    const llvm::DataLayout& DL,
    std::function<const TargetLibraryInfo&(
        Function&)> GetTLI,
    llvm::LLVMContext& Ctx)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:348

Parameters

const llvm::DataLayout& DL
std::function<const TargetLibraryInfo&(Function&)> GetTLI
llvm::LLVMContext& Ctx

void addAdditionalUser(llvm::Value* V,
                       llvm::User* U)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:236

Parameters

llvm::Value* V
llvm::User* U

void addAnalysis(llvm::Function& F,
                 llvm::AnalysisResultsForFn A)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:327

Parameters

llvm::Function& F
llvm::AnalysisResultsForFn A

void addArgumentTrackedFunction(llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:380

Parameters

llvm::Function* F

void addToMustPreserveReturnsInFunctions(
    llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:372

Parameters

llvm::Function* F

void addTrackedFunction(llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:361

Parameters

llvm::Function* F

SmallPtrSetImpl<llvm::Function*>&
getArgumentTrackedFunctions()

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:446

llvm::Constant* getConstant(
    const llvm::ValueLatticeElement& LV) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:444

Parameters

const llvm::ValueLatticeElement& LV

llvm::ConstantInt* getConstantInt(
    const llvm::ValueLatticeElement& IV) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:130

Parameters

const llvm::ValueLatticeElement& IV

llvm::DomTreeUpdater getDTU(llvm::Function& F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:342

Parameters

llvm::Function& F

void getFeasibleSuccessors(
    llvm::Instruction& TI,
    SmallVectorImpl<bool>& Succs)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:225

Parameters

llvm::Instruction& TI
SmallVectorImpl<bool>& Succs

const llvm::ValueLatticeElement&
getLatticeValueFor(llvm::Value* V) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:412

Parameters

llvm::Value* V

const SmallPtrSet<llvm::Function*, 16>
getMRVFunctionsTracked()

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:430

const llvm::PredicateBase* getPredicateInfoFor(
    llvm::Instruction* I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:335

Parameters

llvm::Instruction* I

std::vector<ValueLatticeElement>
getStructLatticeValueFor(llvm::Value* V) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:398

Parameters

llvm::Value* V

llvm::ValueLatticeElement& getStructValueState(
    llvm::Value* V,
    unsigned int i)

Description

getStructValueState - Return the ValueLatticeElement object that corresponds to the value/field pair. This function handles the case when the value hasn't been seen yet by properly seeding constants etc.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:194

Parameters

llvm::Value* V
unsigned int i

const DenseMap<llvm::GlobalVariable*,
               llvm::ValueLatticeElement>&
getTrackedGlobals()

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:426

const MapVector<llvm::Function*,
                llvm::ValueLatticeElement>&
getTrackedRetVals()

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:422

llvm::ValueLatticeElement& getValueState(
    llvm::Value* V)

Description

getValueState - Return the ValueLatticeElement object that corresponds to the value. This function handles the case when the value hasn't been seen yet by properly seeding constants etc.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:175

Parameters

llvm::Value* V

void handleCallArguments(llvm::CallBase& CB)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:272

Parameters

llvm::CallBase& CB

void handleCallOverdefined(llvm::CallBase& CB)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:270

Parameters

llvm::CallBase& CB

void handleCallResult(llvm::CallBase& CB)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:271

Parameters

llvm::CallBase& CB

bool isArgumentTrackedFunction(llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:384

Parameters

llvm::Function* F

bool isBlockExecutable(llvm::BasicBlock* BB) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:392

Parameters

llvm::BasicBlock* BB

bool isEdgeFeasible(llvm::BasicBlock* From,
                    llvm::BasicBlock* To) const

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:396

Parameters

llvm::BasicBlock* From
llvm::BasicBlock* To

bool isStructLatticeConstant(
    llvm::Function* F,
    llvm::StructType* STy)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:442

Parameters

llvm::Function* F
llvm::StructType* STy

void markArgInFuncSpecialization(
    llvm::Function* F,
    const SmallVectorImpl<llvm::ArgInfo>& Args)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:450

Parameters

llvm::Function* F
const SmallVectorImpl<llvm::ArgInfo>& Args

bool markBlockExecutable(llvm::BasicBlock* BB)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:333

Parameters

llvm::BasicBlock* BB

bool markConstant(llvm::ValueLatticeElement& IV,
                  llvm::Value* V,
                  llvm::Constant* C,
                  bool MayIncludeUndef = false)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:144

Parameters

llvm::ValueLatticeElement& IV
llvm::Value* V
llvm::Constant* C
bool MayIncludeUndef = false

bool markConstant(llvm::Value* V,
                  llvm::Constant* C)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:147

Parameters

llvm::Value* V
llvm::Constant* C

bool markEdgeExecutable(llvm::BasicBlock* Source,
                        llvm::BasicBlock* Dest)

Description

markEdgeExecutable - Mark a basic block as executable, adding it to the BB work list if it is not already executable.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:221

Parameters

llvm::BasicBlock* Source
llvm::BasicBlock* Dest

void markFunctionUnreachable(llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:453

Parameters

llvm::Function* F

bool markOverdefined(
    llvm::ValueLatticeElement& IV,
    llvm::Value* V)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:155

Parameters

llvm::ValueLatticeElement& IV
llvm::Value* V

void markOverdefined(llvm::Value* V)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:434

Parameters

llvm::Value* V

void markUsersAsChanged(llvm::Value* I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:242

Parameters

llvm::Value* I

bool mergeInValue(
    llvm::Value* V,
    llvm::ValueLatticeElement MergeWithV,
    ValueLatticeElement::MergeOptions Opts = {
        false, false})

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:164

Parameters

llvm::Value* V
llvm::ValueLatticeElement MergeWithV
ValueLatticeElement::MergeOptions Opts = {false, false}

bool mergeInValue(
    llvm::ValueLatticeElement& IV,
    llvm::Value* V,
    llvm::ValueLatticeElement MergeWithV,
    ValueLatticeElement::MergeOptions Opts = {
        false, false})

Description

Merge \p MergeWithV into \p IV and push \p V to the worklist, if \p IV changes.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:159

Parameters

llvm::ValueLatticeElement& IV
llvm::Value* V
llvm::ValueLatticeElement MergeWithV
ValueLatticeElement::MergeOptions Opts = {false, false}

bool mustPreserveReturn(llvm::Function* F)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:376

Parameters

llvm::Function* F

void operandChangedState(llvm::Instruction* I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:230

Parameters

llvm::Instruction* I

void pushToWorkList(llvm::ValueLatticeElement& IV,
                    llvm::Value* V)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:135

Parameters

llvm::ValueLatticeElement& IV
llvm::Value* V

void pushToWorkListMsg(
    llvm::ValueLatticeElement& IV,
    llvm::Value* V)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:139

Parameters

llvm::ValueLatticeElement& IV
llvm::Value* V

void removeLatticeValueFor(llvm::Value* V)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:410

Parameters

llvm::Value* V

bool resolvedUndefsIn(llvm::Function& F)

Description

While solving the dataflow for a function, we don't compute a result for operations with an undef operand, to allow undef to be lowered to a constant later. For example, constant folding of "zext i8 undef to i16" would result in "i16 0", and if undef is later lowered to "i8 1", then the zext result would become "i16 1" and would result into an overdefined lattice value once merged with the previous result. Not computing the result of the zext (treating undef the same as unknown) allows us to handle a later undef->constant lowering more optimally. However, if the operand remains undef when the solver returns, we do need to assign some result to the instruction (otherwise we would treat it as unreachable). For simplicity, we mark any instructions that are still unknown as overdefined.

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:390

Parameters

llvm::Function& F

void solve()

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:388

void trackValueOfGlobalVariable(
    llvm::GlobalVariable* GV)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:353

Parameters

llvm::GlobalVariable* GV

void visitBinaryOperator(llvm::Instruction& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:290

Parameters

llvm::Instruction& I

void visitCallBase(llvm::CallBase& CB)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:316

Parameters

llvm::CallBase& CB

void visitCallBrInst(llvm::CallBrInst& CBI)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:311

Parameters

llvm::CallBrInst& CBI

void visitCallInst(llvm::CallInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:331

Parameters

llvm::CallInst& I

void visitCastInst(llvm::CastInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:287

Parameters

llvm::CastInst& I

void visitCatchSwitchInst(
    llvm::CatchSwitchInst& CPI)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:295

Parameters

llvm::CatchSwitchInst& CPI

void visitCmpInst(llvm::CmpInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:291

Parameters

llvm::CmpInst& I

void visitExtractValueInst(
    llvm::ExtractValueInst& EVI)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:292

Parameters

llvm::ExtractValueInst& EVI

void visitFenceInst(llvm::FenceInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:321

Parameters

llvm::FenceInst& I

void visitGetElementPtrInst(
    llvm::GetElementPtrInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:304

Parameters

llvm::GetElementPtrInst& I

void visitInsertValueInst(
    llvm::InsertValueInst& IVI)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:293

Parameters

llvm::InsertValueInst& IVI

void visitInstruction(llvm::Instruction& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:324

Parameters

llvm::Instruction& I

void visitInvokeInst(llvm::InvokeInst& II)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:306

Parameters

llvm::InvokeInst& II

void visitLoadInst(llvm::LoadInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:303

Parameters

llvm::LoadInst& I

void visitPHINode(llvm::PHINode& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:280

Parameters

llvm::PHINode& I

void visitResumeInst(llvm::ResumeInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:317

Parameters

llvm::ResumeInst& I

void visitReturnInst(llvm::ReturnInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:284

Parameters

llvm::ReturnInst& I

void visitSelectInst(llvm::SelectInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:288

Parameters

llvm::SelectInst& I

void visitStoreInst(llvm::StoreInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:302

Parameters

llvm::StoreInst& I

void visitTerminator(llvm::Instruction& TI)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:285

Parameters

llvm::Instruction& TI

void visitUnaryOperator(llvm::Instruction& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:289

Parameters

llvm::Instruction& I

void visitUnreachableInst(
    llvm::UnreachableInst& I)

Declared at: llvm/lib/Transforms/Utils/SCCPSolver.cpp:319

Parameters

llvm::UnreachableInst& I