LLVM  3.7.0
Functions
ConstantFolding.cpp File Reference
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Config/config.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include <cerrno>
#include <cmath>
#include <fenv.h>
Include dependency graph for ConstantFolding.cpp:

Go to the source code of this file.

Functions

static ConstantFoldBitCast (Constant *C, Type *DestTy, const DataLayout &DL)
 Constant fold bitcast, symbolically evaluating it with DataLayout. More...
 
static bool IsConstantOffsetFromGlobal (Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL)
 If this constant is a constant offset from a global, return the global and the constant. More...
 
static bool ReadDataFromGlobal (Constant *C, uint64_t ByteOffset, unsigned char *CurPtr, unsigned BytesLeft, const DataLayout &DL)
 Recursive helper to read bits out of global. More...
 
static ConstantFoldReinterpretLoadFromConstPtr (Constant *C, const DataLayout &DL)
 
static ConstantConstantFoldLoadThroughBitcast (ConstantExpr *CE, const DataLayout &DL)
 
static ConstantConstantFoldLoadInst (const LoadInst *LI, const DataLayout &DL)
 
static ConstantSymbolicallyEvaluateBinop (unsigned Opc, Constant *Op0, Constant *Op1, const DataLayout &DL)
 One of Op0/Op1 is a constant expression. More...
 
static ConstantCastGEPIndices (Type *SrcTy, ArrayRef< Constant * > Ops, Type *ResultTy, const DataLayout &DL, const TargetLibraryInfo *TLI)
 If array indices are not pointer-sized integers, explicitly cast them so that they aren't implicitly casted by the getelementptr. More...
 
static ConstantStripPtrCastKeepAS (Constant *Ptr)
 Strip the pointer casts, but preserve the address space information. More...
 
static ConstantSymbolicallyEvaluateGEP (Type *SrcTy, ArrayRef< Constant * > Ops, Type *ResultTy, const DataLayout &DL, const TargetLibraryInfo *TLI)
 If we can symbolically evaluate the GEP constant expression, do so. More...
 
static ConstantConstantFoldConstantExpressionImpl (const ConstantExpr *CE, const DataLayout &DL, const TargetLibraryInfo *TLI, SmallPtrSetImpl< ConstantExpr * > &FoldedOps)
 
static ConstantGetConstantFoldFPValue (double V, Type *Ty)
 
static ConstantConstantFoldFP (double(*NativeFP)(double), double V, Type *Ty)
 
static ConstantConstantFoldBinaryFP (double(*NativeFP)(double, double), double V, double W, Type *Ty)
 
static ConstantConstantFoldConvertToInt (const APFloat &Val, bool roundTowardZero, Type *Ty)
 Attempt to fold an SSE floating point to integer conversion of a constant floating point. More...
 
static double getValueAsDouble (ConstantFP *Op)
 
static ConstantConstantFoldScalarCall (StringRef Name, unsigned IntrinsicID, Type *Ty, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI)
 
static ConstantConstantFoldVectorCall (StringRef Name, unsigned IntrinsicID, VectorType *VTy, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI)
 

Function Documentation

static Constant* CastGEPIndices ( Type SrcTy,
ArrayRef< Constant * >  Ops,
Type ResultTy,
const DataLayout DL,
const TargetLibraryInfo TLI 
)
static
static Constant* ConstantFoldBinaryFP ( double(*)(double, double)  NativeFP,
double  V,
double  W,
Type Ty 
)
static

Definition at line 1349 of file ConstantFolding.cpp.

References GetConstantFoldFPValue().

Referenced by ConstantFoldScalarCall().

static Constant* ConstantFoldConstantExpressionImpl ( const ConstantExpr CE,
const DataLayout DL,
const TargetLibraryInfo TLI,
SmallPtrSetImpl< ConstantExpr * > &  FoldedOps 
)
static
static Constant* ConstantFoldConvertToInt ( const APFloat Val,
bool  roundTowardZero,
Type Ty 
)
static

Attempt to fold an SSE floating point to integer conversion of a constant floating point.

If roundTowardZero is false, the default IEEE rounding is used (toward nearest, ties to even). This matches the behavior of the non-truncating SSE instructions in the default rounding mode. The desired integer type Ty is used to select how many bits are available for the result. Returns null if the conversion cannot be performed, otherwise returns the Constant value resulting from the conversion.

Definition at line 1368 of file ConstantFolding.cpp.

References llvm::APFloat::convertToInteger(), llvm::ConstantInt::get(), llvm::Type::getIntegerBitWidth(), llvm::APFloat::opInexact, llvm::APFloat::opOK, llvm::APFloat::rmNearestTiesToEven, llvm::APFloat::rmTowardZero, and llvm::sys::fs::status().

Referenced by ConstantFoldScalarCall().

static Constant* ConstantFoldFP ( double(*)(double)  NativeFP,
double  V,
Type Ty 
)
static

Definition at line 1337 of file ConstantFolding.cpp.

References GetConstantFoldFPValue().

Referenced by ConstantFoldScalarCall().

static Constant* ConstantFoldLoadInst ( const LoadInst LI,
const DataLayout DL 
)
static
static Constant* ConstantFoldLoadThroughBitcast ( ConstantExpr CE,
const DataLayout DL 
)
static
static Constant* ConstantFoldScalarCall ( StringRef  Name,
unsigned  IntrinsicID,
Type Ty,
ArrayRef< Constant * >  Operands,
const TargetLibraryInfo TLI 
)
static

We only fold functions with finite arguments. Folding NaN and inf is likely to be aborted with an exception anyway, and some host libms have known errors raising exceptions.

Currently APFloat versions of these functions do not exist, so we use the host native double versions. Float versions are not called directly but for all these it is true (float)(f((double)arg)) == f(arg). Long double not supported yet.

Definition at line 1402 of file ConstantFolding.cpp.

References llvm::lltok::APFloat, ConstantFoldBinaryFP(), ConstantFoldConvertToInt(), ConstantFoldFP(), llvm::APFloat::convert(), llvm::APFloat::copySign(), llvm::APFloat::fusedMultiplyAdd(), llvm::ConstantInt::get(), llvm::ConstantFP::get(), llvm::ConstantStruct::get(), llvm::UndefValue::get(), llvm::Constant::getAggregateElement(), llvm::Type::getContext(), llvm::Type::getFltSemantics(), llvm::Type::getInt1Ty(), getValueAsDouble(), llvm::TargetLibraryInfo::has(), llvm::APFloat::IEEEhalf, llvm::Type::isDoubleTy(), llvm::Type::isFloatTy(), llvm::Type::isHalfTy(), llvm_unreachable, llvm::Log2(), llvm::maxnum(), llvm::minnum(), llvm::APFloat::opInvalidOp, llvm::APFloat::opOK, llvm::APFloat::rmNearestTiesToAway, llvm::APFloat::rmNearestTiesToEven, llvm::APFloat::roundToIntegral(), llvm::APInt::sadd_ov(), llvm::ArrayRef< T >::size(), llvm::APInt::smul_ov(), llvm::APInt::ssub_ov(), llvm::sys::fs::status(), llvm::APInt::uadd_ov(), llvm::APInt::umul_ov(), llvm::APInt::usub_ov(), and llvm::NVPTX::PTXLdStInstCode::V2.

Referenced by llvm::ConstantFoldCall(), and ConstantFoldVectorCall().

static Constant* ConstantFoldVectorCall ( StringRef  Name,
unsigned  IntrinsicID,
VectorType VTy,
ArrayRef< Constant * >  Operands,
const TargetLibraryInfo TLI 
)
static
static Constant* FoldBitCast ( Constant C,
Type DestTy,
const DataLayout DL 
)
static

Constant fold bitcast, symbolically evaluating it with DataLayout.

This always returns a non-null constant, but it may be a ConstantExpr if unfoldable.

Definition at line 53 of file ConstantFolding.cpp.

References llvm::dyn_cast(), llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::VectorType::get(), llvm::ConstantVector::get(), llvm::Constant::getAggregateElement(), llvm::Constant::getAllOnesValue(), llvm::ConstantExpr::getBitCast(), llvm::Value::getContext(), llvm::ConstantDataSequential::getElementAsInteger(), llvm::SequentialType::getElementType(), llvm::Type::getIntNTy(), llvm::ConstantExpr::getIntToPtr(), llvm::ConstantExpr::getLShr(), llvm::Constant::getNullValue(), llvm::VectorType::getNumElements(), llvm::ConstantExpr::getOr(), llvm::Type::getPrimitiveSizeInBits(), llvm::ConstantExpr::getShl(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), llvm::DataLayout::getTypeAllocSizeInBits(), llvm::DataLayout::getTypeSizeInBits(), llvm::Type::getVectorElementType(), llvm::Type::getVectorNumElements(), llvm::ConstantExpr::getZExt(), llvm::Constant::isAllOnesValue(), llvm::Type::isFloatingPointTy(), llvm::DataLayout::isLittleEndian(), llvm::Constant::isNullValue(), llvm::Type::isPointerTy(), llvm::Type::isPtrOrPtrVectorTy(), llvm::Type::isX86_MMXTy(), IT(), and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

Referenced by llvm::ConstantFoldInstOperands(), FoldReinterpretLoadFromConstPtr(), ReadDataFromGlobal(), and SymbolicallyEvaluateGEP().

static Constant* FoldReinterpretLoadFromConstPtr ( Constant C,
const DataLayout DL 
)
static
static Constant* GetConstantFoldFPValue ( double  V,
Type Ty 
)
static
static double getValueAsDouble ( ConstantFP Op)
static
static bool IsConstantOffsetFromGlobal ( Constant C,
GlobalValue *&  GV,
APInt Offset,
const DataLayout DL 
)
static

If this constant is a constant offset from a global, return the global and the constant.

Because of constantexprs, this function is recursive.

Definition at line 236 of file ConstantFolding.cpp.

References llvm::GEPOperator::accumulateConstantOffset(), llvm::dyn_cast(), GEP, llvm::ConstantExpr::getOpcode(), llvm::User::getOperand(), llvm::DataLayout::getPointerTypeSizeInBits(), llvm::GlobalValue::getType(), and llvm::Value::getType().

Referenced by FoldReinterpretLoadFromConstPtr(), and SymbolicallyEvaluateBinop().

static bool ReadDataFromGlobal ( Constant C,
uint64_t  ByteOffset,
unsigned char *  CurPtr,
unsigned  BytesLeft,
const DataLayout DL 
)
static
static Constant* StripPtrCastKeepAS ( Constant Ptr)
static
static Constant* SymbolicallyEvaluateBinop ( unsigned  Opc,
Constant Op0,
Constant Op1,
const DataLayout DL 
)
static

One of Op0/Op1 is a constant expression.

Attempt to symbolically evaluate the result of a binary operator merging these together. If target data info is available, it is provided as DL, otherwise DL is null.

Definition at line 620 of file ConstantFolding.cpp.

References llvm::APIntOps::And(), llvm::computeKnownBits(), llvm::ConstantInt::get(), llvm::Type::getScalarType(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), IsConstantOffsetFromGlobal(), and llvm::APInt::zextOrTrunc().

Referenced by llvm::ConstantFoldInstOperands().

static Constant* SymbolicallyEvaluateGEP ( Type SrcTy,
ArrayRef< Constant * >  Ops,
Type ResultTy,
const DataLayout DL,
const TargetLibraryInfo TLI 
)
static