LLVM  8.0.1
Functions
ConstantFold.cpp File Reference
#include "ConstantFold.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
Include dependency graph for ConstantFold.cpp:

Go to the source code of this file.

Functions

static ConstantBitCastConstantVector (Constant *CV, VectorType *DstTy)
 Convert the specified vector Constant node to the specified vector type. More...
 
static unsigned foldConstantCastPair (unsigned opc, ConstantExpr *Op, Type *DstTy)
 This function determines which opcode to use to fold two constant cast expressions together. More...
 
static ConstantFoldBitCast (Constant *V, Type *DestTy)
 
static ConstantExtractConstantBytes (Constant *C, unsigned ByteStart, unsigned ByteSize)
 V is an integer constant which only has a subset of its bytes used. More...
 
static ConstantgetFoldedSizeOf (Type *Ty, Type *DestTy, bool Folded)
 Return a ConstantExpr with type DestTy for sizeof on Ty, with any known factors factored out. More...
 
static ConstantgetFoldedAlignOf (Type *Ty, Type *DestTy, bool Folded)
 Return a ConstantExpr with type DestTy for alignof on Ty, with any known factors factored out. More...
 
static ConstantgetFoldedOffsetOf (Type *Ty, Constant *FieldNo, Type *DestTy, bool Folded)
 Return a ConstantExpr with type DestTy for offsetof on Ty and FieldNo, with any known factors factored out. More...
 
static bool isMaybeZeroSizedType (Type *Ty)
 This type is zero-sized if it's an array or structure of zero-sized types. More...
 
static int IdxCompare (Constant *C1, Constant *C2, Type *ElTy)
 Compare the two constants as though they were getelementptr indices. More...
 
static FCmpInst::Predicate evaluateFCmpRelation (Constant *V1, Constant *V2)
 This function determines if there is anything we can decide about the two constants provided. More...
 
static ICmpInst::Predicate areGlobalsPotentiallyEqual (const GlobalValue *GV1, const GlobalValue *GV2)
 
static ICmpInst::Predicate evaluateICmpRelation (Constant *V1, Constant *V2, bool isSigned)
 This function determines if there is anything we can decide about the two constants provided. More...
 
template<typename IndexTy >
static bool isInBoundsIndices (ArrayRef< IndexTy > Idxs)
 Test whether the given sequence of normalized indices is "inbounds". More...
 
static bool isIndexInRangeOfArrayType (uint64_t NumElements, const ConstantInt *CI)
 Test whether a given ConstantInt is in-range for a SequentialType. More...
 

Function Documentation

◆ areGlobalsPotentiallyEqual()

static ICmpInst::Predicate areGlobalsPotentiallyEqual ( const GlobalValue GV1,
const GlobalValue GV2 
)
static

◆ BitCastConstantVector()

static Constant* BitCastConstantVector ( Constant CV,
VectorType DstTy 
)
static

◆ evaluateFCmpRelation()

static FCmpInst::Predicate evaluateFCmpRelation ( Constant V1,
Constant V2 
)
static

This function determines if there is anything we can decide about the two constants provided.

This doesn't need to handle simple things like ConstantFP comparisons, but should instead handle ConstantExprs. If we can determine that the two constants have a particular relation to each other, we should return the corresponding FCmpInst predicate, otherwise return FCmpInst::BAD_FCMP_PREDICATE. This is used below in ConstantFoldCompareInstruction.

To simplify this code we canonicalize the relation so that the first operand is always the most "complex" of the two. We consider ConstantFP to be the simplest, and ConstantExprs to be the most complex.

Definition at line 1359 of file ConstantFold.cpp.

References assert(), llvm::CmpInst::BAD_FCMP_PREDICATE, llvm::dyn_cast(), llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLT, llvm::ConstantExpr::getFCmp(), llvm::ConstantExpr::getOpcode(), llvm::CmpInst::getSwappedPredicate(), llvm::Value::getType(), llvm::ConstantInt::isZero(), and llvm::RISCVFenceField::R.

Referenced by llvm::ConstantFoldCompareInstruction().

◆ evaluateICmpRelation()

static ICmpInst::Predicate evaluateICmpRelation ( Constant V1,
Constant V2,
bool  isSigned 
)
static

This function determines if there is anything we can decide about the two constants provided.

This doesn't need to handle simple things like integer comparisons, but should instead handle ConstantExprs and GlobalValues. If we can determine that the two constants have a particular relation to each other, we should return the corresponding ICmp predicate, otherwise return ICmpInst::BAD_ICMP_PREDICATE.

To simplify this code we canonicalize the relation so that the first operand is always the most "complex" of the two. We consider simple constants (like ConstantInt) to be the simplest, followed by GlobalValues, followed by ConstantExpr's (the most complex).

Definition at line 1447 of file ConstantFold.cpp.

References areGlobalsPotentiallyEqual(), assert(), llvm::CmpInst::BAD_ICMP_PREDICATE, llvm::dyn_cast(), llvm::gep_type_begin(), llvm::ConstantExpr::getICmp(), llvm::generic_gep_type_iterator< ItTy >::getIndexedType(), llvm::Constant::getNullValue(), llvm::User::getNumOperands(), llvm::ConstantExpr::getOpcode(), llvm::User::getOperand(), llvm::CmpInst::getSwappedPredicate(), llvm::Value::getType(), llvm::GEPOperator::hasAllZeroIndices(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, IdxCompare(), llvm::ConstantExpr::isGEPWithNoNotionalOverIndexing(), llvm::Type::isIntOrPtrTy(), llvm::Constant::isNullValue(), llvm::ConstantInt::isZero(), llvm::NullPointerIsDefined(), pred, llvm::RISCVFenceField::R, and llvm::NVPTX::PTXLdStInstCode::V2.

Referenced by llvm::ConstantFoldCompareInstruction().

◆ ExtractConstantBytes()

static Constant* ExtractConstantBytes ( Constant C,
unsigned  ByteStart,
unsigned  ByteSize 
)
static

V is an integer constant which only has a subset of its bytes used.

The bytes used are indicated by ByteStart (which is the first byte used, counting from the least significant byte) and ByteSize, which is the number of bytes used.

This function analyzes the specified constant to see if the specified byte range can be returned as a simplified constant. If so, the constant is returned, otherwise null is returned.

Definition at line 212 of file ConstantFold.cpp.

References assert(), C, llvm::dyn_cast(), llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::ConstantExpr::getAnd(), getBitWidth(), llvm::Value::getContext(), llvm::ConstantExpr::getLShr(), llvm::Constant::getNullValue(), llvm::User::getOperand(), llvm::ConstantExpr::getOr(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), llvm::Type::isIntegerTy(), llvm::Constant::isNullValue(), llvm::APInt::lshrInPlace(), and llvm::APInt::trunc().

Referenced by llvm::ConstantFoldCastInstruction().

◆ FoldBitCast()

static Constant* FoldBitCast ( Constant V,
Type DestTy 
)
static

◆ foldConstantCastPair()

static unsigned foldConstantCastPair ( unsigned  opc,
ConstantExpr Op,
Type DstTy 
)
static

This function determines which opcode to use to fold two constant cast expressions together.

It uses CastInst::isEliminableCastPair to determine the opcode. Consequently its just a wrapper around that function. Determine if it is valid to fold a cast of a cast

Parameters
opcopcode of the second cast constant expression
Opthe first cast constant expression
DstTydestination type of the first cast

Definition at line 76 of file ConstantFold.cpp.

References assert(), llvm::Type::getContext(), llvm::Type::getInt64Ty(), llvm::ConstantExpr::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::Instruction::isCast(), llvm::ConstantExpr::isCast(), llvm::CastInst::isEliminableCastPair(), and llvm::Type::isFirstClassType().

Referenced by llvm::ConstantFoldCastInstruction().

◆ getFoldedAlignOf()

static Constant* getFoldedAlignOf ( Type Ty,
Type DestTy,
bool  Folded 
)
static

Return a ConstantExpr with type DestTy for alignof on Ty, with any known factors factored out.

If Folded is false, return null if no factoring was possible, to avoid endlessly bouncing an unfoldable expression back into the top-level folder.

Definition at line 406 of file ConstantFold.cpp.

References C, llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::PointerType::get(), llvm::ConstantExpr::getAlignOf(), llvm::ConstantExpr::getCast(), and llvm::CastInst::getCastOpcode().

Referenced by llvm::ConstantFoldCastInstruction().

◆ getFoldedOffsetOf()

static Constant* getFoldedOffsetOf ( Type Ty,
Constant FieldNo,
Type DestTy,
bool  Folded 
)
static

Return a ConstantExpr with type DestTy for offsetof on Ty and FieldNo, with any known factors factored out.

If Folded is false, return null if no factoring was possible, to avoid endlessly bouncing an unfoldable expression back into the top-level folder.

Definition at line 470 of file ConstantFold.cpp.

References C, E, llvm::ConstantExpr::getCast(), llvm::CastInst::getCastOpcode(), getFoldedSizeOf(), llvm::ConstantExpr::getNUWMul(), llvm::ConstantExpr::getOffsetOf(), and N.

Referenced by llvm::ConstantFoldCastInstruction().

◆ getFoldedSizeOf()

static Constant* getFoldedSizeOf ( Type Ty,
Type DestTy,
bool  Folded 
)
static

Return a ConstantExpr with type DestTy for sizeof on Ty, with any known factors factored out.

If Folded is false, return null if no factoring was possible, to avoid endlessly bouncing an unfoldable expression back into the top-level folder.

Definition at line 351 of file ConstantFold.cpp.

References C, E, llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::PointerType::get(), llvm::ConstantExpr::getCast(), llvm::CastInst::getCastOpcode(), llvm::Constant::getNullValue(), llvm::ConstantExpr::getNUWMul(), llvm::ConstantExpr::getSizeOf(), and N.

Referenced by llvm::ConstantFoldCastInstruction(), and getFoldedOffsetOf().

◆ IdxCompare()

static int IdxCompare ( Constant C1,
Constant C2,
Type ElTy 
)
static

Compare the two constants as though they were getelementptr indices.

This allows coercion of the types to be the same thing.

If the two constants are the "same" (after coercion), return 0. If the first is less than the second, return -1, if the second is less than the first, return 1. If the constants are not integral, return -2.

Definition at line 1315 of file ConstantFold.cpp.

References isMaybeZeroSizedType().

Referenced by evaluateICmpRelation().

◆ isInBoundsIndices()

template<typename IndexTy >
static bool isInBoundsIndices ( ArrayRef< IndexTy >  Idxs)
static

Test whether the given sequence of normalized indices is "inbounds".

Definition at line 2026 of file ConstantFold.cpp.

References llvm::ArrayRef< T >::empty(), and llvm::ArrayRef< T >::size().

Referenced by llvm::ConstantFoldGetElementPtr().

◆ isIndexInRangeOfArrayType()

static bool isIndexInRangeOfArrayType ( uint64_t  NumElements,
const ConstantInt CI 
)
static

Test whether a given ConstantInt is in-range for a SequentialType.

Definition at line 2052 of file ConstantFold.cpp.

References llvm::APInt::getMinSignedBits(), llvm::ConstantInt::getSExtValue(), and llvm::ConstantInt::getValue().

Referenced by llvm::ConstantFoldGetElementPtr().

◆ isMaybeZeroSizedType()

static bool isMaybeZeroSizedType ( Type Ty)
static

This type is zero-sized if it's an array or structure of zero-sized types.

The only leaf zero-sized type is an empty structure.

Definition at line 1293 of file ConstantFold.cpp.

Referenced by IdxCompare().