LLVM 17.0.0git
|
#include "InstCombineInternal.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumeBundleQueries.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InlineAsm.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/IntrinsicsAArch64.h"
#include "llvm/IR/IntrinsicsAMDGPU.h"
#include "llvm/IR/IntrinsicsARM.h"
#include "llvm/IR/IntrinsicsHexagon.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Statepoint.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
#include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/SimplifyLibCalls.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <optional>
#include <utility>
#include <vector>
#include "llvm/Transforms/Utils/InstructionWorklist.h"
Go to the source code of this file.
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
#define | DEBUG_TYPE "instcombine" |
Functions | |
STATISTIC (NumSimplified, "Number of library calls simplified") | |
static Type * | getPromotedType (Type *Ty) |
Return the specified type promoted as it would be to pass though a va_arg area. | |
static bool | hasUndefSource (AnyMemTransferInst *MI) |
Recognize a memcpy/memmove from a trivially otherwise unused alloca. | |
static Instruction * | simplifyInvariantGroupIntrinsic (IntrinsicInst &II, InstCombinerImpl &IC) |
This function transforms launder.invariant.group and strip.invariant.group like: launder(launder(x)) -> launder(x) (the result is not the argument) launder(strip(x)) -> launder(x) strip(strip(x)) -> strip(x) (the result is not the argument) strip(launder(x)) -> strip(x) This is legal because it preserves the most recent information about the presence or absence of invariant.group. | |
static Instruction * | foldCttzCtlz (IntrinsicInst &II, InstCombinerImpl &IC) |
static Instruction * | foldCtpop (IntrinsicInst &II, InstCombinerImpl &IC) |
static Value * | simplifyNeonTbl1 (const IntrinsicInst &II, InstCombiner::BuilderTy &Builder) |
Convert a table lookup to shufflevector if the mask is constant. | |
static bool | haveSameOperands (const IntrinsicInst &I, const IntrinsicInst &E, unsigned NumOperands) |
static bool | removeTriviallyEmptyRange (IntrinsicInst &EndI, InstCombinerImpl &IC, std::function< bool(const IntrinsicInst &)> IsStart) |
static CallInst * | canonicalizeConstantArg0ToArg1 (CallInst &Call) |
static Instruction * | createOverflowTuple (IntrinsicInst *II, Value *Result, Constant *Overflow) |
Creates a result tuple for an overflow intrinsic II with a given Result and a constant Overflow value. | |
static bool | inputDenormalIsIEEE (const Function &F, const Type *Ty) |
static bool | inputDenormalIsDAZ (const Function &F, const Type *Ty) |
static FCmpInst::Predicate | fpclassTestIsFCmp0 (FPClassTest Mask, const Function &F, Type *Ty) |
static std::optional< bool > | getKnownSign (Value *Op, Instruction *CxtI, const DataLayout &DL, AssumptionCache *AC, DominatorTree *DT) |
static Instruction * | moveAddAfterMinMax (IntrinsicInst *II, InstCombiner::BuilderTy &Builder) |
Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0. | |
static Instruction * | foldClampRangeOfTwo (IntrinsicInst *II, InstCombiner::BuilderTy &Builder) |
If we have a clamp pattern like max (min X, 42), 41 – where the output can only be one of two possible constant values – turn that into a select of constants. | |
static Value * | reassociateMinMaxWithConstants (IntrinsicInst *II, IRBuilderBase &Builder) |
If this min/max has a constant operand and an operand that is a matching min/max with a constant operand, constant-fold the 2 constant operands. | |
static Instruction * | reassociateMinMaxWithConstantInOperand (IntrinsicInst *II, InstCombiner::BuilderTy &Builder) |
If this min/max has a matching min/max operand with a constant, try to push the constant operand into this instruction. | |
static Instruction * | factorizeMinMaxTree (IntrinsicInst *II) |
Reduce a sequence of min/max intrinsics with a common operand. | |
static Instruction * | foldShuffledIntrinsicOperands (IntrinsicInst *II, InstCombiner::BuilderTy &Builder) |
If all arguments of the intrinsic are unary shuffles with the same mask, try to shuffle after the intrinsic. | |
template<Intrinsic::ID IntrID> | |
static Instruction * | foldBitOrderCrossLogicOp (Value *V, InstCombiner::BuilderTy &Builder) |
Fold the following cases and accepts bswap and bitreverse intrinsics: bswap(logic_op(bswap(x), y)) --> logic_op(x, bswap(y)) bswap(logic_op(bswap(x), bswap(y))) --> logic_op(x, y) (ignores multiuse) | |
static IntrinsicInst * | findInitTrampolineFromAlloca (Value *TrampMem) |
static IntrinsicInst * | findInitTrampolineFromBB (IntrinsicInst *AdjustTramp, Value *TrampMem) |
static IntrinsicInst * | findInitTrampoline (Value *Callee) |
Variables | |
static cl::opt< unsigned > | GuardWideningWindow ("instcombine-guard-widening-window", cl::init(3), cl::desc("How wide an instruction window to bypass looking for " "another guard")) |
#define DEBUG_TYPE "instcombine" |
Definition at line 77 of file InstCombineCalls.cpp.
Definition at line 784 of file InstCombineCalls.cpp.
References assert().
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Creates a result tuple for an overflow intrinsic II
with a given Result
and a constant Overflow
value.
Definition at line 797 of file InstCombineCalls.cpp.
References llvm::InsertValueInst::Create(), llvm::ConstantStruct::get(), llvm::PoisonValue::get(), llvm::Value::getType(), and Struct.
|
static |
Reduce a sequence of min/max intrinsics with a common operand.
Definition at line 1222 of file InstCombineCalls.cpp.
References A, assert(), B, llvm::CallingConv::C, llvm::CallInst::Create(), D, llvm::CallBase::getArgOperand(), llvm::Intrinsic::getDeclaration(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Instruction::getModule(), llvm::Value::getType(), llvm::Value::hasOneUse(), LHS, llvm::Mod, and RHS.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Definition at line 3318 of file InstCombineCalls.cpp.
References Callee, findInitTrampolineFromAlloca(), findInitTrampolineFromBB(), llvm::IntrinsicInst::getIntrinsicID(), llvm::User::getOperand(), and IT.
|
static |
Definition at line 3258 of file InstCombineCalls.cpp.
References llvm::IntrinsicInst::getIntrinsicID(), llvm::User::getOperand(), llvm::Value::stripPointerCasts(), and llvm::Value::users().
Referenced by findInitTrampoline().
|
static |
Definition at line 3297 of file InstCombineCalls.cpp.
References llvm::BasicBlock::begin(), E, llvm::IntrinsicInst::getIntrinsicID(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::User::getOperand(), llvm::Instruction::getParent(), I, and llvm::Instruction::mayWriteToMemory().
Referenced by findInitTrampoline().
|
static |
Fold the following cases and accepts bswap and bitreverse intrinsics: bswap(logic_op(bswap(x), y)) --> logic_op(x, bswap(y)) bswap(logic_op(bswap(x), bswap(y))) --> logic_op(x, y) (ignores multiuse)
Definition at line 1332 of file InstCombineCalls.cpp.
References Builder, llvm::BinaryOperator::Create(), llvm::PatternMatch::m_BitwiseLogic(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
|
static |
If we have a clamp pattern like max (min X, 42), 41 – where the output can only be one of two possible constant values – turn that into a select of constants.
Definition at line 1131 of file InstCombineCalls.cpp.
References llvm::CmpInst::BAD_ICMP_PREDICATE, Builder, llvm::SelectInst::Create(), llvm::ConstantInt::get(), llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Value::getType(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm_unreachable, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_SMax(), llvm::PatternMatch::m_SMin(), llvm::PatternMatch::m_UMax(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and X.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Definition at line 608 of file InstCombineCalls.cpp.
References assert(), llvm::BitWidth, llvm::InstCombiner::Builder, llvm::InstCombiner::computeKnownBits(), llvm::KnownBits::countMaxPopulation(), llvm::KnownBits::countMinPopulation(), llvm::CallInst::Create(), llvm::CastInst::Create(), llvm::IRBuilderBase::CreateCall(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateSub(), llvm::IRBuilderBase::CreateUnaryIntrinsic(), F, llvm::ConstantAsMetadata::get(), llvm::MDNode::get(), llvm::ConstantInt::get(), llvm::CallBase::getArgOperand(), llvm::Value::getContext(), llvm::Intrinsic::getDeclaration(), llvm::IRBuilderBase::getFalse(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Instruction::getMetadata(), llvm::Instruction::getModule(), llvm::Constant::getNullValue(), llvm::Type::getScalarSizeInBits(), llvm::Type::getScalarType(), llvm::Value::getType(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_NE, llvm::InstCombiner::isKnownToBeAPowerOfTwo(), IT, LowAndHigh, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_BSwap(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_FShl(), llvm::PatternMatch::m_FShr(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::InstCombiner::replaceInstUsesWith(), llvm::InstCombiner::replaceOperand(), llvm::Instruction::setMetadata(), X, Y, and llvm::KnownBits::Zero.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Definition at line 508 of file InstCombineCalls.cpp.
References assert(), llvm::InstCombiner::Builder, llvm::CallingConv::C, llvm::InstCombiner::computeKnownBits(), llvm::KnownBits::countMaxLeadingZeros(), llvm::KnownBits::countMaxTrailingZeros(), llvm::KnownBits::countMinLeadingZeros(), llvm::KnownBits::countMinTrailingZeros(), llvm::CallInst::Create(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateZExt(), F, llvm::SelectPatternResult::Flavor, llvm::ConstantAsMetadata::get(), llvm::MDNode::get(), llvm::ConstantInt::get(), llvm::CallBase::getArgOperand(), llvm::InstCombiner::getAssumptionCache(), llvm::Value::getContext(), llvm::InstCombiner::getDataLayout(), llvm::Intrinsic::getDeclaration(), llvm::InstCombiner::getDominatorTree(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Instruction::getMetadata(), llvm::Instruction::getModule(), llvm::Constant::getNullValue(), llvm::Type::getScalarType(), llvm::IRBuilderBase::getTrue(), llvm::Value::getType(), llvm::Type::isIntOrIntVectorTy(), llvm::isKnownNonZero(), llvm::APInt::isZero(), IT, LowAndHigh, llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), llvm::KnownBits::One, llvm::InstCombiner::replaceInstUsesWith(), llvm::InstCombiner::replaceOperand(), llvm::Instruction::setMetadata(), llvm::SPF_ABS, llvm::SPF_NABS, X, and Y.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
If all arguments of the intrinsic are unary shuffles with the same mask, try to shuffle after the intrinsic.
Definition at line 1281 of file InstCombineCalls.cpp.
References llvm::CallBase::arg_size(), llvm::CallBase::args(), Builder, llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), llvm::PatternMatch::m_Shuffle(), llvm::PatternMatch::m_Undef(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::none_of(), and X.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Mask
) is equivalent to fcmp o__ x, 0.0 with the floating-point environment assumed for F
for type Ty
Definition at line 829 of file InstCombineCalls.cpp.
References llvm::CmpInst::BAD_FCMP_PREDICATE, F, llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_ONE, llvm::fcNan, llvm::fcNegative, llvm::fcNegInf, llvm::fcNegNormal, llvm::fcNegSubnormal, llvm::fcNegZero, llvm::fcPosInf, llvm::fcPositive, llvm::fcPosNormal, llvm::fcPosSubnormal, llvm::fcPosZero, llvm::fcSubnormal, llvm::fcZero, inputDenormalIsDAZ(), and inputDenormalIsIEEE().
|
static |
Definition at line 1011 of file InstCombineCalls.cpp.
References llvm::computeKnownBits(), DL, llvm::Constant::getNullValue(), llvm::CmpInst::ICMP_SLT, llvm::isImpliedByDomCondition(), llvm::KnownBits::isNegative(), llvm::KnownBits::isNonNegative(), llvm::PatternMatch::m_NSWSub(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitCallInst().
Return the specified type promoted as it would be to pass though a va_arg area.
Definition at line 99 of file InstCombineCalls.cpp.
References llvm::Type::getContext(), and llvm::Type::getInt32Ty().
|
static |
Recognize a memcpy/memmove from a trivially otherwise unused alloca.
TODO: This should probably be integrated with visitAllocSites, but that requires a deeper change to allow either unread or unwritten objects.
Definition at line 110 of file InstCombineCalls.cpp.
References MI.
Referenced by llvm::InstCombinerImpl::SimplifyAnyMemTransfer().
|
static |
Definition at line 729 of file InstCombineCalls.cpp.
References assert(), E, and I.
Referenced by removeTriviallyEmptyRange().
Definition at line 821 of file InstCombineCalls.cpp.
References F, llvm::Type::getFltSemantics(), and llvm::Type::getScalarType().
Referenced by fpclassTestIsFCmp0().
Definition at line 816 of file InstCombineCalls.cpp.
References F, llvm::Type::getFltSemantics(), llvm::Type::getScalarType(), and llvm::DenormalMode::IEEE.
|
static |
Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0.
This can trigger other combines.
Definition at line 1030 of file InstCombineCalls.cpp.
References llvm::Add, assert(), Builder, llvm::ConstantInt::get(), llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Value::getType(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::APInt::ssub_ov(), llvm::APInt::usub_ov(), and X.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
If this min/max has a matching min/max operand with a constant, try to push the constant operand into this instruction.
This can enable more folds.
Definition at line 1194 of file InstCombineCalls.cpp.
References Builder, llvm::CallingConv::C, llvm::CallInst::Create(), llvm::Intrinsic::getDeclaration(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Instruction::getModule(), llvm::Value::getType(), llvm::PatternMatch::m_c_MaxOrMin(), llvm::PatternMatch::m_CombineAnd(), llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_MaxOrMin(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Value::takeName(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
If this min/max has a constant operand and an operand that is a matching min/max with a constant operand, constant-fold the 2 constant operands.
Definition at line 1171 of file InstCombineCalls.cpp.
References Builder, llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), llvm::MinMaxIntrinsic::getPredicate(), llvm::Value::getType(), LHS, llvm::PatternMatch::m_ImmConstant(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Definition at line 749 of file InstCombineCalls.cpp.
References llvm::CallBase::arg_size(), llvm::InstCombinerImpl::eraseInstFromFunction(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Instruction::getParent(), haveSameOperands(), I, and llvm::BasicBlock::rend().
Referenced by llvm::InstCombinerImpl::visitCallInst(), and llvm::InstCombinerImpl::visitVAEndInst().
|
static |
This function transforms launder.invariant.group and strip.invariant.group like: launder(launder(x)) -> launder(x) (the result is not the argument) launder(strip(x)) -> launder(x) strip(strip(x)) -> strip(x) (the result is not the argument) strip(launder(x)) -> strip(x) This is legal because it preserves the most recent information about the presence or absence of invariant.group.
Definition at line 476 of file InstCombineCalls.cpp.
References Arg, llvm::InstCombiner::Builder, llvm::IRBuilderBase::CreateAddrSpaceCast(), llvm::IRBuilderBase::CreateBitCast(), llvm::IRBuilderBase::CreateLaunderInvariantGroup(), llvm::IRBuilderBase::CreateStripInvariantGroup(), llvm::CallBase::getArgOperand(), llvm::IntrinsicInst::getIntrinsicID(), llvm::Type::getPointerAddressSpace(), llvm::Value::getType(), Intr, and llvm_unreachable.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Convert a table lookup to shufflevector if the mask is constant.
This could benefit tbl1 if the mask is { 7,6,5,4,3,2,1,0 }, in which case we could lower the shufflevector with rev64 instructions as it's actually a byte reverse.
Definition at line 693 of file InstCombineCalls.cpp.
References Builder, llvm::CallingConv::C, llvm::CallBase::getArgOperand(), llvm::Constant::getNullValue(), llvm::Value::getType(), and I.
Referenced by llvm::InstCombinerImpl::visitCallInst().
|
static |
Referenced by llvm::InstCombinerImpl::visitCallInst().