|
LLVM 24.0.0git
|
#include "InstCombineInternal.h"#include "llvm/ADT/APFloat.h"#include "llvm/ADT/APInt.h"#include "llvm/ADT/ArrayRef.h"#include "llvm/ADT/DenseMap.h"#include "llvm/ADT/SetOperations.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/LLVMContext.h"#include "llvm/IR/Metadata.h"#include "llvm/IR/Operator.h"#include "llvm/IR/PassManager.h"#include "llvm/IR/PatternMatch.h"#include "llvm/IR/ProfDataUtils.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/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/KnownFPClass.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 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 Value * | getIdentityValue (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 Value * | tryFactorization (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 void | distributeBinOpOverSelect (InstCombinerImpl &IC, Instruction::BinaryOps Opcode, SelectInst *Sel, Value *Other, bool SelIsLHS, FastMathFlags FMF, const SimplifyQuery &SQ, Value *&True, Value *&False) |
| Distribute a binop over a select: (Cond ? | |
| static Value * | simplifyOperationIntoSelectOperand (Instruction &I, SelectInst *SI, bool IsTrueArm) |
| static Value * | foldOperationIntoSelectOperand (Instruction &I, SelectInst *SI, Value *NewOp, InstCombiner &IC) |
| static Value * | simplifyInstructionWithPHI (Instruction &I, PHINode *PN, Value *InValue, BasicBlock *InBB, const DataLayout &DL, const SimplifyQuery SQ) |
| static bool | shouldMergeGEPs (GEPOperator &GEP, GEPOperator &Src) |
| static Constant * | constantFoldBinOpWithSplat (unsigned Opcode, Constant *Vector, Constant *Splat, bool SplatLHS, const DataLayout &DL) |
| template<Intrinsic::ID SpliceID> | |
| static Instruction * | foldSpliceBinOp (BinaryOperator &Inst, InstCombiner::BuilderTy &Builder) |
| static GEPNoWrapFlags | getMergedGEPNoWrapFlags (GEPOperator &GEP1, GEPOperator &GEP2) |
| Determine nowrap flags for (gep (gep p, x), y) to (gep p, (x + y)) transform. | |
| static Instruction * | foldSelectGEP (GetElementPtrInst &GEP, InstCombiner::BuilderTy &Builder) |
| Thread a GEP operation with constant indices through the constant true/false arms of a select. | |
| static Instruction * | canonicalizeGEPOfConstGEPI8 (GetElementPtrInst &GEP, GEPOperator *Src, InstCombinerImpl &IC) |
| static Instruction * | combineConstantOffsets (GetElementPtrInst &GEP, InstCombinerImpl &IC) |
| Combine constant offsets separated by variable offsets. | |
| static bool | shouldCanonicalizeGEPToPtrAdd (GetElementPtrInst &GEP) |
| Return true if we should canonicalize the gep to an i8 ptradd. | |
| static Instruction * | foldGEPOfPhi (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 std::optional< ModRefInfo > | isAllocSiteRemovable (Instruction *AI, SmallVectorImpl< Instruction * > &Users, const TargetLibraryInfo &TLI, bool KnowInit, unsigned MaxUsers) |
| static Instruction * | tryToMoveFreeBeforeNullTest (CallInst &FI, const DataLayout &DL) |
| Move the call to free before a NULL test. | |
| static Value * | simplifySwitchOnSelectUsingRanges (SwitchInst &SI, SelectInst *Select, bool IsTrueArm) |
| static Value * | foldFrexpOfSelect (ExtractValueInst &EV, IntrinsicInst *FrexpCall, SelectInst *SelectInst, InstCombiner::BuilderTy &Builder) |
| 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 | |
| instcombine | |
| Combine redundant | instructions |
| Combine redundant | false |
| #define DEBUG_TYPE "instcombine" |
Definition at line 112 of file InstructionCombining.cpp.
|
static |
Definition at line 2850 of file InstructionCombining.cpp.
References llvm::sampleprof::Base, llvm::InstCombiner::Builder, C1, llvm::cast(), llvm::GetElementPtrInst::Create(), llvm::IRBuilderBase::CreatePtrAdd(), DL, GEP, llvm::APInt::getBitWidth(), llvm::InstCombiner::getDataLayout(), llvm::IRBuilderBase::getInt(), llvm::Type::getScalarType(), llvm::GEPNoWrapFlags::inBounds(), llvm::isa(), llvm::APInt::isZero(), llvm::PatternMatch::m_AddLike(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_NUWAddLike(), llvm::PatternMatch::m_PtrAdd(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::GEPNoWrapFlags::none(), and llvm::GEPNoWrapFlags::noUnsignedWrap().
Referenced by llvm::InstCombinerImpl::visitGEPOfGEP().
|
static |
Combine constant offsets separated by variable offsets.
ptradd (ptradd (ptradd p, C1), x), C2 -> ptradd (ptradd p, x), C1+C2
Definition at line 2894 of file InstructionCombining.cpp.
References llvm::GEPNoWrapFlags::all(), llvm::InstCombiner::Builder, llvm::IRBuilderBase::CreatePtrAdd(), DL, llvm::dyn_cast(), GEP, llvm::InstCombiner::getDataLayout(), llvm::IRBuilderBase::getInt(), llvm::GEPNoWrapFlags::intersectForOffsetAdd(), llvm::GEPNoWrapFlags::intersectForReassociate(), llvm::Offset, llvm::InstCombiner::replaceInstUsesWith(), and llvm::InstCombiner::replaceOperand().
Referenced by llvm::InstCombinerImpl::visitGEPOfGEP().
|
static |
Definition at line 6281 of file InstructionCombining.cpp.
References llvm::dbgs(), DL, F, llvm::getInstCombineCLOptions(), LLVM_DEBUG, llvm::LowerDbgDeclare(), llvm::InstCombineOptions::MaxIterations, llvm::InstCombinerImpl::prepareWorklist(), llvm::reportFatalUsageError(), llvm::InstCombinerImpl::run(), TLI, and llvm::InstCombineOptions::VerifyFixpoint.
Referenced by llvm::InstCombinePass::run(), and llvm::InstructionCombiningPass::runOnFunction().
|
static |
Definition at line 2468 of file InstructionCombining.cpp.
References llvm::cast(), llvm::ConstantFoldBinaryOpOperands(), DL, llvm::ConstantVector::getSplat(), LHS, RHS, llvm::Splat, std::swap(), and llvm::Vector.
Referenced by llvm::InstCombinerImpl::foldVectorBinop().
| DEBUG_COUNTER | ( | VisitCounter | , |
| "instcombine-visit" | , | ||
| "Controls which instructions are visited" | ) |
References llvm::dyn_cast(), and I.
|
static |
Distribute a binop over a select: (Cond ?
TVal : FVal) op Other --> Cond ? (TVal op Other) : (FVal op Other) (or with the operands swapped if SelIsLHS is false). If Other is a select whose condition is implied by Cond (or its negation), it is resolved to the corresponding arm on that side first. True and False are set to the simplified arms, or null if an arm did not simplify.
Definition at line 1389 of file InstructionCombining.cpp.
References llvm::InstCombiner::Builder, Cond, llvm::IRBuilderBase::CreateBinOp(), llvm::dyn_cast(), llvm::False, llvm::SelectInst::getCondition(), llvm::SelectInst::getFalseValue(), llvm::SelectInst::getTrueValue(), llvm::Other, llvm::simplifyBinOp(), llvm::InstCombinerImpl::simplifyNestedSelectsUsingImpliedCond(), std::swap(), llvm::True, and V.
Referenced by llvm::InstCombinerImpl::SimplifySelectsFeedingBinaryOp().
|
static |
Definition at line 4709 of file InstructionCombining.cpp.
References Cond, llvm::Instruction::copyIRFlags(), llvm::frexp(), llvm::CallBase::getCalledFunction(), llvm::SelectInst::getCondition(), llvm::SelectInst::getFalseValue(), llvm::SelectInst::getTrueValue(), llvm::Value::hasOneUse(), llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::match(), llvm::ProfcheckDisableMetadataFixes, and llvm::APFloatBase::rmNearestTiesToEven.
Referenced by llvm::InstCombinerImpl::visitExtractValueInst().
|
static |
Definition at line 3282 of file InstructionCombining.cpp.
References llvm::PHINode::addIncoming(), assert(), llvm::cast(), llvm::dyn_cast(), E(), F, GEP, llvm::PHINode::getIncomingBlock(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::GetElementPtrInst::getTypeAtIndex(), llvm::Value::hasOneUse(), I, llvm::Type::isStructTy(), llvm::User::op_begin(), llvm::User::op_end(), and llvm::User::operands().
Referenced by llvm::InstCombinerImpl::visitGetElementPtrInst().
|
static |
Definition at line 1848 of file InstructionCombining.cpp.
References llvm::Instruction::dropUBImplyingAttrsAndMetadata(), I, llvm::InstCombiner::InsertNewInstBefore(), and llvm::User::replaceUsesOfWith().
Referenced by llvm::InstCombinerImpl::FoldOpIntoSelect().
|
static |
Thread a GEP operation with constant indices through the constant true/false arms of a select.
Definition at line 2823 of file InstructionCombining.cpp.
References Cond, llvm::SelectInst::Create(), GEP, llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_Instruction(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Select(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitGetElementPtrInst().
|
static |
Definition at line 2480 of file InstructionCombining.cpp.
References llvm::Instruction::copyIRFlags(), llvm::CallInst::Create(), llvm::dyn_cast(), F, llvm::PoisonValue::get(), llvm::Instruction::getModule(), llvm::Value::getName(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::isSplatValue(), LHS, llvm::PatternMatch::m_Intrinsic(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Poison(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Offset, RHS, V, llvm::V1, X, and Y.
Referenced by llvm::InstCombinerImpl::foldVectorBinop().
|
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 719 of file InstructionCombining.cpp.
References assert(), 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().
|
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 706 of file InstructionCombining.cpp.
References llvm::ConstantExpr::getBinOpIdentity(), llvm::isa(), and V.
Referenced by llvm::InstCombinerImpl::tryFactorizationFolds().
|
static |
Determine nowrap flags for (gep (gep p, x), y) to (gep p, (x + y)) transform.
Definition at line 2816 of file InstructionCombining.cpp.
References llvm::GEPOperator::getNoWrapFlags(), and llvm::GEPNoWrapFlags::intersectForOffsetAdd().
Referenced by llvm::InstCombinerImpl::visitGEPOfGEP().
|
static |
Definition at line 377 of file InstructionCombining.cpp.
References llvm::dyn_cast(), and I.
Referenced by llvm::SDNode::print_details(), llvm::InstCombinerImpl::SimplifyAssociativeOrCommutative(), llvm::InstCombinerImpl::visitLShr(), and llvm::InstCombinerImpl::visitMul().
|
static |
Definition at line 372 of file InstructionCombining.cpp.
References llvm::dyn_cast(), and I.
Referenced by llvm::InstCombinerImpl::commonIDivTransforms(), computeKnownBitsFromCond(), computeKnownBitsFromICmpCond(), getSmallConstantTripCount(), llvm::ScalarEvolution::isKnownMultipleOf(), isTruePredicate(), llvm::SDNode::print_details(), llvm::InstCombinerImpl::SimplifyAssociativeOrCommutative(), llvm::InstCombinerImpl::visitAShr(), and llvm::InstCombinerImpl::visitLShr().
| INITIALIZE_PASS_BEGIN | ( | InstructionCombiningPass | , |
| "instcombine" | , | ||
| "Combine redundant instructions" | , | ||
| false | , | ||
| false | ) |
References INITIALIZE_PASS_DEPENDENCY.
|
static |
Definition at line 3759 of file InstructionCombining.cpp.
References Access, assert(), llvm::cast(), llvm::dyn_cast(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::getAllocationFamily(), llvm::getFreedOperand(), llvm::User::getOperand(), llvm::LoadInst::getPointerOperand(), llvm::getReallocatedOperand(), I, II, llvm::ICmpInst::isEquality(), llvm::isModSet(), isNeverEqualToUnescapedAlloc(), llvm::isRefSet(), isRemovableWrite(), llvm::LoadInst::isVolatile(), llvm_unreachable, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), MI, llvm::Mod, llvm::ModRef, llvm::NoModRef, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Ref, llvm::Size, TLI, Users, and llvm::Instruction::users().
Referenced by llvm::InstCombinerImpl::visitAllocSite().
|
static |
Return 'true' if the given typeinfo will match anything.
Definition at line 4914 of file InstructionCombining.cpp.
References llvm::CoreCLR, llvm::GNU_Ada, llvm::GNU_C, llvm::GNU_C_SjLj, llvm::GNU_CXX, llvm::GNU_CXX_SjLj, llvm::GNU_ObjC, llvm::isa(), llvm_unreachable, llvm::MSVC_CXX, llvm::MSVC_TableSEH, llvm::MSVC_X86SEH, llvm::Rust, llvm::Unknown, llvm::Wasm_CXX, llvm::Wasm_D, llvm::XL_CXX, and llvm::ZOS_CXX.
Referenced by llvm::InstCombinerImpl::visitLandingPadInst().
|
static |
Definition at line 3726 of file InstructionCombining.cpp.
References llvm::dyn_cast(), llvm::isa(), llvm::isAllocLikeFn(), TLI, and V.
Referenced by isAllocSiteRemovable().
|
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 3738 of file InstructionCombining.cpp.
References llvm::CallBase::doesNotThrow(), llvm::MemoryLocation::getForDest(), llvm::Instruction::isTerminator(), TLI, llvm::Value::use_empty(), and llvm::Instruction::willReturn().
Referenced by isAllocSiteRemovable().
Definition at line 5442 of file InstructionCombining.cpp.
References llvm::isa(), isUsedWithinShuffleVector(), llvm::PatternMatch::m_BitCast(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::match(), and V.
Referenced by isUsedWithinShuffleVector(), and llvm::InstCombinerImpl::visitFreeze().
|
static |
Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".
Definition at line 670 of file InstructionCombining.cpp.
|
static |
Definition at line 344 of file InstructionCombining.cpp.
References B(), C(), llvm::dyn_cast(), I, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), llvm::APInt::sadd_ov(), llvm::APInt::smul_ov(), and llvm::APInt::ssub_ov().
Referenced by llvm::InstCombinerImpl::SimplifyAssociativeOrCommutative().
|
static |
Definition at line 1290 of file InstructionCombining.cpp.
References E(), llvm::equal(), I, LHS, and RHS.
|
static |
Return whether "(X LOp Y) ROp Z" is always equal to "(X ROp Z) LOp (Y ROp Z)".
Definition at line 691 of file InstructionCombining.cpp.
References llvm::Instruction::isBitwiseLogicOp(), llvm::Instruction::isCommutative(), llvm::Instruction::isShift(), and leftDistributesOverRight().
Definition at line 4944 of file InstructionCombining.cpp.
References llvm::cast(), LHS, and RHS.
Referenced by llvm::InstCombinerImpl::visitLandingPadInst().
|
static |
Return true if we should canonicalize the gep to an i8 ptradd.
Definition at line 3253 of file InstructionCombining.cpp.
References llvm::any_of(), llvm::dyn_cast(), GEP, llvm::Type::isIntegerTy(), llvm::Type::isScalableTy(), llvm::PatternMatchHelpers::m_CombineOr(), llvm::PatternMatch::m_ConstantInt(), llvm::PatternMatch::m_Mul(), llvm::MIPatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and V.
Referenced by llvm::InstCombinerImpl::visitGetElementPtrInst().
|
static |
Definition at line 2409 of file InstructionCombining.cpp.
References GEP.
Referenced by llvm::InstCombinerImpl::visitGEPOfGEP().
|
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 386 of file InstructionCombining.cpp.
References C1, llvm::ConstantFoldBinaryOpOperands(), llvm::ConstantFoldCastOperand(), DL, llvm::Instruction::dropPoisonGeneratingFlags(), llvm::dyn_cast(), llvm::InstCombiner::getDataLayout(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Instruction::isBitwiseLogicOp(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::match(), and llvm::InstCombiner::replaceOperand().
Referenced by llvm::InstCombinerImpl::SimplifyAssociativeOrCommutative().
|
static |
Definition at line 1923 of file InstructionCombining.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, DL, llvm::dyn_cast(), llvm::ConstantInt::getBool(), llvm::ICmpInst::getCmpPredicate(), llvm::CondBrInst::getCondition(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::CondBrInst::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::SimplifyQuery::getWithInstruction(), I, llvm::isImpliedCondition(), llvm::PatternMatch::m_ConstantExpr(), llvm::PatternMatch::match(), and llvm::simplifyInstructionWithOperands().
Referenced by llvm::InstCombinerImpl::foldOpIntoPhi().
|
static |
Definition at line 1823 of file InstructionCombining.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, llvm::Constant::getNullValue(), I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::isGuaranteedNotToBeUndefOrPoison(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificICmp(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::simplifyInstructionWithOperands(), and V.
Referenced by llvm::InstCombinerImpl::FoldOpIntoSelect().
|
static |
Definition at line 4459 of file InstructionCombining.cpp.
References C(), llvm::ConstantRange::contains(), llvm::dyn_cast(), llvm::CmpInst::getInversePredicate(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::ConstantRange::makeExactICmpRegion(), llvm::PatternMatch::match(), Pred, Select, and X.
Referenced by llvm::InstCombinerImpl::visitSwitchInst().
|
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 5571 of file InstructionCombining.cpp.
References llvm::cast(), llvm::dyn_cast(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::MemoryLocation::getForDest(), llvm::getUnderlyingObject(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::isa(), llvm::SmallVectorImpl< T >::pop_back_val(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and TLI.
Referenced by llvm::InstCombinerImpl::tryToSinkInstruction().
| STATISTIC | ( | NumCombined | , |
| "Number of insts combined" | ) |
| STATISTIC | ( | NumConstProp | , |
| "Number of constant folds" | ) |
| STATISTIC | ( | NumDeadInst | , |
| "Number of dead inst eliminated" | ) |
| STATISTIC | ( | NumExpand | , |
| "Number of expansions" | ) |
| STATISTIC | ( | NumFactor | , |
| "Number of factorizations" | ) |
| STATISTIC | ( | NumFourOrMoreIterations | , |
| "Number of functions with four or more iterations" | ) |
| STATISTIC | ( | NumOneIteration | , |
| "Number of functions with one iteration" | ) |
| STATISTIC | ( | NumReassoc | , |
| "Number of reassociations" | ) |
| STATISTIC | ( | NumSunkInst | , |
| "Number of instructions sunk" | ) |
| STATISTIC | ( | NumThreeIterations | , |
| "Number of functions with three iterations" | ) |
| STATISTIC | ( | NumTwoIterations | , |
| "Number of functions with two iterations" | ) |
| STATISTIC | ( | NumWorklistIterations | , |
| "Number of instruction combining iterations performed" | ) |
|
static |
This tries to simplify binary operations by factorizing out common terms (e.
g. "(A*B)+(A*C)" -> "A*(B+C)").
Definition at line 747 of file InstructionCombining.cpp.
References A(), assert(), B(), C(), llvm::cast(), D(), llvm::dyn_cast(), llvm::SimplifyQuery::getWithInstruction(), I, llvm::isa(), llvm::Instruction::isCommutative(), llvm::APInt::isMinSignedValue(), leftDistributesOverRight(), LHS, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), RHS, rightDistributesOverLeft(), llvm::simplifyBinOp(), std::swap(), llvm::Value::takeName(), and V.
Referenced by llvm::InstCombinerImpl::tryFactorizationFolds().
|
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.:
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 4078 of file InstructionCombining.cpp.
References assert(), DL, llvm::dyn_cast(), llvm::CallBase::getArgOperand(), llvm::CallBase::getAttributes(), llvm::Value::getContext(), llvm::Attribute::getDereferenceableBytes(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSinglePredecessor(), llvm::BasicBlock::getTerminator(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::isa(), llvm::Attribute::isValid(), llvm::PatternMatch::m_Br(), llvm::PatternMatchHelpers::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(), Pred, llvm::CallBase::setAttributes(), llvm::BasicBlock::size(), and uint64_t.
Referenced by llvm::InstCombinerImpl::visitFree().
| Combine redundant false |
Definition at line 6458 of file InstructionCombining.cpp.
| instcombine |
Definition at line 6457 of file InstructionCombining.cpp.
| Combine redundant instructions |
Definition at line 6458 of file InstructionCombining.cpp.