LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Functions
InstCombineCasts.cpp File Reference
#include "InstCombine.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Support/PatternMatch.h"
#include "llvm/Target/TargetLibraryInfo.h"
Include dependency graph for InstCombineCasts.cpp:

Go to the source code of this file.

Functions

static ValueDecomposeSimpleLinearExpr (Value *Val, unsigned &Scale, uint64_t &Offset)
 
static Instruction::CastOps isEliminableCastPair (const CastInst *CI, unsigned opcode, Type *DstTy, DataLayout *TD)
 
static bool CanEvaluateTruncated (Value *V, Type *Ty)
 
static bool CanEvaluateZExtd (Value *V, Type *Ty, unsigned &BitsToClear)
 
static bool CanEvaluateSExtd (Value *V, Type *Ty)
 
static ConstantFitsInFPType (ConstantFP *CFP, const fltSemantics &Sem)
 
static ValueLookThroughFPExtensions (Value *V)
 
static InstructionOptimizeVectorResize (Value *InVal, VectorType *DestTy, InstCombiner &IC)
 
static bool isMultipleOfTypeSize (unsigned Value, Type *Ty)
 
static unsigned getTypeSizeIndex (unsigned Value, Type *Ty)
 
static bool CollectInsertionElements (Value *V, unsigned Shift, SmallVectorImpl< Value * > &Elements, Type *VecEltTy, InstCombiner &IC)
 
static ValueOptimizeIntegerToVectorInsertions (BitCastInst &CI, InstCombiner &IC)
 
static InstructionOptimizeIntToFloatBitCast (BitCastInst &CI, InstCombiner &IC)
 

Function Documentation

static bool CanEvaluateSExtd ( Value V,
Type Ty 
)
static

CanEvaluateSExtd - Return true if we can take the specified value and return it as type Ty without inserting any new casts and without changing the value of the common low bits. This is used by code that tries to promote integer operations to a wider types will allow us to eliminate the extension.

This function works on both vectors and scalars.

Definition at line 1002 of file InstCombineCasts.cpp.

References llvm::APIntOps::And(), llvm::dyn_cast(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::Value::hasOneUse(), I, llvm::APIntOps::Or(), llvm::TargetOpcode::PHI, llvm::MCID::Select, and llvm::APIntOps::Xor().

Referenced by llvm::InstCombiner::visitSExt().

static bool CanEvaluateTruncated ( Value V,
Type Ty 
)
static

CanEvaluateTruncated - Return true if we can evaluate the specified expression tree as type Ty instead of its larger type, and arrive with the same value. This is used by code that tries to eliminate truncates.

Ty will always be a type smaller than V. We should return true if trunc(V) can be computed by computing V in the smaller type. If V is an instruction, then trunc(inst(x,y)) can be computed as inst(trunc(x),trunc(y)), which only makes sense if x and y can be efficiently truncated.

This function works on both vectors and scalars.

Definition at line 335 of file InstCombineCasts.cpp.

References llvm::APIntOps::And(), llvm::dyn_cast(), llvm::SelectInst::getFalseValue(), llvm::APInt::getHighBitsSet(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getScalarSizeInBits(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), llvm::Value::hasOneUse(), I, llvm::MaskedValueIsZero(), llvm::APIntOps::Or(), llvm::TargetOpcode::PHI, llvm::MCID::Select, and llvm::APIntOps::Xor().

Referenced by CanEvaluateShifted(), and llvm::InstCombiner::visitTrunc().

static bool CanEvaluateZExtd ( Value V,
Type Ty,
unsigned BitsToClear 
)
static

CanEvaluateZExtd - Determine if the specified value can be computed in the specified wider type and produce the same low bits. If not, return false.

If this function returns true, it can also return a non-zero number of bits (in BitsToClear) which indicates that the value it computes is correct for the zero extend, but that the additional BitsToClear bits need to be zero'd out. For example, to promote something like:

B = trunc i64 A to i32 C = lshr i32 B, 8 E = zext i32 C to i64

CanEvaluateZExtd for the 'lshr' will return true, and BitsToClear will be set to 8 to indicate that the promoted value needs to have bits 24-31 cleared in addition to bits 32-63. Since an 'and' will be generated to clear the top bits anyway, doing this has no extra cost.

This function works on both vectors and scalars.

Definition at line 651 of file InstCombineCasts.cpp.

References llvm::APIntOps::And(), llvm::dyn_cast(), llvm::APInt::getHighBitsSet(), llvm::PHINode::getIncomingValue(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::Value::hasOneUse(), I, llvm::MaskedValueIsZero(), llvm::APIntOps::Or(), llvm::TargetOpcode::PHI, llvm::MCID::Select, and llvm::APIntOps::Xor().

Referenced by llvm::InstCombiner::visitZExt().

static bool CollectInsertionElements ( Value V,
unsigned  Shift,
SmallVectorImpl< Value * > &  Elements,
Type VecEltTy,
InstCombiner IC 
)
static

CollectInsertionElements - V is a value which is inserted into a vector of VecEltTy. Look through the value to see if we can decompose it into insertions into the vector. See the example in the comment for OptimizeIntegerToVectorInsertions for the pattern this handles. The type of V is always a non-zero multiple of VecEltTy's size. Shift is the number of bits between the lsb of V and the lsb of the vector.

This returns false if the pattern can't be matched or true if it can, filling in Elements with the elements found here.

Definition at line 1531 of file InstCombineCasts.cpp.

References llvm::CallingConv::C, llvm::dyn_cast(), llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::ConstantExpr::getBitCast(), llvm::Value::getContext(), llvm::InstCombiner::getDataLayout(), llvm::ConstantExpr::getLShr(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getPrimitiveSizeInBits(), llvm::ConstantExpr::getTrunc(), llvm::Value::getType(), getTypeSizeIndex(), llvm::ConstantInt::getZExtValue(), llvm::Value::hasOneUse(), llvm::DataLayout::isBigEndian(), isMultipleOfTypeSize(), llvm::APIntOps::Or(), and llvm::SmallVectorTemplateCommon< T >::size().

Referenced by OptimizeIntegerToVectorInsertions().

static Value* DecomposeSimpleLinearExpr ( Value Val,
unsigned Scale,
uint64_t &  Offset 
)
static

DecomposeSimpleLinearExpr - Analyze 'Val', seeing if it is a simple linear expression. If so, decompose it, returning some value X, such that Val is X*Scale+Offset.

Definition at line 26 of file InstCombineCasts.cpp.

References llvm::dyn_cast(), llvm::ConstantInt::get(), llvm::Value::getType(), llvm::OverflowingBinaryOperator::hasNoSignedWrap(), llvm::OverflowingBinaryOperator::hasNoUnsignedWrap(), and I.

static Constant* FitsInFPType ( ConstantFP CFP,
const fltSemantics Sem 
)
static

FitsInFPType - Return a Constant* for the specified FP constant if it fits in the specified FP type without changing its value.

Definition at line 1151 of file InstCombineCasts.cpp.

References llvm::APFloat::convert(), F(), llvm::ConstantFP::get(), llvm::Value::getContext(), llvm::ConstantFP::getValueAPF(), and llvm::APFloat::rmNearestTiesToEven.

Referenced by LookThroughFPExtensions().

static unsigned getTypeSizeIndex ( unsigned  Value,
Type Ty 
)
static

Definition at line 1517 of file InstCombineCasts.cpp.

References llvm::Type::getPrimitiveSizeInBits().

Referenced by CollectInsertionElements().

static Instruction::CastOps isEliminableCastPair ( const CastInst CI,
unsigned  opcode,
Type DstTy,
DataLayout TD 
)
static

This function is a wrapper around CastInst::isEliminableCastPair. It simply extracts arguments and returns what that function returns.

Parameters
CIThe first cast instruction
opcodeThe opcode of the second cast instruction
DstTyThe target type for the second cast instruction
TDThe target data for pointer size

Definition at line 234 of file InstCombineCasts.cpp.

References llvm::DataLayout::getIntPtrType(), llvm::CastInst::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::CastInst::isEliminableCastPair(), and llvm::Type::isPtrOrPtrVectorTy().

Referenced by llvm::InstCombiner::commonCastTransforms().

static bool isMultipleOfTypeSize ( unsigned  Value,
Type Ty 
)
static

Definition at line 1513 of file InstCombineCasts.cpp.

References llvm::Type::getPrimitiveSizeInBits().

Referenced by CollectInsertionElements().

static Value* LookThroughFPExtensions ( Value V)
static

LookThroughFPExtensions - If this is an fp extension instruction, look through it until we get the source value.

Definition at line 1162 of file InstCombineCasts.cpp.

References FitsInFPType(), llvm::Value::getContext(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getPPC_FP128Ty(), llvm::APFloat::IEEEdouble, llvm::APFloat::IEEEhalf, and llvm::APFloat::IEEEsingle.

Referenced by llvm::InstCombiner::visitFPTrunc().

static Value* OptimizeIntegerToVectorInsertions ( BitCastInst CI,
InstCombiner IC 
)
static

OptimizeIntegerToVectorInsertions - If the input is an 'or' instruction, we may be doing shifts and ors to assemble the elements of the vector manually. Try to rip the code out and replace it with insertelements. This is to optimize code like this:

tmp37 = bitcast float inc to i32 tmp38 = zext i32 tmp37 to i64 tmp31 = bitcast float inc5 to i32 tmp32 = zext i32 tmp31 to i64 tmp33 = shl i64 tmp32, 32 ins35 = or i64 tmp33, tmp38 tmp43 = bitcast i64 ins35 to <2 x float>

Into two insertelements that do "buildvector{%inc, %inc5}".

Definition at line 1639 of file InstCombineCasts.cpp.

References llvm::InstCombiner::Builder, CollectInsertionElements(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateInsertElement(), llvm::InstCombiner::getDataLayout(), llvm::SequentialType::getElementType(), llvm::IRBuilderBase::getInt32(), llvm::Constant::getNullValue(), llvm::VectorType::getNumElements(), llvm::User::getOperand(), and llvm::Value::getType().

Referenced by llvm::InstCombiner::visitBitCast().

static Instruction* OptimizeIntToFloatBitCast ( BitCastInst CI,
InstCombiner IC 
)
static
static Instruction* OptimizeVectorResize ( Value InVal,
VectorType DestTy,
InstCombiner IC 
)
static

OptimizeVectorResize - This input value (which is known to have vector type) is being zero extended or truncated to the specified vector type. Try to replace it with a shuffle (and vector/vector bitcast) if possible.

The source and destination vector types may have different element types.

Definition at line 1461 of file InstCombineCasts.cpp.

References llvm::InstCombiner::Builder, llvm::IRBuilder< preserveNames, T, Inserter >::CreateBitCast(), llvm::VectorType::get(), llvm::ConstantDataVector::get(), llvm::UndefValue::get(), llvm::Value::getContext(), llvm::SequentialType::getElementType(), llvm::Constant::getNullValue(), llvm::VectorType::getNumElements(), llvm::Type::getPrimitiveSizeInBits(), llvm::Value::getType(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), and llvm::NVPTX::PTXLdStInstCode::V2.

Referenced by llvm::InstCombiner::visitBitCast().