LLVM 20.0.0git
Classes | Macros | Functions | Variables
InstructionCombining.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/BasicAliasAnalysis.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/LastRunTrackingAnalysis.h"
#include "llvm/Analysis/LazyBlockFrequencyInfo.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TargetFolder.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/Utils/Local.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/IRBuilder.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/Metadata.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/InitializePasses.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/DebugCounter.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include "llvm/Transforms/Utils/InstructionWorklist.h"

Go to the source code of this file.

Classes

class  AliasScopeTracker
 

Macros

#define DEBUG_TYPE   "instcombine"
 

Functions

 STATISTIC (NumWorklistIterations, "Number of instruction combining iterations performed")
 
 STATISTIC (NumOneIteration, "Number of functions with one iteration")
 
 STATISTIC (NumTwoIterations, "Number of functions with two iterations")
 
 STATISTIC (NumThreeIterations, "Number of functions with three iterations")
 
 STATISTIC (NumFourOrMoreIterations, "Number of functions with four or more iterations")
 
 STATISTIC (NumCombined, "Number of insts combined")
 
 STATISTIC (NumConstProp, "Number of constant folds")
 
 STATISTIC (NumDeadInst, "Number of dead inst eliminated")
 
 STATISTIC (NumSunkInst, "Number of instructions sunk")
 
 STATISTIC (NumExpand, "Number of expansions")
 
 STATISTIC (NumFactor, "Number of factorizations")
 
 STATISTIC (NumReassoc, "Number of reassociations")
 
 DEBUG_COUNTER (VisitCounter, "instcombine-visit", "Controls which instructions are visited")
 
static bool maintainNoSignedWrap (BinaryOperator &I, Value *B, Value *C)
 
static bool hasNoUnsignedWrap (BinaryOperator &I)
 
static bool hasNoSignedWrap (BinaryOperator &I)
 
static void ClearSubclassDataAfterReassociation (BinaryOperator &I)
 Conservatively clears subclassOptionalData after a reassociation or commutation.
 
static bool simplifyAssocCastAssoc (BinaryOperator *BinOp1, InstCombinerImpl &IC)
 Combine constant operands of associative operations either before or after a cast to eliminate one of the associative operations: (op (cast (op X, C2)), C1) --> (cast (op X, op (C1, C2))) (op (cast (op X, C2)), C1) --> (op (cast X), op (C1, C2))
 
static bool leftDistributesOverRight (Instruction::BinaryOps LOp, Instruction::BinaryOps 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, Instruction::BinaryOps ROp)
 Return whether "(X LOp Y) ROp Z" is always equal to "(X ROp Z) LOp (Y ROp Z)".
 
static ValuegetIdentityValue (Instruction::BinaryOps Opcode, Value *V)
 This function returns identity value for given opcode, which can be used to factor patterns like (X * 2) + X ==> (X * 2) + (X * 1) ==> X * (2 + 1).
 
static Instruction::BinaryOps getBinOpsForFactorization (Instruction::BinaryOps TopOpcode, BinaryOperator *Op, Value *&LHS, Value *&RHS, BinaryOperator *OtherOp)
 This function predicates factorization using distributive laws.
 
static ValuetryFactorization (BinaryOperator &I, const SimplifyQuery &SQ, InstCombiner::BuilderTy &Builder, Instruction::BinaryOps InnerOpcode, Value *A, Value *B, Value *C, Value *D)
 This tries to simplify binary operations by factorizing out common terms (e.
 
static std::optional< std::pair< Value *, Value * > > matchSymmetricPhiNodesPair (PHINode *LHS, PHINode *RHS)
 
static ValuesimplifyOperationIntoSelectOperand (Instruction &I, SelectInst *SI, bool IsTrueArm)
 
static ValuefoldOperationIntoSelectOperand (Instruction &I, SelectInst *SI, Value *NewOp, InstCombiner &IC)
 
static ValuesimplifyInstructionWithPHI (Instruction &I, PHINode *PN, Value *InValue, BasicBlock *InBB, const DataLayout &DL, const SimplifyQuery SQ)
 
static bool shouldMergeGEPs (GEPOperator &GEP, GEPOperator &Src)
 
static GEPNoWrapFlags getMergedGEPNoWrapFlags (GEPOperator &GEP1, GEPOperator &GEP2)
 Determine nowrap flags for (gep (gep p, x), y) to (gep p, (x + y)) transform.
 
static InstructionfoldSelectGEP (GetElementPtrInst &GEP, InstCombiner::BuilderTy &Builder)
 Thread a GEP operation with constant indices through the constant true/false arms of a select.
 
static InstructioncanonicalizeGEPOfConstGEPI8 (GetElementPtrInst &GEP, GEPOperator *Src, InstCombinerImpl &IC)
 
static bool shouldCanonicalizeGEPToPtrAdd (GetElementPtrInst &GEP)
 Return true if we should canonicalize the gep to an i8 ptradd.
 
static InstructionfoldGEPOfPhi (GetElementPtrInst &GEP, PHINode *PN, IRBuilderBase &Builder)
 
static bool isNeverEqualToUnescapedAlloc (Value *V, const TargetLibraryInfo &TLI, Instruction *AI)
 
static bool isRemovableWrite (CallBase &CB, Value *UsedV, const TargetLibraryInfo &TLI)
 Given a call CB which uses an address UsedV, return true if we can prove the call's only possible effect is storing to V.
 
static bool isAllocSiteRemovable (Instruction *AI, SmallVectorImpl< WeakTrackingVH > &Users, const TargetLibraryInfo &TLI)
 
static InstructiontryToMoveFreeBeforeNullTest (CallInst &FI, const DataLayout &DL)
 Move the call to free before a NULL test.
 
static ValuesimplifySwitchOnSelectUsingRanges (SwitchInst &SI, SelectInst *Select, bool IsTrueArm)
 
static bool isCatchAll (EHPersonality Personality, Constant *TypeInfo)
 Return 'true' if the given typeinfo will match anything.
 
static bool shorter_filter (const Value *LHS, const Value *RHS)
 
static bool isUsedWithinShuffleVector (Value *V)
 
static bool SoleWriteToDeadLocal (Instruction *I, TargetLibraryInfo &TLI)
 Check for case where the call writes to an otherwise dead alloca.
 
static bool combineInstructionsOverFunction (Function &F, InstructionWorklist &Worklist, AliasAnalysis *AA, AssumptionCache &AC, TargetLibraryInfo &TLI, TargetTransformInfo &TTI, DominatorTree &DT, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, BranchProbabilityInfo *BPI, ProfileSummaryInfo *PSI, const InstCombineOptions &Opts)
 
 INITIALIZE_PASS_BEGIN (InstructionCombiningPass, "instcombine", "Combine redundant instructions", false, false) INITIALIZE_PASS_END(InstructionCombiningPass
 

Variables

static cl::opt< boolEnableCodeSinking ("instcombine-code-sinking", cl::desc("Enable code sinking"), cl::init(true))
 
static cl::opt< unsignedMaxSinkNumUsers ("instcombine-max-sink-users", cl::init(32), cl::desc("Maximum number of undroppable users for instruction sinking"))
 
static cl::opt< unsignedMaxArraySize ("instcombine-maxarray-size", cl::init(1024), cl::desc("Maximum array size considered when doing a combine"))
 
static cl::opt< unsignedShouldLowerDbgDeclare ("instcombine-lower-dbg-declare", cl::Hidden, cl::init(true))
 
 instcombine
 
Combine redundant instructions
 
Combine redundant false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "instcombine"

Definition at line 108 of file InstructionCombining.cpp.

Function Documentation

◆ canonicalizeGEPOfConstGEPI8()

static Instruction * canonicalizeGEPOfConstGEPI8 ( GetElementPtrInst GEP,
GEPOperator Src,
InstCombinerImpl IC 
)
static

◆ ClearSubclassDataAfterReassociation()

static void ClearSubclassDataAfterReassociation ( BinaryOperator I)
static

Conservatively clears subclassOptionalData after a reassociation or commutation.

We preserve fast-math flags when applicable as they can be preserved.

Definition at line 322 of file InstructionCombining.cpp.

References I.

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

◆ combineInstructionsOverFunction()

static bool combineInstructionsOverFunction ( Function F,
InstructionWorklist Worklist,
AliasAnalysis AA,
AssumptionCache AC,
TargetLibraryInfo TLI,
TargetTransformInfo TTI,
DominatorTree DT,
OptimizationRemarkEmitter ORE,
BlockFrequencyInfo BFI,
BranchProbabilityInfo BPI,
ProfileSummaryInfo PSI,
const InstCombineOptions Opts 
)
static

◆ DEBUG_COUNTER()

DEBUG_COUNTER ( VisitCounter  ,
"instcombine-visit"  ,
"Controls which instructions are visited"   
)

◆ foldGEPOfPhi()

static Instruction * foldGEPOfPhi ( GetElementPtrInst GEP,
PHINode PN,
IRBuilderBase Builder 
)
static

◆ foldOperationIntoSelectOperand()

static Value * foldOperationIntoSelectOperand ( Instruction I,
SelectInst SI,
Value NewOp,
InstCombiner IC 
)
static

◆ foldSelectGEP()

static Instruction * foldSelectGEP ( GetElementPtrInst GEP,
InstCombiner::BuilderTy Builder 
)
static

◆ getBinOpsForFactorization()

static Instruction::BinaryOps getBinOpsForFactorization ( Instruction::BinaryOps  TopOpcode,
BinaryOperator Op,
Value *&  LHS,
Value *&  RHS,
BinaryOperator OtherOp 
)
static

This function predicates factorization using distributive laws.

By default, it just returns the 'Op' inputs. But for special-cases like 'add(shl(X, 5), ...)', this function will have TopOpcode == Instruction::Add and Op = shl(X, 5). The 'shl' is treated as the more general 'mul X, 32' to allow more factorization opportunities.

Definition at line 641 of file InstructionCombining.cpp.

References assert(), llvm::CallingConv::C, llvm::ConstantFoldBinaryInstruction(), llvm::BinaryOperator::getOpcode(), llvm::Instruction::isBitwiseLogicOp(), LHS, llvm::PatternMatch::m_ImmConstant(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_NonNegative(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and RHS.

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

◆ getIdentityValue()

static Value * getIdentityValue ( Instruction::BinaryOps  Opcode,
Value V 
)
static

This function returns identity value for given opcode, which can be used to factor patterns like (X * 2) + X ==> (X * 2) + (X * 1) ==> X * (2 + 1).

Definition at line 628 of file InstructionCombining.cpp.

References llvm::ConstantExpr::getBinOpIdentity().

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

◆ getMergedGEPNoWrapFlags()

static GEPNoWrapFlags getMergedGEPNoWrapFlags ( GEPOperator GEP1,
GEPOperator GEP2 
)
static

Determine nowrap flags for (gep (gep p, x), y) to (gep p, (x + y)) transform.

Definition at line 2357 of file InstructionCombining.cpp.

References llvm::GEPOperator::getNoWrapFlags(), and llvm::GEPNoWrapFlags::intersectForOffsetAdd().

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

◆ hasNoSignedWrap()

static bool hasNoSignedWrap ( BinaryOperator I)
static

◆ hasNoUnsignedWrap()

static bool hasNoUnsignedWrap ( BinaryOperator I)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( InstructionCombiningPass  ,
"instcombine"  ,
"Combine redundant instructions"  ,
false  ,
false   
)

◆ isAllocSiteRemovable()

static bool isAllocSiteRemovable ( Instruction AI,
SmallVectorImpl< WeakTrackingVH > &  Users,
const TargetLibraryInfo TLI 
)
static

◆ isCatchAll()

static bool isCatchAll ( EHPersonality  Personality,
Constant TypeInfo 
)
static

◆ isNeverEqualToUnescapedAlloc()

static bool isNeverEqualToUnescapedAlloc ( Value V,
const TargetLibraryInfo TLI,
Instruction AI 
)
static

Definition at line 3149 of file InstructionCombining.cpp.

References llvm::isAllocLikeFn().

Referenced by isAllocSiteRemovable().

◆ isRemovableWrite()

static bool isRemovableWrite ( CallBase CB,
Value UsedV,
const TargetLibraryInfo TLI 
)
static

Given a call CB which uses an address UsedV, return true if we can prove the call's only possible effect is storing to V.

Definition at line 3161 of file InstructionCombining.cpp.

References llvm::CallBase::doesNotThrow(), llvm::MemoryLocation::getForDest(), llvm::Instruction::isTerminator(), llvm::Value::use_empty(), and llvm::Instruction::willReturn().

Referenced by isAllocSiteRemovable().

◆ isUsedWithinShuffleVector()

static bool isUsedWithinShuffleVector ( Value V)
static

◆ leftDistributesOverRight()

static bool leftDistributesOverRight ( Instruction::BinaryOps  LOp,
Instruction::BinaryOps  ROp 
)
static

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

Definition at line 592 of file InstructionCombining.cpp.

◆ maintainNoSignedWrap()

static bool maintainNoSignedWrap ( BinaryOperator I,
Value B,
Value C 
)
static

◆ matchSymmetricPhiNodesPair()

static std::optional< std::pair< Value *, Value * > > matchSymmetricPhiNodesPair ( PHINode LHS,
PHINode RHS 
)
static

Definition at line 1221 of file InstructionCombining.cpp.

References llvm::equal(), I, LHS, and RHS.

◆ rightDistributesOverLeft()

static bool rightDistributesOverLeft ( Instruction::BinaryOps  LOp,
Instruction::BinaryOps  ROp 
)
static

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

Definition at line 613 of file InstructionCombining.cpp.

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

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

◆ shorter_filter()

static bool shorter_filter ( const Value LHS,
const Value RHS 
)
static

Definition at line 4196 of file InstructionCombining.cpp.

References llvm::Value::getType(), LHS, and RHS.

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

◆ shouldCanonicalizeGEPToPtrAdd()

static bool shouldCanonicalizeGEPToPtrAdd ( GetElementPtrInst GEP)
static

◆ shouldMergeGEPs()

static bool shouldMergeGEPs ( GEPOperator GEP,
GEPOperator Src 
)
static

Definition at line 2044 of file InstructionCombining.cpp.

References GEP.

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

◆ simplifyAssocCastAssoc()

static bool simplifyAssocCastAssoc ( BinaryOperator BinOp1,
InstCombinerImpl IC 
)
static

Combine constant operands of associative operations either before or after a cast to eliminate one of the associative operations: (op (cast (op X, C2)), C1) --> (cast (op X, op (C1, C2))) (op (cast (op X, C2)), C1) --> (op (cast X), op (C1, C2))

Definition at line 338 of file InstructionCombining.cpp.

References llvm::ConstantFoldBinaryOpOperands(), llvm::ConstantFoldCastOperand(), DL, llvm::Instruction::dropPoisonGeneratingFlags(), llvm::InstCombiner::getDataLayout(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::Instruction::isBitwiseLogicOp(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::match(), and llvm::InstCombiner::replaceOperand().

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

◆ simplifyInstructionWithPHI()

static Value * simplifyInstructionWithPHI ( Instruction I,
PHINode PN,
Value InValue,
BasicBlock InBB,
const DataLayout DL,
const SimplifyQuery  SQ 
)
static

◆ simplifyOperationIntoSelectOperand()

static Value * simplifyOperationIntoSelectOperand ( Instruction I,
SelectInst SI,
bool  IsTrueArm 
)
static

◆ simplifySwitchOnSelectUsingRanges()

static Value * simplifySwitchOnSelectUsingRanges ( SwitchInst SI,
SelectInst Select,
bool  IsTrueArm 
)
static

◆ SoleWriteToDeadLocal()

static bool SoleWriteToDeadLocal ( Instruction I,
TargetLibraryInfo TLI 
)
static

Check for case where the call writes to an otherwise dead alloca.

This shows up for unused out-params in idiomatic C/C++ code. Note that this helper only analyzes the write; doesn't check any other legality aspect.

Definition at line 4770 of file InstructionCombining.cpp.

References llvm::SmallVectorBase< Size_T >::empty(), llvm::MemoryLocation::getForDest(), llvm::getUnderlyingObject(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().

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

◆ STATISTIC() [1/12]

STATISTIC ( NumCombined  ,
"Number of insts combined"   
)

◆ STATISTIC() [2/12]

STATISTIC ( NumConstProp  ,
"Number of constant folds"   
)

◆ STATISTIC() [3/12]

STATISTIC ( NumDeadInst  ,
"Number of dead inst eliminated"   
)

◆ STATISTIC() [4/12]

STATISTIC ( NumExpand  ,
"Number of expansions"   
)

◆ STATISTIC() [5/12]

STATISTIC ( NumFactor  ,
"Number of factorizations"   
)

◆ STATISTIC() [6/12]

STATISTIC ( NumFourOrMoreIterations  ,
"Number of functions with four or more iterations"   
)

◆ STATISTIC() [7/12]

STATISTIC ( NumOneIteration  ,
"Number of functions with one iteration"   
)

◆ STATISTIC() [8/12]

STATISTIC ( NumReassoc  ,
"Number of reassociations"   
)

◆ STATISTIC() [9/12]

STATISTIC ( NumSunkInst  ,
"Number of instructions sunk"   
)

◆ STATISTIC() [10/12]

STATISTIC ( NumThreeIterations  ,
"Number of functions with three iterations"   
)

◆ STATISTIC() [11/12]

STATISTIC ( NumTwoIterations  ,
"Number of functions with two iterations"   
)

◆ STATISTIC() [12/12]

STATISTIC ( NumWorklistIterations  ,
"Number of instruction combining iterations performed"   
)

◆ tryFactorization()

static Value * tryFactorization ( BinaryOperator I,
const SimplifyQuery SQ,
InstCombiner::BuilderTy Builder,
Instruction::BinaryOps  InnerOpcode,
Value A,
Value B,
Value C,
Value D 
)
static

◆ tryToMoveFreeBeforeNullTest()

static Instruction * tryToMoveFreeBeforeNullTest ( CallInst FI,
const DataLayout DL 
)
static

Move the call to free before a NULL test.

Check if this free is accessed after its argument has been test against NULL (property 0). If yes, it is legal to move this call in its predecessor block.

The move is performed only if the block containing the call to free will be removed, i.e.:

  1. it has only one predecessor P, and P has two successors
  2. it contains the call, noops, and an unconditional branch
  3. its successor is the same as its predecessor's successor

The profitability is out-of concern here and this function should be called only if the caller knows this transformation would be profitable (e.g., for code size).

Definition at line 3437 of file InstructionCombining.cpp.

References assert(), DL, llvm::CallBase::getArgOperand(), llvm::CallBase::getAttributes(), llvm::Value::getContext(), llvm::Attribute::getDereferenceableBytes(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSinglePredecessor(), llvm::BasicBlock::getTerminator(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::BasicBlock::instructionsWithoutDebug(), llvm::Attribute::isValid(), llvm::PatternMatch::m_Br(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UnconditionalBr(), llvm::PatternMatch::m_Zero(), llvm::make_early_inc_range(), llvm::PatternMatch::match(), llvm::CallBase::setAttributes(), and llvm::BasicBlock::size().

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

Variable Documentation

◆ EnableCodeSinking

cl::opt< bool > EnableCodeSinking("instcombine-code-sinking", cl::desc("Enable code sinking"), cl::init(true)) ( "instcombine-code-sinking"  ,
cl::desc("Enable code sinking")  ,
cl::init(true  
)
static

◆ false

Combine redundant false

Definition at line 5670 of file InstructionCombining.cpp.

◆ instcombine

instcombine

Definition at line 5669 of file InstructionCombining.cpp.

◆ instructions

Combine redundant instructions

Definition at line 5670 of file InstructionCombining.cpp.

◆ MaxArraySize

cl::opt< unsigned > MaxArraySize("instcombine-maxarray-size", cl::init(1024), cl::desc("Maximum array size considered when doing a combine")) ( "instcombine-maxarray-size"  ,
cl::init(1024)  ,
cl::desc("Maximum array size considered when doing a combine")   
)
static

◆ MaxSinkNumUsers

cl::opt< unsigned > MaxSinkNumUsers("instcombine-max-sink-users", cl::init(32), cl::desc("Maximum number of undroppable users for instruction sinking")) ( "instcombine-max-sink-users"  ,
cl::init(32)  ,
cl::desc("Maximum number of undroppable users for instruction sinking")   
)
static

◆ ShouldLowerDbgDeclare

cl::opt< unsigned > ShouldLowerDbgDeclare("instcombine-lower-dbg-declare", cl::Hidden, cl::init(true)) ( "instcombine-lower-dbg-declare"  ,
cl::Hidden  ,
cl::init(true  
)
static