LLVM  14.0.0git
Macros | Functions
Evaluator.cpp File Reference
#include "llvm/Transforms/Utils/Evaluator.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <iterator>
Include dependency graph for Evaluator.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "evaluator"
 

Functions

static bool isSimpleEnoughValueToCommit (Constant *C, SmallPtrSetImpl< Constant * > &SimpleConstants, const DataLayout &DL)
 
static bool isSimpleEnoughValueToCommitHelper (Constant *C, SmallPtrSetImpl< Constant * > &SimpleConstants, const DataLayout &DL)
 Return true if the specified constant can be handled by the code generator. More...
 
static bool isSimpleEnoughPointerToCommit (Constant *C, const DataLayout &DL)
 Return true if this constant is simple enough for us to understand. More...
 
static ConstantevaluateBitcastFromPtr (Constant *Ptr, const DataLayout &DL, const TargetLibraryInfo *TLI, std::function< Constant *(Constant *)> TryLoad)
 Apply TryLoad to Ptr. More...
 
static ConstantgetInitializer (Constant *C)
 
static FunctiongetFunction (Constant *C)
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "evaluator"

Definition at line 42 of file Evaluator.cpp.

Function Documentation

◆ evaluateBitcastFromPtr()

static Constant* evaluateBitcastFromPtr ( Constant Ptr,
const DataLayout DL,
const TargetLibraryInfo TLI,
std::function< Constant *(Constant *)>  TryLoad 
)
static

Apply TryLoad to Ptr.

If this returns nullptr, introspect the pointer's type and walk down through the initial elements to obtain additional pointers to try. Returns the first non-null return value from TryLoad, or nullptr if the type can't be introspected further.

Definition at line 182 of file Evaluator.cpp.

References llvm::ConstantFoldConstant(), DL, llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::Type::getContext(), llvm::ConstantExpr::getGetElementPtr(), and llvm::Value::getType().

◆ getFunction()

static Function* getFunction ( Constant C)
static

◆ getInitializer()

static Constant* getInitializer ( Constant C)
static

Definition at line 204 of file Evaluator.cpp.

Referenced by splitGlobal().

◆ isSimpleEnoughPointerToCommit()

static bool isSimpleEnoughPointerToCommit ( Constant C,
const DataLayout DL 
)
static

Return true if this constant is simple enough for us to understand.

In particular, if it is a cast to anything other than from one pointer type to another pointer type, we punt. We basically just support direct accesses to globals and GEP's of globals. This should be kept up to date with CommitValueTo.

Definition at line 130 of file Evaluator.cpp.

References llvm::ConstantFoldLoadThroughGEPConstantExpr(), DL, llvm::GlobalVariable::getInitializer(), llvm::GlobalVariable::hasUniqueInitializer(), and llvm::ConstantInt::isZero().

◆ isSimpleEnoughValueToCommit()

static bool isSimpleEnoughValueToCommit ( Constant C,
SmallPtrSetImpl< Constant * > &  SimpleConstants,
const DataLayout DL 
)
inlinestatic

◆ isSimpleEnoughValueToCommitHelper()

static bool isSimpleEnoughValueToCommitHelper ( Constant C,
SmallPtrSetImpl< Constant * > &  SimpleConstants,
const DataLayout DL 
)
static

Return true if the specified constant can be handled by the code generator.

We don't want to generate something like: void *X = &X/42; because the code generator doesn't have a relocation that can handle that.

This function should be called if C was not found (but just got inserted) in SimpleConstants to avoid having to rescan the same constants all the time.

Definition at line 60 of file Evaluator.cpp.

References llvm::MCID::Add, DL, llvm::numbers::e, i, and isSimpleEnoughValueToCommit().

Referenced by isSimpleEnoughValueToCommit().