LLVM 20.0.0git
|
#include "InstCombineInternal.h"
#include "llvm/Analysis/CmpInstAnalysis.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
#include "llvm/Transforms/Utils/Local.h"
Go to the source code of this file.
Classes | |
struct | IntPart |
Macros | |
#define | DEBUG_TYPE "instcombine" |
Enumerations | |
enum | MaskedICmpType { AMask_AllOnes = 1 , AMask_NotAllOnes = 2 , BMask_AllOnes = 4 , BMask_NotAllOnes = 8 , Mask_AllZeros = 16 , Mask_NotAllZeros = 32 , AMask_Mixed = 64 , AMask_NotMixed = 128 , BMask_Mixed = 256 , BMask_NotMixed = 512 } |
Classify (icmp eq (A & B), C) and (icmp ne (A & B), C) as matching patterns that can be simplified. More... | |
Functions | |
static Value * | getNewICmpValue (unsigned Code, bool Sign, Value *LHS, Value *RHS, InstCombiner::BuilderTy &Builder) |
This is the complement of getICmpCode, which turns an opcode and two operands into either a constant true or false, or a brand new ICmp instruction. | |
static Value * | getFCmpValue (unsigned Code, Value *LHS, Value *RHS, InstCombiner::BuilderTy &Builder) |
This is the complement of getFCmpCode, which turns an opcode and two operands into either a FCmp instruction, or a true/false constant. | |
static unsigned | getMaskedICmpType (Value *A, Value *B, Value *C, ICmpInst::Predicate Pred) |
Return the set of patterns (from MaskedICmpType) that (icmp SCC (A & B), C) satisfies. | |
static unsigned | conjugateICmpMask (unsigned Mask) |
Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite sense. | |
static bool | decomposeBitTestICmp (Value *LHS, Value *RHS, CmpInst::Predicate &Pred, Value *&X, Value *&Y, Value *&Z) |
static std::optional< std::pair< unsigned, unsigned > > | getMaskedTypeForICmpPair (Value *&A, Value *&B, Value *&C, Value *&D, Value *&E, ICmpInst *LHS, ICmpInst *RHS, ICmpInst::Predicate &PredL, ICmpInst::Predicate &PredR) |
Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E). | |
static Value * | foldLogOpOfMaskedICmps_NotAllZeros_BMask_Mixed (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, Value *A, Value *B, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, InstCombiner::BuilderTy &Builder) |
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y), where the left-hand side is of type Mask_NotAllZeros and the right hand side is of type BMask_Mixed. | |
static Value * | foldLogOpOfMaskedICmpsAsymmetric (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, Value *A, Value *B, Value *C, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, unsigned LHSMask, unsigned RHSMask, InstCombiner::BuilderTy &Builder) |
Try to fold (icmp(A & B) ==/!= 0) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y), where the left-hand side and the right hand side aren't of the common mask pattern type. | |
static Value * | foldLogOpOfMaskedICmps (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, bool IsLogical, InstCombiner::BuilderTy &Builder) |
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y). | |
static Value * | foldAndOrOfICmpsWithPow2AndWithZero (InstCombiner::BuilderTy &Builder, ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, const SimplifyQuery &Q) |
static Value * | foldSignedTruncationCheck (ICmpInst *ICmp0, ICmpInst *ICmp1, Instruction &CxtI, InstCombiner::BuilderTy &Builder) |
General pattern: X & Y. | |
static Value * | foldIsPowerOf2OrZero (ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd, InstCombiner::BuilderTy &Builder) |
Fold (icmp eq ctpop(X) 1) | (icmp eq X 0) into (icmp ult ctpop(X) 2) and fold (icmp ne ctpop(X) 1) & (icmp ne X 0) into (icmp ugt ctpop(X) 1). | |
static Value * | foldIsPowerOf2 (ICmpInst *Cmp0, ICmpInst *Cmp1, bool JoinedByAnd, InstCombiner::BuilderTy &Builder) |
Reduce a pair of compares that check if a value has exactly 1 bit set. | |
static Value * | foldNegativePower2AndShiftedMask (Value *A, Value *B, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, InstCombiner::BuilderTy &Builder) |
Try to fold (icmp(A & B) == 0) & (icmp(A & D) != E) into (icmp A u< D) iff B is a contiguous set of ones starting from the most significant bit (negative power of 2), D and E are equal, and D is a contiguous set of ones starting at the most significant zero bit in B. | |
static Value * | foldPowerOf2AndShiftedMask (ICmpInst *Cmp0, ICmpInst *Cmp1, bool JoinedByAnd, InstCombiner::BuilderTy &Builder) |
Try to fold ((icmp X u< P) & (icmp(X & M) != M)) or ((icmp X s> -1) & (icmp(X & M) != M)) into (icmp X u< M). | |
static Value * | foldUnsignedUnderflowCheck (ICmpInst *ZeroICmp, ICmpInst *UnsignedICmp, bool IsAnd, const SimplifyQuery &Q, InstCombiner::BuilderTy &Builder) |
Commuted variants are assumed to be handled by calling this function again with the parameters swapped. | |
static std::optional< IntPart > | matchIntPart (Value *V) |
Match an extraction of bits from an integer. | |
static Value * | extractIntPart (const IntPart &P, IRBuilderBase &Builder) |
Materialize an extraction of bits from an integer in IR. | |
static Value * | foldAndOrOfICmpsWithConstEq (ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd, bool IsLogical, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q) |
Reduce logic-of-compares with equality to a constant by substituting a common operand with the constant. | |
static Value * | stripSignOnlyFPOps (Value *Val) |
Ignore all operations which only change the sign of a value, returning the underlying magnitude value. | |
static bool | matchIsNotNaN (FCmpInst::Predicate P, Value *LHS, Value *RHS) |
Matches canonical form of isnan, fcmp ord x, 0. | |
static bool | matchUnorderedInfCompare (FCmpInst::Predicate P, Value *LHS, Value *RHS) |
Matches fcmp u__ x, +/-inf. | |
static Value * | matchIsFiniteTest (InstCombiner::BuilderTy &Builder, FCmpInst *LHS, FCmpInst *RHS) |
and (fcmp ord x, 0), (fcmp u* x, inf) -> fcmp o* x, inf | |
static bool | matchIsFPClassLikeFCmp (Value *Op, Value *&ClassVal, uint64_t &ClassMask) |
Match an fcmp against a special value that performs a test possible by llvm.is.fpclass. | |
static Instruction * | reassociateFCmps (BinaryOperator &BO, InstCombiner::BuilderTy &Builder) |
This a limited reassociation for a special case (see above) where we are checking if two values are either both NAN (unordered) or not-NAN (ordered). | |
static Instruction * | matchDeMorgansLaws (BinaryOperator &I, InstCombiner &IC) |
Match variations of De Morgan's Laws: (~A & ~B) == (~(A | B)) (~A | ~B) == (~(A & B)) | |
static Instruction * | foldLogicCastConstant (BinaryOperator &Logic, CastInst *Cast, InstCombinerImpl &IC) |
Fold {and,or,xor} (cast X), C. | |
static Instruction * | foldAndToXor (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | foldOrToXor (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static bool | canNarrowShiftAmt (Constant *C, unsigned BitWidth) |
Return true if a constant shift amount is always less than the specified bit-width. | |
static Instruction * | foldComplexAndOrPatterns (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Try folding relatively complex patterns for both And and Or operations with all And and Or swapped. | |
static Instruction * | reassociateForUses (BinaryOperator &BO, InstCombinerImpl::BuilderTy &Builder) |
Try to reassociate a pair of binops so that values with one use only are part of the same instruction. | |
static Instruction * | canonicalizeLogicFirst (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | foldBitwiseLogicWithIntrinsics (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Value * | simplifyAndOrWithOpReplaced (Value *V, Value *Op, Value *RepOp, bool SimplifyOnly, InstCombinerImpl &IC, unsigned Depth=0) |
static Instruction * | matchFunnelShift (Instruction &Or, InstCombinerImpl &IC) |
Match UB-safe variants of the funnel shift intrinsic. | |
static Instruction * | matchOrConcat (Instruction &Or, InstCombiner::BuilderTy &Builder) |
Attempt to combine or(zext(x),shl(zext(y),bw/2) concat packing patterns. | |
static bool | areInverseVectorBitmasks (Constant *C1, Constant *C2) |
If all elements of two constant vectors are 0/-1 and inverses, return true. | |
static Value * | foldAndOrOfICmpEqConstantAndICmp (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, bool IsLogical, IRBuilderBase &Builder) |
static Value * | foldOrOfInversions (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | foldXorToXor (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
A ^ B can be specified using other logic ops in a variety of patterns. | |
static Instruction * | visitMaskedMerge (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
If we have a masked merge, in the canonical form of: (assuming that A only has one use.) | A | |B| ((x ^ y) & M) ^ y | D |. | |
static Instruction * | foldNotXor (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | canonicalizeAbs (BinaryOperator &Xor, InstCombiner::BuilderTy &Builder) |
Canonicalize a shifty way to code absolute value to the more common pattern that uses negation and select. | |
static bool | canFreelyInvert (InstCombiner &IC, Value *Op, Instruction *IgnoredUser) |
static Value * | freelyInvert (InstCombinerImpl &IC, Value *Op, Instruction *IgnoredUser) |
#define DEBUG_TYPE "instcombine" |
Definition at line 25 of file InstCombineAndOrXor.cpp.
enum MaskedICmpType |
Classify (icmp eq (A & B), C) and (icmp ne (A & B), C) as matching patterns that can be simplified.
One of A and B is considered the mask. The other is the value. This is described as the "AMask" or "BMask" part of the enum. If the enum contains only "Mask", then both A and B can be considered masks. If A is the mask, then it was proven that (A & C) == C. This is trivial if C == A or C == 0. If both A and C are constants, this proof is also easy. For the following explanations, we assume that A is the mask.
"AllOnes" declares that the comparison is true only if (A & B) == A or all bits of A are set in B. Example: (icmp eq (A & 3), 3) -> AMask_AllOnes
"AllZeros" declares that the comparison is true only if (A & B) == 0 or all bits of A are cleared in B. Example: (icmp eq (A & 3), 0) -> Mask_AllZeroes
"Mixed" declares that (A & B) == C and C might or might not contain any number of one bits and zero bits. Example: (icmp eq (A & 3), 1) -> AMask_Mixed
"Not" means that in above descriptions "==" should be replaced by "!=". Example: (icmp ne (A & 3), 3) -> AMask_NotAllOnes
If the mask A contains a single bit, then the following is equivalent: (icmp eq (A & B), A) equals (icmp ne (A & B), 0) (icmp ne (A & B), A) equals (icmp eq (A & B), 0)
Enumerator | |
---|---|
AMask_AllOnes | |
AMask_NotAllOnes | |
BMask_AllOnes | |
BMask_NotAllOnes | |
Mask_AllZeros | |
Mask_NotAllZeros | |
AMask_Mixed | |
AMask_NotMixed | |
BMask_Mixed | |
BMask_NotMixed |
Definition at line 103 of file InstCombineAndOrXor.cpp.
If all elements of two constant vectors are 0/-1 and inverses, return true.
Definition at line 3101 of file InstCombineAndOrXor.cpp.
References llvm::Constant::getAggregateElement(), llvm::Value::getType(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_Zero(), and llvm::PatternMatch::match().
|
static |
Definition at line 4346 of file InstCombineAndOrXor.cpp.
References llvm::InstCombiner::canFreelyInvertAllUsersOf(), I, and llvm::InstCombiner::isFreeToInvert().
Referenced by llvm::InstCombinerImpl::sinkNotIntoLogicalOp(), and llvm::InstCombinerImpl::sinkNotIntoOtherHandOfLogicalOp().
Return true if a constant shift amount is always less than the specified bit-width.
If not, the shift could create poison in the narrower type.
Definition at line 1912 of file InstCombineAndOrXor.cpp.
References llvm::BitWidth, llvm::CallingConv::C, llvm::CmpInst::ICMP_ULT, llvm::PatternMatch::m_SpecificInt_ICMP(), and llvm::PatternMatch::match().
|
static |
Canonicalize a shifty way to code absolute value to the more common pattern that uses negation and select.
Definition at line 4314 of file InstCombineAndOrXor.cpp.
References A, llvm::Add, assert(), llvm::SelectInst::Create(), llvm::IRBuilderBase::CreateIsNeg(), llvm::IRBuilderBase::CreateNeg(), llvm::Constant::getNullValue(), llvm::Type::getScalarSizeInBits(), llvm::Value::hasNUses(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_AShr(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), std::swap(), and llvm::Xor.
Referenced by llvm::InstCombinerImpl::visitXor().
|
static |
Definition at line 2136 of file InstCombineAndOrXor.cpp.
References llvm::CallingConv::C, llvm::APInt::countr_zero(), llvm::IRBuilderBase::CreateBinOp(), llvm::BinaryOperator::CreateWithCopiedFlags(), llvm::Type::getScalarSizeInBits(), I, llvm_unreachable, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and X.
Referenced by llvm::InstCombinerImpl::visitAnd(), llvm::InstCombinerImpl::visitOr(), and llvm::InstCombinerImpl::visitXor().
Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite sense.
Since each "NotXXX" flag (recording !=) is adjacent to the corresponding normal flag (recording ==), this just involves swapping those bits over.
Definition at line 168 of file InstCombineAndOrXor.cpp.
References AMask_AllOnes, AMask_Mixed, AMask_NotAllOnes, AMask_NotMixed, BMask_AllOnes, BMask_Mixed, BMask_NotAllOnes, BMask_NotMixed, Mask_AllZeros, and Mask_NotAllZeros.
Referenced by foldLogOpOfMaskedICmps(), and foldLogOpOfMaskedICmpsAsymmetric().
|
static |
Definition at line 182 of file InstCombineAndOrXor.cpp.
References llvm::decomposeBitTestICmp(), LHS, RHS, X, and Y.
|
static |
Materialize an extraction of bits from an integer in IR.
Definition at line 1146 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateLShr(), llvm::IRBuilderBase::CreateTrunc(), and P.
|
static |
Definition at line 3240 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateFreeze(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateSub(), llvm::Value::getType(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::Type::isIntOrIntVectorTy(), llvm::APInt::isZero(), LHS, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APIntAllowPoison(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificIntAllowPoison(), llvm::PatternMatch::match(), llvm::Other, and RHS.
|
static |
Reduce logic-of-compares with equality to a constant by substituting a common operand with the constant.
Callers are expected to call this with Cmp0/Cmp1 switched to handle logic op commutativity.
Definition at line 1232 of file InstCombineAndOrXor.cpp.
References llvm::CallingConv::C, llvm::IRBuilderBase::CreateBinOp(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateLogicalAnd(), llvm::IRBuilderBase::CreateLogicalOr(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::isGuaranteedNotToBeUndefOrPoison(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::simplifyICmpInst(), X, and Y.
|
static |
Definition at line 727 of file InstCombineAndOrXor.cpp.
References llvm::SimplifyQuery::AC, llvm::And, llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateICmp(), llvm::SimplifyQuery::CxtI, llvm::SimplifyQuery::DL, llvm::SimplifyQuery::DT, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::isKnownToBeAPowerOfTwo(), LHS, llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), RHS, and std::swap().
|
static |
Definition at line 1850 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateXor(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitAnd().
|
static |
Definition at line 2224 of file InstCombineAndOrXor.cpp.
References assert(), llvm::APInt::byteSwap(), llvm::CallInst::Create(), llvm::IRBuilderBase::CreateBinOp(), F, llvm::Intrinsic::getDeclaration(), I, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::match(), llvm::APInt::reverseBits(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAnd(), llvm::InstCombinerImpl::visitOr(), and llvm::InstCombinerImpl::visitXor().
|
static |
Try folding relatively complex patterns for both And and Or operations with all And and Or swapped.
Definition at line 1960 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::CallingConv::C, llvm::BinaryOperator::Create(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateBinOp(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateNot(), llvm::IRBuilderBase::CreateOr(), llvm::IRBuilderBase::CreateXor(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_c_Xor(), llvm::PatternMatch::m_CombineAnd(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Or, X, llvm::Xor, and Y.
Referenced by llvm::InstCombinerImpl::visitAnd(), and llvm::InstCombinerImpl::visitOr().
|
static |
Reduce a pair of compares that check if a value has exactly 1 bit set.
Also used for logical and/or, must be poison safe.
Definition at line 948 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateICmpEQ(), llvm::IRBuilderBase::CreateICmpNE(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificICmp(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZeroInt(), llvm::PatternMatch::match(), std::swap(), and X.
|
static |
Fold (icmp eq ctpop(X) 1) | (icmp eq X 0) into (icmp ult ctpop(X) 2) and fold (icmp ne ctpop(X) 1) & (icmp ne X 0) into (icmp ugt ctpop(X) 1).
Also used for logical and/or, must be poison safe.
Definition at line 928 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateICmpUGT(), llvm::IRBuilderBase::CreateICmpULT(), llvm::User::getOperand(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZeroInt(), llvm::PatternMatch::match(), and X.
|
static |
Fold {and,or,xor} (cast X), C.
Definition at line 1718 of file InstCombineAndOrXor.cpp.
References llvm::InstCombiner::Builder, llvm::CallingConv::C, llvm::IRBuilderBase::CreateBinOp(), llvm::InstCombinerImpl::getLosslessSignedTrunc(), llvm::InstCombinerImpl::getLosslessUnsignedTrunc(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::CastInst::getSrcTy(), llvm::Value::getType(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_SExtLike(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), and X.
|
static |
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y).
Definition at line 501 of file InstCombineAndOrXor.cpp.
References A, AMask_AllOnes, AMask_NotAllOnes, assert(), B, BMask_AllOnes, BMask_Mixed, BMask_NotAllOnes, BMask_NotMixed, llvm::CallingConv::C, CC, conjugateICmpMask(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateICmp(), llvm::IRBuilderBase::CreateOr(), D, foldLogOpOfMaskedICmpsAsymmetric(), llvm::CmpInst::getInversePredicate(), getMaskedTypeForICmpPair(), llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::ICmpInst::isEquality(), llvm::isGuaranteedNotToBeUndefOrPoison(), llvm::APInt::isSubsetOf(), LHS, llvm::PatternMatch::m_APInt(), Mask_AllZeros, Mask_NotAllZeros, llvm::PatternMatch::match(), and RHS.
|
static |
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y), where the left-hand side is of type Mask_NotAllZeros and the right hand side is of type BMask_Mixed.
For example, (icmp (A & 12) != 0) & (icmp (A & 15) == 8) -> (icmp (A & 15) == 8). Also used for logical and/or, must be poison safe.
Definition at line 328 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::APFloat::bitcastToAPInt(), llvm::APInt::clearSignBit(), llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateFCmp(), llvm::IRBuilderBase::CreateICmp(), D, llvm::CmpInst::FCMP_ORD, llvm::CmpInst::FCMP_UNO, llvm::Type::getFltSemantics(), llvm::APFloat::getInf(), llvm::IRBuilderBase::GetInsertBlock(), llvm::BasicBlock::getParent(), llvm::Value::getType(), llvm::ConstantFP::getZero(), llvm::Function::hasFnAttribute(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::APInt::intersects(), llvm::Type::isIEEELikeFPTy(), llvm::APInt::isZero(), LHS, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ElementWiseBitCast(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and RHS.
Referenced by foldLogOpOfMaskedICmpsAsymmetric().
|
static |
Try to fold (icmp(A & B) ==/!= 0) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y), where the left-hand side and the right hand side aren't of the common mask pattern type.
Also used for logical and/or, must be poison safe.
Definition at line 470 of file InstCombineAndOrXor.cpp.
References A, assert(), B, BMask_Mixed, llvm::CallingConv::C, conjugateICmpMask(), D, foldLogOpOfMaskedICmps_NotAllZeros_BMask_Mixed(), llvm::ICmpInst::isEquality(), LHS, Mask_NotAllZeros, and RHS.
Referenced by foldLogOpOfMaskedICmps().
|
static |
Try to fold (icmp(A & B) == 0) & (icmp(A & D) != E) into (icmp A u< D) iff B is a contiguous set of ones starting from the most significant bit (negative power of 2), D and E are equal, and D is a contiguous set of ones starting at the most significant zero bit in B.
Parameter B supports masking using undef/poison in either scalar or vector values.
Definition at line 983 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::APInt::countLeadingOnes(), llvm::APInt::countLeadingZeros(), llvm::IRBuilderBase::CreateICmp(), D, I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_ULT, llvm::ICmpInst::isEquality(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_APIntAllowPoison(), llvm::PatternMatch::m_NegatedPower2(), llvm::PatternMatch::m_ShiftedMask(), and llvm::PatternMatch::match().
Referenced by foldPowerOf2AndShiftedMask().
|
static |
Definition at line 4280 of file InstCombineAndOrXor.cpp.
References A, B, llvm::CallingConv::C, llvm::IRBuilderBase::CreateNot(), D, I, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::PatternMatch::match(), X, and Y.
|
static |
Definition at line 3486 of file InstCombineAndOrXor.cpp.
References assert(), llvm::IRBuilderBase::CreateXor(), I, llvm::isKnownInversion(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitOr().
|
static |
Definition at line 1876 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::IRBuilderBase::CreateAnd(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateXor(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitOr().
|
static |
Try to fold ((icmp X u< P) & (icmp(X & M) != M)) or ((icmp X s> -1) & (icmp(X & M) != M)) into (icmp X u< M).
Where P is a power of 2, M < P, and M is a contiguous shifted mask starting at the right most significant zero bit in P. SGT is supported as when P is the largest representable power of 2, an earlier optimization converts the expression into (icmp X s> -1). Parameter P supports masking using undef/poison in either scalar or vector values.
Definition at line 1049 of file InstCombineAndOrXor.cpp.
References A, B, BMask_NotAllOnes, BMask_NotMixed, llvm::CallingConv::C, D, foldNegativePower2AndShiftedMask(), getMaskedTypeForICmpPair(), llvm::CmpInst::getPredicate(), and Mask_AllZeros.
|
static |
General pattern: X & Y.
Where Y is checking that all the high bits (covered by a mask 4294967168) are uniform, i.e. arg & 4294967168 can be either 4294967168 or 0 Pattern can be one of: t = add i32 arg, 128 r = icmp ult i32 t, 256 Or t0 = shl i32 arg, 24 t1 = ashr i32 t0, 24 r = icmp eq i32 t1, arg Or t0 = trunc i32 arg to i8 t1 = sext i8 t0 to i32 r = icmp eq i32 t1, arg This pattern is a signed truncation check.
And X is checking that some bit in that same mask is zero. I.e. can be one of: r = icmp sgt i32 arg, -1 Or t = and i32 arg, 2147483648 r = icmp eq i32 t, 0
Since we are checking that all the bits in that mask are the same, and a particular bit is zero, what we are really checking is that all the masked bits are zero. So this should be transformed to: r = icmp ult i32 arg, 128
Definition at line 831 of file InstCombineAndOrXor.cpp.
References assert(), llvm::IRBuilderBase::CreateICmpULT(), llvm::decomposeBitTestICmp(), llvm::Value::getName(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_ULT, llvm::APInt::intersects(), llvm::APInt::isPowerOf2(), llvm::APInt::isSubsetOf(), llvm::APInt::isZero(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificICmp(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::APInt::shl(), llvm::APIntOps::umin(), X, and llvm::APInt::zext().
|
static |
Commuted variants are assumed to be handled by calling this function again with the parameters swapped.
Definition at line 1082 of file InstCombineAndOrXor.cpp.
References A, B, llvm::IRBuilderBase::CreateICmpUGE(), llvm::IRBuilderBase::CreateICmpULT(), llvm::IRBuilderBase::CreateNeg(), llvm::Value::hasOneUse(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_ULT, llvm::ICmpInst::isEquality(), llvm::isKnownNonZero(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_ICmp(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::match(), llvm::Other, and std::swap().
|
static |
A ^ B can be specified using other logic ops in a variety of patterns.
We can fold these early and efficiently by morphing an existing instruction.
Definition at line 4059 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateXor(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Or(), llvm::PatternMatch::m_c_Xor(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitXor().
|
static |
Definition at line 4353 of file InstCombineAndOrXor.cpp.
References llvm::InstCombiner::Builder, llvm::IRBuilderBase::CreateNot(), llvm::InstCombinerImpl::freelyInvertAllUsersOf(), I, and llvm::IRBuilderBase::SetInsertPoint().
Referenced by llvm::InstCombinerImpl::sinkNotIntoLogicalOp(), and llvm::InstCombinerImpl::sinkNotIntoOtherHandOfLogicalOp().
|
static |
This is the complement of getFCmpCode, which turns an opcode and two operands into either a FCmp instruction, or a true/false constant.
Definition at line 41 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateFCmp(), llvm::getPredForFCmpCode(), llvm::Value::getType(), LHS, and RHS.
|
static |
Return the set of patterns (from MaskedICmpType) that (icmp SCC (A & B), C) satisfies.
Definition at line 118 of file InstCombineAndOrXor.cpp.
References A, AMask_AllOnes, AMask_Mixed, AMask_NotAllOnes, AMask_NotMixed, B, BMask_AllOnes, BMask_Mixed, BMask_NotAllOnes, BMask_NotMixed, llvm::CallingConv::C, llvm::CmpInst::ICMP_EQ, llvm::APInt::isPowerOf2(), llvm::APInt::isSubsetOf(), llvm::PatternMatch::m_APInt(), Mask_AllZeros, Mask_NotAllZeros, and llvm::PatternMatch::match().
Referenced by getMaskedTypeForICmpPair().
|
static |
Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E).
Return the pattern classes (from MaskedICmpType) for the left hand side and the right hand side as a pair. LHS and RHS are the left hand side and the right hand side ICmps and PredL and PredR are their predicates, respectively.
Definition at line 198 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::CallingConv::C, D, llvm::decomposeBitTestICmp(), llvm::Constant::getAllOnesValue(), getMaskedICmpType(), llvm::Value::getType(), llvm::ICmpInst::isEquality(), llvm::Type::isIntOrIntVectorTy(), LHS, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), R2, and RHS.
Referenced by foldLogOpOfMaskedICmps(), and foldPowerOf2AndShiftedMask().
|
static |
This is the complement of getICmpCode, which turns an opcode and two operands into either a constant true or false, or a brand new ICmp instruction.
The sign is passed in to determine which kind of predicate to use in the new icmp instruction.
Definition at line 31 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateICmp(), llvm::getPredForICmpCode(), llvm::Value::getType(), LHS, and RHS.
|
static |
Match variations of De Morgan's Laws: (~A & ~B) == (~(A | B)) (~A | ~B) == (~(A & B))
Definition at line 1665 of file InstCombineAndOrXor.cpp.
References A, assert(), B, llvm::InstCombiner::Builder, llvm::CallingConv::C, llvm::BinaryOperator::Create(), llvm::IRBuilderBase::CreateBinOp(), llvm::BinaryOperator::CreateNot(), llvm::IRBuilderBase::CreateNot(), I, llvm::InstCombiner::isFreeToInvert(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitAnd(), and llvm::InstCombinerImpl::visitOr().
|
static |
Match UB-safe variants of the funnel shift intrinsic.
Definition at line 3037 of file InstCombineAndOrXor.cpp.
References llvm::InstCombinerImpl::convertOrOfShiftsToFunnelShift(), llvm::CallInst::Create(), F, llvm::Intrinsic::getDeclaration(), and llvm::Or.
Referenced by foldGuardedFunnelShift(), and llvm::InstCombinerImpl::visitOr().
Match an extraction of bits from an integer.
Definition at line 1128 of file InstCombineAndOrXor.cpp.
References llvm::APInt::getZExtValue(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::APInt::ule(), X, and Y.
|
static |
and (fcmp ord x, 0), (fcmp u* x, inf) -> fcmp o* x, inf
Clang emits this pattern for doing an isfinite check in __builtin_isnormal.
Definition at line 1370 of file InstCombineAndOrXor.cpp.
References llvm::IRBuilderBase::CreateFCmp(), llvm::CmpInst::getOrderedPredicate(), LHS, matchIsNotNaN(), matchUnorderedInfCompare(), RHS, and llvm::IRBuilderBase::setFastMathFlags().
Match an fcmp against a special value that performs a test possible by llvm.is.fpclass.
Definition at line 1519 of file InstCombineAndOrXor.cpp.
References llvm::fcmpToClassTest().
Matches canonical form of isnan, fcmp ord x, 0.
Definition at line 1357 of file InstCombineAndOrXor.cpp.
References llvm::CmpInst::FCMP_ORD, llvm::PatternMatch::m_AnyZeroFP(), llvm::PatternMatch::match(), P, and RHS.
Referenced by matchIsFiniteTest().
|
static |
Attempt to combine or(zext(x),shl(zext(y),bw/2) concat packing patterns.
Definition at line 3048 of file InstCombineAndOrXor.cpp.
References assert(), llvm::CallingConv::C, llvm::IRBuilderBase::CreateCall(), llvm::IRBuilderBase::CreateOr(), llvm::IRBuilderBase::CreateShl(), llvm::IRBuilderBase::CreateZExt(), F, llvm::Intrinsic::getDeclaration(), llvm::Type::getScalarSizeInBits(), llvm::Value::getType(), llvm::Hi, llvm::Lo, llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_BitReverse(), llvm::PatternMatch::m_BSwap(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::Or, and std::swap().
Referenced by llvm::InstCombinerImpl::visitOr().
Matches fcmp u__ x, +/-inf.
Definition at line 1362 of file InstCombineAndOrXor.cpp.
References llvm::CmpInst::isUnordered(), llvm::PatternMatch::m_Inf(), llvm::PatternMatch::match(), P, and RHS.
Referenced by matchIsFiniteTest().
|
static |
This a limited reassociation for a special case (see above) where we are checking if two values are either both NAN (unordered) or not-NAN (ordered).
This could be handled more generally in '-reassociation', but it seems like an unlikely pattern for a large number of logic ops and fcmps.
Definition at line 1621 of file InstCombineAndOrXor.cpp.
References assert(), llvm::BinaryOperator::Create(), llvm::IRBuilderBase::CreateFCmp(), llvm::CmpInst::FCMP_ORD, llvm::CmpInst::FCMP_UNO, llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::PatternMatch::m_AnyZeroFP(), llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_FCmp(), llvm::PatternMatch::m_SpecificFCmp(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), std::swap(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAnd(), and llvm::InstCombinerImpl::visitOr().
|
static |
Try to reassociate a pair of binops so that values with one use only are part of the same instruction.
This may enable folds that are limited with multi-use restrictions and makes it more likely to match other patterns that are looking for a common operand.
Definition at line 2103 of file InstCombineAndOrXor.cpp.
References llvm::BinaryOperator::Create(), llvm::IRBuilderBase::CreateBinOp(), llvm::BinaryOperator::getOpcode(), llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAnd(), llvm::InstCombinerImpl::visitOr(), and llvm::InstCombinerImpl::visitXor().
|
static |
Definition at line 2277 of file InstCombineAndOrXor.cpp.
References llvm::InstCombiner::Builder, llvm::IRBuilderBase::CreateBinOp(), llvm::Depth, llvm::InstCombiner::getSimplifyQuery(), llvm::SimplifyQuery::getWithInstruction(), I, simplifyAndOrWithOpReplaced(), and llvm::simplifyBinOp().
Referenced by simplifyAndOrWithOpReplaced(), llvm::InstCombinerImpl::visitAnd(), and llvm::InstCombinerImpl::visitOr().
Ignore all operations which only change the sign of a value, returning the underlying magnitude value.
Definition at line 1349 of file InstCombineAndOrXor.cpp.
References llvm::PatternMatch::m_CopySign(), llvm::PatternMatch::m_FAbs(), llvm::PatternMatch::m_FNeg(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
|
static |
If we have a masked merge, in the canonical form of: (assuming that A only has one use.) | A | |B| ((x ^ y) & M) ^ y | D |.
Definition at line 4247 of file InstCombineAndOrXor.cpp.
References B, llvm::CallingConv::C, llvm::IRBuilderBase::CreateAnd(), llvm::IRBuilderBase::CreateNot(), D, llvm::Constant::getAllOnesValue(), I, LHS, llvm::PatternMatch::m_c_And(), llvm::PatternMatch::m_c_Xor(), llvm::PatternMatch::m_CombineAnd(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::Constant::replaceUndefsWith(), RHS, and X.
Referenced by llvm::InstCombinerImpl::visitXor().