LLVM  4.0.0
Macros | Enumerations | Functions
InstCombineAndOrXor.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Transforms/Utils/CmpInstAnalysis.h"
#include "llvm/Transforms/Utils/Local.h"
Include dependency graph for InstCombineAndOrXor.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "instcombine"
 

Enumerations

enum  MaskedICmpType {
  FoldMskICmp_AMask_AllOnes = 1, FoldMskICmp_AMask_NotAllOnes = 2, FoldMskICmp_BMask_AllOnes = 4, FoldMskICmp_BMask_NotAllOnes = 8,
  FoldMskICmp_Mask_AllZeroes = 16, FoldMskICmp_Mask_NotAllZeroes = 32, FoldMskICmp_AMask_Mixed = 64, FoldMskICmp_AMask_NotMixed = 128,
  FoldMskICmp_BMask_Mixed = 256, FoldMskICmp_BMask_NotMixed = 512
}
 enum for classifying (icmp eq (A & B), C) and (icmp ne (A & B), C) One of A and B is considered the mask, the other the value. More...
 

Functions

static Valuedyn_castNotVal (Value *V)
 
static unsigned getFCmpCode (FCmpInst::Predicate CC)
 Similar to getICmpCode but for FCmpInst. More...
 
static ValuegetNewICmpValue (bool Sign, unsigned Code, 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. More...
 
static ValuegetFCmpValue (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. More...
 
static bool isRunOfOnes (ConstantInt *Val, uint32_t &MB, uint32_t &ME)
 Returns true iff Val consists of one contiguous run of 1s with any number of 0s on either side. More...
 
static unsigned getTypeOfMaskedICmp (Value *A, Value *B, Value *C, ICmpInst::Predicate SCC)
 Return the set of pattern classes (from MaskedICmpType) that (icmp SCC (A & B), C) satisfies. More...
 
static unsigned conjugateICmpMask (unsigned Mask)
 Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite sense. More...
 
static unsigned foldLogOpOfMaskedICmpsHelper (Value *&A, Value *&B, Value *&C, Value *&D, Value *&E, ICmpInst *LHS, ICmpInst *RHS, ICmpInst::Predicate &LHSCC, ICmpInst::Predicate &RHSCC)
 Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) Return the set of pattern classes (from MaskedICmpType) that both LHS and RHS satisfy. More...
 
static ValuefoldLogOpOfMaskedICmps (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, llvm::InstCombiner::BuilderTy *Builder)
 Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y). More...
 
static InstructionmatchDeMorgansLaws (BinaryOperator &I, InstCombiner::BuilderTy *Builder)
 Match De Morgan's Laws: (~A & ~B) == (~(A | B)) (~A | ~B) == (~(A & B)) More...
 
static InstructionfoldLogicCastConstant (BinaryOperator &Logic, CastInst *Cast, InstCombiner::BuilderTy *Builder)
 Fold {and,or,xor} (cast X), C. More...
 
static InstructionfoldBoolSextMaskToSelect (BinaryOperator &I)
 
static bool areInverseVectorBitmasks (Constant *C1, Constant *C2)
 If all elements of two constant vectors are 0/-1 and inverses, return true. More...
 
static ValuegetSelectCondition (Value *A, Value *B, InstCombiner::BuilderTy &Builder)
 We have an expression of the form (A & C) | (B & D). More...
 
static ValuematchSelectFromAndOr (Value *A, Value *C, Value *B, Value *D, InstCombiner::BuilderTy &Builder)
 We have an expression of the form (A & C) | (B & D). More...
 

Macro Definition Documentation

#define DEBUG_TYPE   "instcombine"

Definition at line 24 of file InstCombineAndOrXor.cpp.

Enumeration Type Documentation

enum for classifying (icmp eq (A & B), C) and (icmp ne (A & B), C) One of A and B is considered the mask, the other 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. The part "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) -> FoldMskICmp_AMask_AllOnes The part "AllZeroes" 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) -> FoldMskICmp_Mask_AllZeroes The part "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) -> FoldMskICmp_AMask_Mixed The Part "Not" means, that in above descriptions "==" should be replaced by "!=". Example: (icmp ne (A & 3), 3) -> FoldMskICmp_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
FoldMskICmp_AMask_AllOnes 
FoldMskICmp_AMask_NotAllOnes 
FoldMskICmp_BMask_AllOnes 
FoldMskICmp_BMask_NotAllOnes 
FoldMskICmp_Mask_AllZeroes 
FoldMskICmp_Mask_NotAllZeroes 
FoldMskICmp_AMask_Mixed 
FoldMskICmp_AMask_NotMixed 
FoldMskICmp_BMask_Mixed 
FoldMskICmp_BMask_NotMixed 

Definition at line 399 of file InstCombineAndOrXor.cpp.

Function Documentation

static bool areInverseVectorBitmasks ( Constant C1,
Constant C2 
)
static

If all elements of two constant vectors are 0/-1 and inverses, return true.

Definition at line 1545 of file InstCombineAndOrXor.cpp.

References llvm::Constant::getAggregateElement(), llvm::Value::getType(), llvm::Type::getVectorNumElements(), i, llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_Zero(), and llvm::PatternMatch::match().

Referenced by getSelectCondition().

static unsigned conjugateICmpMask ( unsigned  Mask)
static

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 483 of file InstCombineAndOrXor.cpp.

References FoldMskICmp_AMask_AllOnes, FoldMskICmp_AMask_Mixed, FoldMskICmp_AMask_NotAllOnes, FoldMskICmp_AMask_NotMixed, FoldMskICmp_BMask_AllOnes, FoldMskICmp_BMask_Mixed, FoldMskICmp_BMask_NotAllOnes, FoldMskICmp_BMask_NotMixed, FoldMskICmp_Mask_AllZeroes, and FoldMskICmp_Mask_NotAllZeroes.

Referenced by foldLogOpOfMaskedICmps().

static Value* dyn_castNotVal ( Value V)
inlinestatic
static Instruction* foldBoolSextMaskToSelect ( BinaryOperator I)
static
static Instruction* foldLogicCastConstant ( BinaryOperator Logic,
CastInst Cast,
InstCombiner::BuilderTy Builder 
)
static
static Value* foldLogOpOfMaskedICmps ( ICmpInst LHS,
ICmpInst RHS,
bool  IsAnd,
llvm::InstCombiner::BuilderTy Builder 
)
static
static unsigned foldLogOpOfMaskedICmpsHelper ( Value *&  A,
Value *&  B,
Value *&  C,
Value *&  D,
Value *&  E,
ICmpInst LHS,
ICmpInst RHS,
ICmpInst::Predicate &  LHSCC,
ICmpInst::Predicate &  RHSCC 
)
static

Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) Return the set of pattern classes (from MaskedICmpType) that both LHS and RHS satisfy.

Definition at line 502 of file InstCombineAndOrXor.cpp.

References llvm::decomposeBitTestICmp(), llvm::Constant::getAllOnesValue(), llvm::User::getOperand(), llvm::Value::getType(), getTypeOfMaskedICmp(), llvm::ICmpInst::isEquality(), llvm::Type::isIntegerTy(), llvm::Type::isVectorTy(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and R2.

Referenced by foldLogOpOfMaskedICmps().

static unsigned getFCmpCode ( FCmpInst::Predicate  CC)
static
static Value* getFCmpValue ( unsigned  Code,
Value LHS,
Value RHS,
InstCombiner::BuilderTy Builder 
)
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 81 of file InstCombineAndOrXor.cpp.

References assert(), llvm::IRBuilder< T, Inserter >::CreateFCmp(), llvm::CmpInst::FCMP_FALSE, llvm::CmpInst::FCMP_TRUE, llvm::ConstantInt::get(), llvm::Value::getType(), and llvm::CmpInst::makeCmpResultType().

Referenced by llvm::InstCombiner::FoldAndOfFCmps(), and llvm::InstCombiner::FoldOrOfFCmps().

static Value* getNewICmpValue ( bool  Sign,
unsigned  Code,
Value LHS,
Value RHS,
InstCombiner::BuilderTy Builder 
)
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 71 of file InstCombineAndOrXor.cpp.

References llvm::IRBuilder< T, Inserter >::CreateICmp(), and llvm::getICmpValue().

Referenced by llvm::InstCombiner::FoldAndOfICmps(), llvm::InstCombiner::FoldOrOfICmps(), and llvm::InstCombiner::visitXor().

static Value* getSelectCondition ( Value A,
Value B,
InstCombiner::BuilderTy Builder 
)
static
static unsigned getTypeOfMaskedICmp ( Value A,
Value B,
Value C,
ICmpInst::Predicate  SCC 
)
static
static bool isRunOfOnes ( ConstantInt Val,
uint32_t MB,
uint32_t ME 
)
static

Returns true iff Val consists of one contiguous run of 1s with any number of 0s on either side.

The 1s are allowed to wrap from LSB to MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 0x0F0F0000 is not, since all 1s are not contiguous.

Definition at line 309 of file InstCombineAndOrXor.cpp.

References llvm::APInt::getActiveBits(), llvm::IntegerType::getBitWidth(), llvm::ConstantInt::getType(), llvm::ConstantInt::getValue(), and llvm::APIntOps::isShiftedMask().

static Instruction* matchDeMorgansLaws ( BinaryOperator I,
InstCombiner::BuilderTy Builder 
)
static
static Value* matchSelectFromAndOr ( Value A,
Value C,
Value B,
Value D,
InstCombiner::BuilderTy Builder 
)
static