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)
 
const 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 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.
 
TypeAnalysis & interprocedural
 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 *, TypeTree > analysis
 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 248 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 297 of file TypeAnalysis.cpp.

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

Member Function Documentation

◆ considerTBAA()

◆ dump()

◆ getAnalysis()

◆ getCallInfo()

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

◆ 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 1380 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 1813 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 1730 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(), 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 2612 of file TypeAnalysis.cpp.

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

◆ visitAllocaInst()

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

Definition at line 1954 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 2707 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 2619 of file TypeAnalysis.cpp.

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

◆ visitFPToSIInst()

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

Definition at line 2653 of file TypeAnalysis.cpp.

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

◆ visitFPToUIInst()

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

Definition at line 2643 of file TypeAnalysis.cpp.

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

◆ visitFPTruncInst()

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

Definition at line 2631 of file TypeAnalysis.cpp.

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

◆ visitGEPOperator()

◆ visitGetElementPtrInst()

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

Definition at line 2050 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 2687 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 3638 of file TypeAnalysis.cpp.

References visitMemTransferCommon().

◆ visitPHINode()

◆ visitPtrToIntInst()

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

Definition at line 2679 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 2604 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 2671 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 2663 of file TypeAnalysis.cpp.

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

◆ visitValue()

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

Definition at line 1882 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 293 of file TypeAnalysis.h.

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

◆ BOTH

uint8_t TypeAnalyzer::BOTH = UP | DOWN
staticconstexpr

Definition at line 290 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 282 of file TypeAnalysis.h.

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

◆ LI

llvm::LoopInfo& TypeAnalyzer::LI

Definition at line 299 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 252 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 257 of file TypeAnalysis.h.

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

◆ PDT

llvm::PostDominatorTree& TypeAnalyzer::PDT

Definition at line 297 of file TypeAnalysis.h.

◆ PHIRecur

bool TypeAnalyzer::PHIRecur

Definition at line 284 of file TypeAnalysis.h.

Referenced by runPHIHypotheses().

◆ SE

llvm::ScalarEvolution& TypeAnalyzer::SE

◆ TLI

llvm::TargetLibraryInfo& TypeAnalyzer::TLI

Definition at line 295 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 255 of file TypeAnalysis.h.

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


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