|
LLVM
3.7.0
|
#include "InstCombineInternal.h"#include "llvm/ADT/APSInt.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/ConstantFolding.h"#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/Analysis/MemoryBuiltins.h"#include "llvm/IR/ConstantRange.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/GetElementPtrTypeIterator.h"#include "llvm/IR/IntrinsicInst.h"#include "llvm/IR/PatternMatch.h"#include "llvm/Support/CommandLine.h"#include "llvm/Support/Debug.h"#include "llvm/Analysis/TargetLibraryInfo.h"Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "instcombine" |
Functions | |
| STATISTIC (NumSel,"Number of select opts") | |
| static ConstantInt * | getOne (Constant *C) |
| static ConstantInt * | ExtractElement (Constant *V, Constant *Idx) |
| static bool | HasAddOverflow (ConstantInt *Result, ConstantInt *In1, ConstantInt *In2, bool IsSigned) |
| static bool | AddWithOverflow (Constant *&Result, Constant *In1, Constant *In2, bool IsSigned=false) |
| AddWithOverflow - Compute Result = In1+In2, returning true if the result overflowed for this type. More... | |
| static bool | HasSubOverflow (ConstantInt *Result, ConstantInt *In1, ConstantInt *In2, bool IsSigned) |
| static bool | SubWithOverflow (Constant *&Result, Constant *In1, Constant *In2, bool IsSigned=false) |
| SubWithOverflow - Compute Result = In1-In2, returning true if the result overflowed for this type. More... | |
| static bool | isSignBitCheck (ICmpInst::Predicate pred, ConstantInt *RHS, bool &TrueIfSigned) |
| isSignBitCheck - Given an exploded icmp instruction, return true if the comparison only checks the sign bit. More... | |
| static bool | isSignTest (ICmpInst::Predicate &pred, const ConstantInt *RHS) |
| Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the predicate accordingly. More... | |
| static bool | isHighOnes (const ConstantInt *CI) |
| static void | ComputeSignedMinMaxValuesFromKnownBits (const APInt &KnownZero, const APInt &KnownOne, APInt &Min, APInt &Max) |
| ComputeSignedMinMaxValuesFromKnownBits - Given a signed integer type and a set of known zero and one bits, compute the maximum and minimum values that could have the specified known zero and known one bits, returning them in min/max. More... | |
| static void | ComputeUnsignedMinMaxValuesFromKnownBits (const APInt &KnownZero, const APInt &KnownOne, APInt &Min, APInt &Max) |
| static Value * | EvaluateGEPOffsetExpression (User *GEP, InstCombiner &IC, const DataLayout &DL) |
| EvaluateGEPOffsetExpression - Return a value that can be used to compare the offset implied by a GEP to zero. More... | |
| static Instruction * | ProcessUGT_ADDCST_ADD (ICmpInst &I, Value *A, Value *B, ConstantInt *CI2, ConstantInt *CI1, InstCombiner &IC) |
| ProcessUGT_ADDCST_ADD - The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of the form: sum = a + b if (sum+128 >u 255) Then replace it with llvm.sadd.with.overflow.i8. More... | |
| static Instruction * | ProcessUMulZExtIdiom (ICmpInst &I, Value *MulVal, Value *OtherVal, InstCombiner &IC) |
| Recognize and process idiom involving test for multiplication overflow. More... | |
| static APInt | DemandedBitsLHSMask (ICmpInst &I, unsigned BitWidth, bool isSignCheck) |
| static bool | swapMayExposeCSEOpportunities (const Value *Op0, const Value *Op1) |
Check if the order of Op0 and Op1 as operand in an ICmpInst should be swapped. More... | |
| static bool | isChainSelectCmpBranch (const SelectInst *SI) |
| true when the instruction sequence within a block is select-cmp-br. More... | |
| #define DEBUG_TYPE "instcombine" |
Definition at line 32 of file InstCombineCompares.cpp.
|
static |
AddWithOverflow - Compute Result = In1+In2, returning true if the result overflowed for this type.
Definition at line 60 of file InstCombineCompares.cpp.
References ExtractElement(), llvm::ConstantInt::get(), llvm::ConstantExpr::getAdd(), llvm::Value::getContext(), llvm::Type::getInt32Ty(), llvm::Value::getType(), and HasAddOverflow().
Referenced by llvm::InstCombiner::FoldICmpDivCst().
|
static |
ComputeSignedMinMaxValuesFromKnownBits - Given a signed integer type and a set of known zero and one bits, compute the maximum and minimum values that could have the specified known zero and known one bits, returning them in min/max.
Definition at line 180 of file InstCombineCompares.cpp.
References llvm::APInt::clearBit(), llvm::APInt::getBitWidth(), and llvm::APInt::setBit().
Referenced by llvm::InstCombiner::visitICmpInst().
|
static |
Definition at line 204 of file InstCombineCompares.cpp.
References llvm::APInt::getBitWidth().
Referenced by llvm::InstCombiner::visitICmpInst().
Definition at line 2440 of file InstCombineCompares.cpp.
References llvm::APInt::countTrailingOnes(), llvm::APInt::countTrailingZeros(), llvm::dyn_cast(), llvm::APInt::getAllOnesValue(), llvm::APInt::getLowBitsSet(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::APInt::getSignBit(), llvm::ConstantInt::getValue(), llvm::CmpInst::ICMP_UGT, and llvm::CmpInst::ICMP_ULT.
Referenced by llvm::InstCombiner::visitICmpInst().
|
static |
EvaluateGEPOffsetExpression - Return a value that can be used to compare the offset implied by a GEP to zero.
For example, if we have &A[i], we want to return 'i' for "icmp ne i, 0". Note that, in general, indices can be complex, and scales are involved. The above expression would also be legal to codegen as "icmp ne (i*4), 0" (assuming A is a pointer to i32). This later form is less amenable to optimization though, and we are allowed to generate the first by knowing that pointer arithmetic doesn't overflow.
If we can't emit an optimized form for this expression, this returns null.
Definition at line 510 of file InstCombineCompares.cpp.
References llvm::InstCombiner::Builder, llvm::IRBuilder< preserveNames, T, Inserter >::CreateAdd(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateIntCast(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateTrunc(), llvm::dyn_cast(), llvm::gep_type_begin(), llvm::ConstantInt::get(), llvm::StructLayout::getElementOffset(), llvm::generic_gep_type_iterator< ItTy >::getIndexedType(), llvm::Type::getIntegerBitWidth(), llvm::DataLayout::getIntPtrType(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::Type::getPrimitiveSizeInBits(), llvm::ConstantInt::getSExtValue(), llvm::DataLayout::getStructLayout(), llvm::Value::getType(), llvm::DataLayout::getTypeAllocSize(), llvm::ConstantInt::getZExtValue(), and llvm::ConstantInt::isZero().
Referenced by llvm::InstCombiner::FoldGEPICmp().
|
static |
Definition at line 43 of file InstCombineCompares.cpp.
References llvm::ConstantExpr::getExtractElement().
Referenced by AddWithOverflow(), llvm::ExtractElementInst::classof(), collectFailStats(), llvm::ConstantFoldInstOperands(), llvm::ConstantExprKeyType::create(), llvm::objcarc::GetARCInstKind(), llvm::ConstantExpr::getAsInstruction(), llvm::ConstantExpr::getExtractElement(), llvm::BasicTTIImplBase< AMDGPUTTIImpl >::getInterleavedMemoryOpCost(), llvm::PPCTTIImpl::getMemoryOpCost(), llvm::Instruction::getOpcodeName(), getScalarizationOverhead(), llvm::ARMTTIImpl::getVectorInstrCost(), llvm::ConstantExpr::getWithOperands(), llvm::TargetLoweringBase::InstructionOpcodeToISD(), llvm::SimplifyInstruction(), SubWithOverflow(), tryPromoteAllocaToVector(), WriteConstants(), and WriteInstruction().
|
static |
Definition at line 39 of file InstCombineCompares.cpp.
References llvm::ConstantInt::get(), and llvm::Value::getType().
Referenced by llvm::InstCombiner::FoldICmpDivCst().
|
static |
Definition at line 47 of file InstCombineCompares.cpp.
References llvm::ConstantInt::getValue(), llvm::ConstantInt::isNegative(), llvm::APInt::sgt(), llvm::APInt::slt(), and llvm::APInt::ult().
Referenced by AddWithOverflow().
|
static |
Definition at line 81 of file InstCombineCompares.cpp.
References llvm::ConstantInt::getValue(), llvm::ConstantInt::isNegative(), llvm::APInt::sgt(), llvm::APInt::slt(), and llvm::APInt::ugt().
Referenced by SubWithOverflow().
|
static |
true when the instruction sequence within a block is select-cmp-br.
Definition at line 2552 of file InstCombineCompares.cpp.
References llvm::dyn_cast(), llvm::User::getOperand(), llvm::Instruction::getParent(), and llvm::BasicBlock::getTerminator().
Referenced by llvm::InstCombiner::replacedSelectWithOperand().
|
static |
Definition at line 172 of file InstCombineCompares.cpp.
References llvm::ConstantInt::getValue().
Referenced by llvm::InstCombiner::visitICmpInstWithInstAndIntCst().
|
static |
isSignBitCheck - Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
If it only checks the sign bit, set TrueIfSigned if the result of the comparison is true when the input value is signed.
Definition at line 120 of file InstCombineCompares.cpp.
References llvm::ConstantInt::getValue(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::Constant::isAllOnesValue(), llvm::ConstantInt::isMaxValue(), llvm::APInt::isSignBit(), and llvm::ConstantInt::isZero().
Referenced by llvm::InstCombiner::visitICmpInst(), and llvm::InstCombiner::visitICmpInstWithInstAndIntCst().
|
static |
Returns true if the exploded icmp can be expressed as a signed comparison to zero and updates the predicate accordingly.
The signedness of the comparison is preserved.
Definition at line 148 of file InstCombineCompares.cpp.
References llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::Constant::isAllOnesValue(), llvm::ConstantInt::isOne(), llvm::ICmpInst::isRelational(), llvm::CmpInst::isSigned(), and llvm::ConstantInt::isZero().
Referenced by llvm::InstCombiner::visitICmpInstWithInstAndIntCst().
|
static |
ProcessUGT_ADDCST_ADD - The caller has matched a pattern of the form: I = icmp ugt (add (add A, B), CI2), CI1 If this is of the form: sum = a + b if (sum+128 >u 255) Then replace it with llvm.sadd.with.overflow.i8.
Definition at line 2031 of file InstCombineCompares.cpp.
References llvm::InstCombiner::Builder, llvm::Call, llvm::InstCombiner::ComputeNumSignBits(), llvm::APInt::countTrailingZeros(), llvm::ExtractValueInst::Create(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateCall(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateExtractValue(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateTrunc(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateZExt(), llvm::dyn_cast(), F(), llvm::IntegerType::get(), llvm::ConstantInt::getBitWidth(), llvm::Value::getContext(), llvm::Intrinsic::getDeclaration(), llvm::APInt::getLowBitsSet(), llvm::Value::getName(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::Type::getPrimitiveSizeInBits(), llvm::Value::getType(), llvm::ConstantInt::getValue(), llvm::Value::hasOneUse(), llvm::APInt::isPowerOf2(), llvm::InstCombiner::ReplaceInstUsesWith(), llvm::IRBuilderBase::SetInsertPoint(), and llvm::Value::users().
Referenced by llvm::InstCombiner::visitICmpInst().
|
static |
Recognize and process idiom involving test for multiplication overflow.
The caller has matched a pattern of the form: I = cmp u (mul(zext A, zext B), V The function checks if this is a test for overflow and if so replaces multiplication with call to 'mul.with.overflow' intrinsic.
| I | Compare instruction. |
| MulVal | Result of 'mult' instruction. It is one of the arguments of the compare instruction. Must be of integer type. |
| OtherVal | The other argument of compare instruction. |
Definition at line 2217 of file InstCombineCompares.cpp.
References llvm::ARM_PROC::A, llvm::InstCombineWorklist::Add(), llvm::APIntOps::And(), llvm::InstCombiner::Builder, llvm::Call, llvm::APInt::countLeadingZeros(), llvm::ExtractValueInst::Create(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateAnd(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateCall(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateExtractValue(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilder< preserveNames, T, Inserter >::CreateZExt(), llvm::APInt::eq(), F(), llvm::ConstantInt::getBitWidth(), llvm::APInt::getBitWidth(), llvm::Intrinsic::getDeclaration(), llvm::APInt::getMaxValue(), llvm::APInt::getOneBitSet(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::BasicBlock::getParent(), llvm::GlobalValue::getParent(), llvm::CmpInst::getPredicate(), llvm::Type::getPrimitiveSizeInBits(), llvm::Value::getType(), llvm::ConstantInt::getValue(), llvm::Value::hasNUsesOrMore(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::APInt::isPowerOf2(), llvm_unreachable, llvm::APInt::logBase2(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::InstCombiner::ReplaceInstUsesWith(), llvm::IRBuilderBase::SetInsertPoint(), llvm::User::setOperand(), llvm::APInt::trunc(), llvm::Value::users(), llvm::InstCombiner::Worklist, and llvm::APInt::zext().
Referenced by llvm::InstCombiner::visitICmpInst().
| STATISTIC | ( | NumSel | , |
| "Number of select opts" | |||
| ) |
|
static |
SubWithOverflow - Compute Result = In1-In2, returning true if the result overflowed for this type.
Definition at line 95 of file InstCombineCompares.cpp.
References ExtractElement(), llvm::ConstantInt::get(), llvm::Value::getContext(), llvm::Type::getInt32Ty(), llvm::ConstantExpr::getSub(), llvm::Value::getType(), and HasSubOverflow().
Referenced by llvm::InstCombiner::FoldICmpDivCst().
Check if the order of Op0 and Op1 as operand in an ICmpInst should be swapped.
The decision is based on how many times these two operands are reused as subtract operands and their positions in those instructions. The rational is that several architectures use the same instruction for both subtract and cmp, thus it is better if the order of those operands match.
Definition at line 2482 of file InstCombineCompares.cpp.
References llvm::dyn_cast(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::Type::isPointerTy(), and llvm::Value::users().
Referenced by llvm::InstCombiner::visitICmpInst().
1.8.6