Enzyme main
Loading...
Searching...
No Matches
TypeAnalyzer Class Reference

Helper class that computes the fixed-point type results of a given function. More...

#include "TypeAnalysis/TypeAnalysis.h"

Inheritance diagram for TypeAnalyzer:
Collaboration diagram for TypeAnalyzer:

Public Member Functions

FnTypeInfo getCallInfo (llvm::CallBase &CI, llvm::Function &fn)
 
 TypeAnalyzer (TypeAnalysis &TA)
 
 TypeAnalyzer (const FnTypeInfo &fn, TypeAnalysis &TA, uint8_t direction=BOTH)
 
 TypeAnalyzer (const FnTypeInfo &fn, TypeAnalysis &TA, const llvm::SmallPtrSetImpl< llvm::BasicBlock * > &notForAnalysis, const TypeAnalyzer &Prev, uint8_t direction=BOTH, bool PHIRecur=false)
 
TypeTree getAnalysis (llvm::Value *Val)
 Get the current results for a given value.
 
void updateAnalysis (llvm::Value *val, BaseType data, llvm::Value *origin)
 Add additional information to the Type info of val, readding it to the work queue as necessary.
 
void updateAnalysis (llvm::Value *val, ConcreteType data, llvm::Value *origin)
 
void updateAnalysis (llvm::Value *val, TypeTree data, llvm::Value *origin)
 
void prepareArgs ()
 Analyze type info given by the arguments, possibly adding to work queue.
 
void considerTBAA ()
 Analyze type info given by the TBAA, possibly adding to work queue.
 
void considerRustDebugInfo ()
 Parse the debug info generated by rustc and retrieve useful type info if possible.
 
void run ()
 Run the interprocedural type analysis starting from this function.
 
void runPHIHypotheses ()
 Hypothesize that undefined phi's are integers and try to prove that they are really integral.
 
void visitValue (llvm::Value &val)
 
void visitConstantExpr (llvm::ConstantExpr &CE)
 
void visitCmpInst (llvm::CmpInst &I)
 
void visitAllocaInst (llvm::AllocaInst &I)
 
void visitLoadInst (llvm::LoadInst &I)
 
void visitStoreInst (llvm::StoreInst &I)
 
void visitGetElementPtrInst (llvm::GetElementPtrInst &gep)
 
void visitGEPOperator (llvm::GEPOperator &gep)
 
void visitPHINode (llvm::PHINode &phi)
 
void visitTruncInst (llvm::TruncInst &I)
 
void visitZExtInst (llvm::ZExtInst &I)
 
void visitSExtInst (llvm::SExtInst &I)
 
void visitAddrSpaceCastInst (llvm::AddrSpaceCastInst &I)
 
void visitFPExtInst (llvm::FPExtInst &I)
 
void visitFPTruncInst (llvm::FPTruncInst &I)
 
void visitFPToUIInst (llvm::FPToUIInst &I)
 
void visitFPToSIInst (llvm::FPToSIInst &I)
 
void visitUIToFPInst (llvm::UIToFPInst &I)
 
void visitSIToFPInst (llvm::SIToFPInst &I)
 
void visitPtrToIntInst (llvm::PtrToIntInst &I)
 
void visitIntToPtrInst (llvm::IntToPtrInst &I)
 
void visitBitCastInst (llvm::BitCastInst &I)
 
void visitSelectInst (llvm::SelectInst &I)
 
void visitExtractElementInst (llvm::ExtractElementInst &I)
 
void visitInsertElementInst (llvm::InsertElementInst &I)
 
void visitShuffleVectorInst (llvm::ShuffleVectorInst &I)
 
void visitExtractValueInst (llvm::ExtractValueInst &I)
 
void visitInsertValueInst (llvm::InsertValueInst &I)
 
void visitAtomicRMWInst (llvm::AtomicRMWInst &I)
 
void visitBinaryOperator (llvm::BinaryOperator &I)
 
void visitBinaryOperation (const llvm::DataLayout &DL, llvm::Type *T, llvm::Instruction::BinaryOps, llvm::Value *Args[2], TypeTree &Ret, TypeTree &LHS, TypeTree &RHS, llvm::Instruction *I)
 
void visitIPOCall (llvm::CallBase &call, llvm::Function &fn)
 
void visitCallBase (llvm::CallBase &call)
 
void visitMemTransferInst (llvm::MemTransferInst &MTI)
 
void visitMemTransferCommon (llvm::CallBase &MTI)
 
void visitIntrinsicInst (llvm::IntrinsicInst &II)
 
TypeTree getReturnAnalysis ()
 
void dump (llvm::raw_ostream &ss=llvm::errs())
 
std::set< int64_t > knownIntegralValues (llvm::Value *val)
 

Public Attributes

std::shared_ptr< llvm::ModuleSlotTracker > MST
 Cache of metadata indices, for faster printing.
 
llvm::SetVector< llvm::Value *, std::deque< llvm::Value * > > workList
 List of value's which should be re-analyzed now with new information.
 
const llvm::SmallPtrSet< llvm::BasicBlock *, 4 > notForAnalysis
 
const FnTypeInfo fntypeinfo
 Calling context.
 
TypeAnalysisinterprocedural
 Calling TypeAnalysis to be used in the case of calls to other functions.
 
uint8_t direction
 Directionality of checks.
 
bool Invalid
 Whether an inconsistent update has been found This will only be set when direction != Both, erring otherwise.
 
bool PHIRecur
 
std::map< llvm::Value *, TypeTreeanalysis
 Intermediate conservative, but correct Type analysis results.
 
llvm::TargetLibraryInfo & TLI
 
llvm::DominatorTree & DT
 
llvm::PostDominatorTree & PDT
 
llvm::LoopInfo & LI
 
llvm::ScalarEvolution & SE
 

Static Public Attributes

static constexpr uint8_t UP = 1
 
static constexpr uint8_t DOWN = 2
 
static constexpr uint8_t BOTH = UP | DOWN
 

Detailed Description

Helper class that computes the fixed-point type results of a given function.

Definition at line 235 of file TypeAnalysis.h.

Constructor & Destructor Documentation

◆ TypeAnalyzer() [1/3]

TypeAnalyzer::TypeAnalyzer ( TypeAnalysis & TA)

◆ TypeAnalyzer() [2/3]

TypeAnalyzer::TypeAnalyzer ( const FnTypeInfo & fn,
TypeAnalysis & TA,
uint8_t direction = BOTH )

◆ TypeAnalyzer() [3/3]

TypeAnalyzer::TypeAnalyzer ( const FnTypeInfo & fn,
TypeAnalysis & TA,
const llvm::SmallPtrSetImpl< llvm::BasicBlock * > & notForAnalysis,
const TypeAnalyzer & Prev,
uint8_t direction = BOTH,
bool PHIRecur = false )

Definition at line 279 of file TypeAnalysis.cpp.

References fntypeinfo, FnTypeInfo::Function, and FnTypeInfo::KnownValues.

Member Function Documentation

◆ considerRustDebugInfo()

void TypeAnalyzer::considerRustDebugInfo ( )

Parse the debug info generated by rustc and retrieve useful type info if possible.

Definition at line 6371 of file TypeAnalysis.cpp.

References fntypeinfo, FnTypeInfo::Function, TypeTree::isKnown(), TypeTree::Only(), parseDIType(), Pointer, and updateAnalysis().

◆ considerTBAA()

◆ dump()

◆ getAnalysis()

◆ getCallInfo()

FnTypeInfo TypeAnalyzer::getCallInfo ( llvm::CallBase & CI,
llvm::Function & fn )

◆ getReturnAnalysis()

TypeTree TypeAnalyzer::getReturnAnalysis ( )

Definition at line 5766 of file TypeAnalysis.cpp.

References fntypeinfo, FnTypeInfo::Function, and getAnalysis().

Referenced by TypeResults::getReturnAnalysis().

◆ knownIntegralValues()

std::set< int64_t > TypeAnalyzer::knownIntegralValues ( llvm::Value * val)

◆ prepareArgs()

void TypeAnalyzer::prepareArgs ( )

Analyze type info given by the arguments, possibly adding to work queue.

Definition at line 1194 of file TypeAnalysis.cpp.

References FnTypeInfo::Arguments, fntypeinfo, FnTypeInfo::Function, getAnalysis(), FnTypeInfo::Return, and updateAnalysis().

◆ run()

void TypeAnalyzer::run ( )

Run the interprocedural type analysis starting from this function.

Definition at line 1647 of file TypeAnalysis.cpp.

References TypeAnalysis::CustomRules, fntypeinfo, FnTypeInfo::Function, getFuncNameFromCall(), getFunctionFromCall(), interprocedural, Invalid, runPHIHypotheses(), visitValue(), and workList.

Referenced by runPHIHypotheses().

◆ runPHIHypotheses()

void TypeAnalyzer::runPHIHypotheses ( )

Hypothesize that undefined phi's are integers and try to prove that they are really integral.

Definition at line 1564 of file TypeAnalysis.cpp.

References analysis, Anything, direction, DOWN, fntypeinfo, FnTypeInfo::Function, getAnalysis(), Integer, interprocedural, Invalid, notForAnalysis, TypeTree::Only(), PHIRecur, run(), and updateAnalysis().

Referenced by run().

◆ updateAnalysis() [1/3]

void TypeAnalyzer::updateAnalysis ( llvm::Value * val,
BaseType data,
llvm::Value * origin )

Add additional information to the Type info of val, readding it to the work queue as necessary.

Referenced by analyzeIntelSubscriptIntrinsic(), TypeHandler< double * >::analyzeType(), TypeHandler< double >::analyzeType(), TypeHandler< float * >::analyzeType(), TypeHandler< float >::analyzeType(), TypeHandler< int * >::analyzeType(), TypeHandler< int >::analyzeType(), TypeHandler< long double * >::analyzeType(), TypeHandler< long double >::analyzeType(), TypeHandler< long int * >::analyzeType(), TypeHandler< long int >::analyzeType(), TypeHandler< long long int * >::analyzeType(), TypeHandler< long long int >::analyzeType(), TypeHandler< long long unsigned int * >::analyzeType(), TypeHandler< long long unsigned int >::analyzeType(), TypeHandler< long unsigned int * >::analyzeType(), TypeHandler< long unsigned int >::analyzeType(), TypeHandler< unsigned int * >::analyzeType(), TypeHandler< unsigned int >::analyzeType(), TypeHandler< void * >::analyzeType(), considerRustDebugInfo(), considerTBAA(), prepareArgs(), runPHIHypotheses(), visitAddrSpaceCastInst(), visitAllocaInst(), visitAtomicRMWInst(), visitBinaryOperator(), visitBitCastInst(), visitCallBase(), visitCmpInst(), visitConstantExpr(), visitExtractElementInst(), visitExtractValueInst(), visitFPExtInst(), visitFPToSIInst(), visitFPToUIInst(), visitFPTruncInst(), visitGEPOperator(), visitInsertElementInst(), visitInsertValueInst(), visitIntrinsicInst(), visitIntToPtrInst(), visitIPOCall(), visitLoadInst(), visitMemTransferCommon(), visitPHINode(), visitPtrToIntInst(), visitSelectInst(), visitSExtInst(), visitShuffleVectorInst(), visitSIToFPInst(), visitStoreInst(), visitTruncInst(), visitUIToFPInst(), visitValue(), and visitZExtInst().

◆ updateAnalysis() [2/3]

void TypeAnalyzer::updateAnalysis ( llvm::Value * val,
ConcreteType data,
llvm::Value * origin )

◆ updateAnalysis() [3/3]

void TypeAnalyzer::updateAnalysis ( llvm::Value * val,
TypeTree data,
llvm::Value * origin )

◆ visitAddrSpaceCastInst()

void TypeAnalyzer::visitAddrSpaceCastInst ( llvm::AddrSpaceCastInst & I)

Definition at line 2446 of file TypeAnalysis.cpp.

References direction, DOWN, getAnalysis(), UP, and updateAnalysis().

◆ visitAllocaInst()

void TypeAnalyzer::visitAllocaInst ( llvm::AllocaInst & I)

Definition at line 1788 of file TypeAnalysis.cpp.

References getAnalysis(), Integer, TypeTree::Lookup(), Pointer, and updateAnalysis().

◆ visitAtomicRMWInst()

◆ visitBinaryOperation()

void TypeAnalyzer::visitBinaryOperation ( const llvm::DataLayout & DL,
llvm::Type * T,
llvm::Instruction::BinaryOps ,
llvm::Value * Args[2],
TypeTree & Ret,
TypeTree & LHS,
TypeTree & RHS,
llvm::Instruction * I )

◆ visitBinaryOperator()

void TypeAnalyzer::visitBinaryOperator ( llvm::BinaryOperator & I)

◆ visitBitCastInst()

void TypeAnalyzer::visitBitCastInst ( llvm::BitCastInst & I)

Definition at line 2541 of file TypeAnalysis.cpp.

References direction, DOWN, getAnalysis(), UP, and updateAnalysis().

◆ visitCallBase()

◆ visitCmpInst()

void TypeAnalyzer::visitCmpInst ( llvm::CmpInst & I)

◆ visitConstantExpr()

void TypeAnalyzer::visitConstantExpr ( llvm::ConstantExpr & CE)

◆ visitExtractElementInst()

void TypeAnalyzer::visitExtractElementInst ( llvm::ExtractElementInst & I)

◆ visitExtractValueInst()

void TypeAnalyzer::visitExtractValueInst ( llvm::ExtractValueInst & I)

◆ visitFPExtInst()

void TypeAnalyzer::visitFPExtInst ( llvm::FPExtInst & I)

Definition at line 2453 of file TypeAnalysis.cpp.

References TypeTree::Only(), and updateAnalysis().

◆ visitFPToSIInst()

void TypeAnalyzer::visitFPToSIInst ( llvm::FPToSIInst & I)

Definition at line 2487 of file TypeAnalysis.cpp.

References Integer, TypeTree::Only(), and updateAnalysis().

◆ visitFPToUIInst()

void TypeAnalyzer::visitFPToUIInst ( llvm::FPToUIInst & I)

Definition at line 2477 of file TypeAnalysis.cpp.

References Integer, TypeTree::Only(), and updateAnalysis().

◆ visitFPTruncInst()

void TypeAnalyzer::visitFPTruncInst ( llvm::FPTruncInst & I)

Definition at line 2465 of file TypeAnalysis.cpp.

References TypeTree::Only(), and updateAnalysis().

◆ visitGEPOperator()

◆ visitGetElementPtrInst()

void TypeAnalyzer::visitGetElementPtrInst ( llvm::GetElementPtrInst & gep)

Definition at line 1884 of file TypeAnalysis.cpp.

References visitGEPOperator().

◆ visitInsertElementInst()

void TypeAnalyzer::visitInsertElementInst ( llvm::InsertElementInst & I)

◆ visitInsertValueInst()

void TypeAnalyzer::visitInsertValueInst ( llvm::InsertValueInst & I)

◆ visitIntrinsicInst()

◆ visitIntToPtrInst()

void TypeAnalyzer::visitIntToPtrInst ( llvm::IntToPtrInst & I)

Definition at line 2521 of file TypeAnalysis.cpp.

References Anything, direction, DOWN, getAnalysis(), UP, and updateAnalysis().

◆ visitIPOCall()

◆ visitLoadInst()

void TypeAnalyzer::visitLoadInst ( llvm::LoadInst & I)

◆ visitMemTransferCommon()

◆ visitMemTransferInst()

void TypeAnalyzer::visitMemTransferInst ( llvm::MemTransferInst & MTI)

Definition at line 3516 of file TypeAnalysis.cpp.

References visitMemTransferCommon().

◆ visitPHINode()

◆ visitPtrToIntInst()

void TypeAnalyzer::visitPtrToIntInst ( llvm::PtrToIntInst & I)

Definition at line 2513 of file TypeAnalysis.cpp.

References direction, DOWN, getAnalysis(), UP, and updateAnalysis().

◆ visitSelectInst()

void TypeAnalyzer::visitSelectInst ( llvm::SelectInst & I)

◆ visitSExtInst()

void TypeAnalyzer::visitSExtInst ( llvm::SExtInst & I)

Definition at line 2438 of file TypeAnalysis.cpp.

References Integer, and updateAnalysis().

◆ visitShuffleVectorInst()

void TypeAnalyzer::visitShuffleVectorInst ( llvm::ShuffleVectorInst & I)

◆ visitSIToFPInst()

void TypeAnalyzer::visitSIToFPInst ( llvm::SIToFPInst & I)

Definition at line 2505 of file TypeAnalysis.cpp.

References Integer, TypeTree::Only(), and updateAnalysis().

◆ visitStoreInst()

void TypeAnalyzer::visitStoreInst ( llvm::StoreInst & I)

◆ visitTruncInst()

void TypeAnalyzer::visitTruncInst ( llvm::TruncInst & I)

◆ visitUIToFPInst()

void TypeAnalyzer::visitUIToFPInst ( llvm::UIToFPInst & I)

Definition at line 2497 of file TypeAnalysis.cpp.

References Integer, TypeTree::Only(), and updateAnalysis().

◆ visitValue()

void TypeAnalyzer::visitValue ( llvm::Value & val)

Definition at line 1716 of file TypeAnalysis.cpp.

References updateAnalysis(), and visitConstantExpr().

Referenced by run().

◆ visitZExtInst()

void TypeAnalyzer::visitZExtInst ( llvm::ZExtInst & I)

Member Data Documentation

◆ analysis

std::map<llvm::Value *, TypeTree> TypeAnalyzer::analysis

Intermediate conservative, but correct Type analysis results.

Definition at line 280 of file TypeAnalysis.h.

Referenced by AdjointGenerator::AdjointGenerator(), dump(), getAnalysis(), TypeResults::intType(), runPHIHypotheses(), visitConstantExpr(), and visitIntrinsicInst().

◆ BOTH

uint8_t TypeAnalyzer::BOTH = UP | DOWN
staticconstexpr

Definition at line 277 of file TypeAnalysis.h.

◆ direction

◆ DOWN

◆ DT

llvm::DominatorTree& TypeAnalyzer::DT

◆ fntypeinfo

◆ interprocedural

TypeAnalysis& TypeAnalyzer::interprocedural

◆ Invalid

bool TypeAnalyzer::Invalid

Whether an inconsistent update has been found This will only be set when direction != Both, erring otherwise.

Definition at line 269 of file TypeAnalysis.h.

Referenced by run(), runPHIHypotheses(), and visitCallBase().

◆ LI

llvm::LoopInfo& TypeAnalyzer::LI

Definition at line 286 of file TypeAnalysis.h.

Referenced by considerTBAA(), visitGEPOperator(), and visitPHINode().

◆ MST

std::shared_ptr<llvm::ModuleSlotTracker> TypeAnalyzer::MST

Cache of metadata indices, for faster printing.

Only initialized if EnzymePrintType is true

Definition at line 239 of file TypeAnalysis.h.

Referenced by considerTBAA(), dump(), visitCallBase(), visitIPOCall(), visitPHINode(), and visitSelectInst().

◆ notForAnalysis

const llvm::SmallPtrSet<llvm::BasicBlock *, 4> TypeAnalyzer::notForAnalysis

Definition at line 244 of file TypeAnalysis.h.

Referenced by considerTBAA(), getConstantAnalysis(), runPHIHypotheses(), and TypeAnalyzer().

◆ PDT

llvm::PostDominatorTree& TypeAnalyzer::PDT

Definition at line 284 of file TypeAnalysis.h.

◆ PHIRecur

bool TypeAnalyzer::PHIRecur

Definition at line 271 of file TypeAnalysis.h.

Referenced by runPHIHypotheses().

◆ SE

llvm::ScalarEvolution& TypeAnalyzer::SE

◆ TLI

llvm::TargetLibraryInfo& TypeAnalyzer::TLI

Definition at line 282 of file TypeAnalysis.h.

Referenced by visitCallBase().

◆ UP

◆ workList

llvm::SetVector<llvm::Value *, std::deque<llvm::Value *> > TypeAnalyzer::workList

List of value's which should be re-analyzed now with new information.

Definition at line 242 of file TypeAnalysis.h.

Referenced by getConstantAnalysis(), run(), TypeAnalyzer(), and visitConstantExpr().


The documentation for this class was generated from the following files: