LLVM 24.0.0git
InstCombineCalls.cpp File Reference
#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/Bitset.h"
#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.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/AttributeMask.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/BundleAttributes.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/KnownFPClass.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/TypeSize.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.

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 like: launder(launder(x)) -> launder(x) (the result is not the argument) 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 Instruction * simplifyNeonTbl (IntrinsicInst &II, InstCombiner &IC, bool IsExtension)
 Convert tbl/tbx intrinsics to shufflevector if the mask is constant, and at most two source operands are actually referenced.
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, const SimplifyQuery &SQ)
static std::optional< bool > getKnownSignOrZero (Value *Op, const SimplifyQuery &SQ)
static bool signBitMustBeTheSame (Value *Op0, Value *Op1, const SimplifyQuery &SQ)
 Return true if two values Op0 and Op1 are known to have the same sign.
static bool ldexpSaturatingAddIsSafe (Type *FpTy, Type *ExpTy)
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, const SimplifyQuery &SQ)
 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.
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 bool isIdempotentBinaryIntrinsic (Intrinsic::ID IID)
 Helper to match idempotent binary intrinsics, namely, intrinsics where f(f(x, y), y) == f(x, y) holds.
static Value * foldIdempotentBinaryIntrinsicRecurrence (InstCombinerImpl &IC, IntrinsicInst *II)
 Attempt to simplify value-accumulating recurrences of kind: umax.acc = phi i8 [ umax, backedge ], [ a, entry ] umax = call i8 @llvm.umax.i8(i8 umax.acc, i8 b) And let the idempotent binary intrinsic be hoisted, when the operands are known to be loop-invariant.
static Value * simplifyReductionOperand (Value *Arg, bool CanReorderLanes)
template<Intrinsic::ID IntrID>
static Value * foldMinimumOverTrailingOrLeadingZeroCount (Value *I0, Value *I1, const DataLayout &DL, InstCombiner::BuilderTy &Builder)
 Fold an unsigned minimum of trailing or leading zero bits counts: umin(cttz(CtOp1, ZeroUndef), ConstOp) --> cttz(CtOp1 | (1 << ConstOp)) umin(ctlz(CtOp1, ZeroUndef), ConstOp) --> ctlz(CtOp1 | (SignedMin >> ConstOp)) umin(cttz(CtOp1), cttz(CtOp2)) --> cttz(CtOp1 | CtOp2) umin(ctlz(CtOp1), ctlz(CtOp2)) --> ctlz(CtOp1 | CtOp2)
static bool leftDistributesOverRight (Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
 Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".
static bool rightDistributesOverLeft (Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
 Return whether "(X ROp Y) LOp Z" is always equal to "(X LOp Z) ROp (Y LOp Z)".
static Value * foldIntrinsicUsingDistributiveLaws (IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
static Instruction * foldNeonShift (IntrinsicInst *II, InstCombinerImpl &IC)
static Value * foldSinAndCosToSinCos (IntrinsicInst *II, IRBuilderBase &B, InstCombinerImpl &IC)
static Value * foldCmpIntrinsicOfExtended (IntrinsicInst *II, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
 Fold an scmp/ucmp intrinsic whose operands are extended from a narrower type: scmp (sext X), (sext Y) --> scmp X, Y scmp (zext X), (zext Y) --> ucmp X, Y ucmp (ext X), (ext Y) --> ucmp X, Y Both operands must use the same extend opcode and source type.
static Bitset< 256 > parseFormatStringSpecifiers (StringRef FormatStr)
static bool isAspectNeeded (StringRef Aspect, CallInst *CI, std::optional< unsigned > FirstArgIdx, const std::optional< Bitset< 256 > > &Specifiers)
static void referenceAspect (StringRef Aspect, StringRef ImplName, Module *M, IRBuilderBase &B)
static Value * optimizeModularFormat (CallInst *CI, IRBuilderBase &B)
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"))

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "instcombine"

Definition at line 83 of file InstCombineCalls.cpp.

Function Documentation

◆ canonicalizeConstantArg0ToArg1()

CallInst * canonicalizeConstantArg0ToArg1 ( CallInst & Call)
static

Definition at line 920 of file InstCombineCalls.cpp.

References assert(), Call, and llvm::isa().

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ createOverflowTuple()

Instruction * createOverflowTuple ( IntrinsicInst * II,
Value * Result,
Constant * Overflow )
static

Creates a result tuple for an overflow intrinsic II with a given Result and a constant Overflow value.

Definition at line 942 of file InstCombineCalls.cpp.

References llvm::cast(), llvm::InsertValueInst::Create(), llvm::ConstantStruct::get(), llvm::PoisonValue::get(), and II.

◆ factorizeMinMaxTree()

Instruction * factorizeMinMaxTree ( IntrinsicInst * II)
static

Reduce a sequence of min/max intrinsics with a common operand.

Definition at line 1463 of file InstCombineCalls.cpp.

References A(), assert(), B(), C(), llvm::CallInst::Create(), D(), llvm::dyn_cast(), llvm::Intrinsic::getOrInsertDeclaration(), II, LHS, Mod, and RHS.

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ findInitTrampoline()

◆ findInitTrampolineFromAlloca()

IntrinsicInst * findInitTrampolineFromAlloca ( Value * TrampMem)
static

◆ findInitTrampolineFromBB()

◆ foldBitOrderCrossLogicOp()

template<Intrinsic::ID IntrID>
Instruction * foldBitOrderCrossLogicOp ( Value * V,
InstCombiner::BuilderTy & Builder )
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 1621 of file InstCombineCalls.cpp.

References llvm::cast(), llvm::BinaryOperator::Create(), llvm::isa(), llvm::PatternMatch::m_BitwiseLogic(), llvm::PatternMatch::m_Intrinsic(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.

◆ foldClampRangeOfTwo()

◆ foldCmpIntrinsicOfExtended()

Value * foldCmpIntrinsicOfExtended ( IntrinsicInst * II,
InstCombiner::BuilderTy & Builder,
const DataLayout & DL )
static

Fold an scmp/ucmp intrinsic whose operands are extended from a narrower type: scmp (sext X), (sext Y) --> scmp X, Y scmp (zext X), (zext Y) --> ucmp X, Y ucmp (ext X), (ext Y) --> ucmp X, Y Both operands must use the same extend opcode and source type.

A constant operand is narrowed instead, if truncating and re-extending it gives back the same constant.

Definition at line 1982 of file InstCombineCalls.cpp.

References llvm::cast(), DL, llvm::getLosslessInvCast(), II, llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExtOrSExt(), llvm::PatternMatch::match(), std::swap(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ foldCtpop()

◆ foldCttzCtlz()

Instruction * foldCttzCtlz ( IntrinsicInst & II,
InstCombinerImpl & IC )
static

Definition at line 476 of file InstCombineCalls.cpp.

References assert(), llvm::BitWidth, llvm::InstCombiner::Builder, C(), llvm::InstCombiner::computeKnownBits(), llvm::CallInst::Create(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::IRBuilderBase::CreateIntrinsic(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateSub(), llvm::IRBuilderBase::CreateZExt(), F, llvm::SelectPatternResult::Flavor, llvm::IRBuilderBase::getFalse(), llvm::Constant::getNullValue(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::Type::getScalarSizeInBits(), llvm::InstCombiner::getSimplifyQuery(), llvm::IRBuilderBase::getTrue(), llvm::Value::getType(), llvm::SimplifyQuery::getWithInstruction(), llvm::Value::hasOneUse(), II, llvm::isKnownNonZero(), llvm::Known, llvm::PatternMatch::m_Add(), llvm::MIPatternMatch::m_AllOnes(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_CheckedInt(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Exact(), llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_Intrinsic(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_Mul(), llvm::MIPatternMatch::m_Neg(), llvm::MIPatternMatch::m_Not(), llvm::PatternMatch::m_NUWShl(), llvm::PatternMatch::m_One(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Shift(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), Range, llvm::InstCombiner::replaceInstUsesWith(), llvm::Instruction::setHasNoSignedWrap(), llvm::Instruction::setHasNoUnsignedWrap(), llvm::SPF_ABS, llvm::SPF_NABS, llvm::InstCombinerImpl::tryGetLog2(), X, and Y.

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ foldIdempotentBinaryIntrinsicRecurrence()

Value * foldIdempotentBinaryIntrinsicRecurrence ( InstCombinerImpl & IC,
IntrinsicInst * II )
static

Attempt to simplify value-accumulating recurrences of kind: umax.acc = phi i8 [ umax, backedge ], [ a, entry ] umax = call i8 @llvm.umax.i8(i8 umax.acc, i8 b) And let the idempotent binary intrinsic be hoisted, when the operands are known to be loop-invariant.

Definition at line 1681 of file InstCombineCalls.cpp.

References llvm::InstCombiner::Builder, llvm::cast(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::DominatorTree::dominates(), llvm::InstCombiner::getDominatorTree(), II, llvm::isa(), isIdempotentBinaryIntrinsic(), and llvm::matchSimpleBinaryIntrinsicRecurrence().

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ foldIntrinsicUsingDistributiveLaws()

◆ foldMinimumOverTrailingOrLeadingZeroCount()

template<Intrinsic::ID IntrID>
Value * foldMinimumOverTrailingOrLeadingZeroCount ( Value * I0,
Value * I1,
const DataLayout & DL,
InstCombiner::BuilderTy & Builder )
static

Fold an unsigned minimum of trailing or leading zero bits counts: umin(cttz(CtOp1, ZeroUndef), ConstOp) --> cttz(CtOp1 | (1 << ConstOp)) umin(ctlz(CtOp1, ZeroUndef), ConstOp) --> ctlz(CtOp1 | (SignedMin >> ConstOp)) umin(cttz(CtOp1), cttz(CtOp2)) --> cttz(CtOp1 | CtOp2) umin(ctlz(CtOp1), ctlz(CtOp2)) --> ctlz(CtOp1 | CtOp2)

Definition at line 1736 of file InstCombineCalls.cpp.

References llvm::BitWidth, C(), llvm::cast(), llvm::ConstantFoldBinaryOpOperands(), DL, llvm::APInt::getSignedMinValue(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::PatternMatch::m_CheckedInt(), llvm::PatternMatch::m_Intrinsic(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ foldNeonShift()

◆ foldSinAndCosToSinCos()

◆ fpclassTestIsFCmp0()

FCmpInst::Predicate fpclassTestIsFCmp0 ( FPClassTest Mask,
const Function & F,
Type * Ty )
static

◆ getKnownSign()

◆ getKnownSignOrZero()

◆ getPromotedType()

Type * getPromotedType ( Type * Ty)
static

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::dyn_cast(), and llvm::Type::getInt32Ty().

◆ hasUndefSource()

bool hasUndefSource ( AnyMemTransferInst * MI)
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 llvm::cast(), llvm::isa(), and MI.

Referenced by llvm::InstCombinerImpl::SimplifyAnyMemTransfer().

◆ haveSameOperands()

bool haveSameOperands ( const IntrinsicInst & I,
const IntrinsicInst & E,
unsigned NumOperands )
static

Definition at line 862 of file InstCombineCalls.cpp.

References assert(), E(), and I.

Referenced by removeTriviallyEmptyRange().

◆ inputDenormalIsDAZ()

bool inputDenormalIsDAZ ( const Function & F,
const Type * Ty )
static

Definition at line 995 of file InstCombineCalls.cpp.

References F.

Referenced by fpclassTestIsFCmp0().

◆ inputDenormalIsIEEE()

bool inputDenormalIsIEEE ( const Function & F,
const Type * Ty )
static

Definition at line 990 of file InstCombineCalls.cpp.

References F, and llvm::DenormalMode::IEEE.

◆ isAspectNeeded()

bool isAspectNeeded ( StringRef Aspect,
CallInst * CI,
std::optional< unsigned > FirstArgIdx,
const std::optional< Bitset< 256 > > & Specifiers )
static

◆ isIdempotentBinaryIntrinsic()

bool isIdempotentBinaryIntrinsic ( Intrinsic::ID IID)
static

Helper to match idempotent binary intrinsics, namely, intrinsics where f(f(x, y), y) == f(x, y) holds.

Definition at line 1658 of file InstCombineCalls.cpp.

Referenced by foldIdempotentBinaryIntrinsicRecurrence().

◆ ldexpSaturatingAddIsSafe()

◆ leftDistributesOverRight()

bool leftDistributesOverRight ( Instruction::BinaryOps LOp,
bool HasNUW,
bool HasNSW,
Intrinsic::ID ROp )
static

Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".

Definition at line 1775 of file InstCombineCalls.cpp.

Referenced by foldIntrinsicUsingDistributiveLaws(), llvm::InstCombinerImpl::foldUsingDistributiveLaws(), rightDistributesOverLeft(), rightDistributesOverLeft(), and tryFactorization().

◆ moveAddAfterMinMax()

Instruction * moveAddAfterMinMax ( IntrinsicInst * II,
InstCombiner::BuilderTy & Builder )
static

◆ optimizeModularFormat()

◆ parseFormatStringSpecifiers()

Bitset< 256 > parseFormatStringSpecifiers ( StringRef FormatStr)
static

◆ reassociateMinMaxWithConstantInOperand()

◆ reassociateMinMaxWithConstants()

Value * reassociateMinMaxWithConstants ( IntrinsicInst * II,
IRBuilderBase & Builder,
const SimplifyQuery & SQ )
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 1401 of file InstCombineCalls.cpp.

References llvm::dyn_cast(), llvm::MinMaxIntrinsic::getPredicate(), II, llvm::isKnownNonNegative(), LHS, llvm::PatternMatch::m_ImmConstant(), and llvm::PatternMatch::match().

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ referenceAspect()

void referenceAspect ( StringRef Aspect,
StringRef ImplName,
Module * M,
IRBuilderBase & B )
static

◆ removeTriviallyEmptyRange()

◆ rightDistributesOverLeft()

bool rightDistributesOverLeft ( Instruction::BinaryOps LOp,
bool HasNUW,
bool HasNSW,
Intrinsic::ID ROp )
static

Return whether "(X ROp Y) LOp Z" is always equal to "(X LOp Z) ROp (Y LOp Z)".

Definition at line 1795 of file InstCombineCalls.cpp.

References llvm::Instruction::isCommutative(), and leftDistributesOverRight().

Referenced by foldIntrinsicUsingDistributiveLaws(), llvm::InstCombinerImpl::foldUsingDistributiveLaws(), and tryFactorization().

◆ signBitMustBeTheSame()

bool signBitMustBeTheSame ( Value * Op0,
Value * Op1,
const SimplifyQuery & SQ )
static

Return true if two values Op0 and Op1 are known to have the same sign.

Definition at line 1228 of file InstCombineCalls.cpp.

References getKnownSign().

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ simplifyInvariantGroupIntrinsic()

Instruction * simplifyInvariantGroupIntrinsic ( IntrinsicInst & II,
InstCombinerImpl & IC )
static

This function transforms launder.invariant.group like: launder(launder(x)) -> launder(x) (the result is not the argument) This is legal because it preserves the most recent information about the presence or absence of invariant.group.

Definition at line 454 of file InstCombineCalls.cpp.

References llvm::InstCombiner::Builder, llvm::cast(), llvm::IRBuilderBase::CreateAddrSpaceCast(), llvm::IRBuilderBase::CreateLaunderInvariantGroup(), llvm::dyn_cast(), and II.

Referenced by llvm::InstCombinerImpl::visitCallInst().

◆ simplifyNeonTbl()

◆ simplifyReductionOperand()

◆ STATISTIC()

STATISTIC ( NumSimplified ,
"Number of library calls simplified"  )

Variable Documentation

◆ GuardWideningWindow

cl::opt< unsigned > GuardWideningWindow("instcombine-guard-widening-window", cl::init(3), cl::desc("How wide an instruction window to bypass looking for " "another guard")) ( "instcombine-guard-widening-window" ,
cl::init(3) ,
cl::desc("How wide an instruction window to bypass looking for " "another guard")  )
static